rb12105

Upload: narendra-mishra

Post on 07-Apr-2018

220 views

Category:

Documents


0 download

TRANSCRIPT

  • 8/6/2019 RB12105

    1/8

    A white paper on Java Database Interaction Mechanism

    Java Database Interaction Mechanism

    Using

    Oracle Reference Cur sors

    By

    Ravi Kumar Bur agapu

    [email protected] Mobile: +91-9845718842

    Abstract: This document describes on a unique mechanism and process that

    enable to make use of Oracle references cursors in Java Database programming

    in developing highly scalable business applications with greater performance.

    About the Author: Ravi Kumar Buragapu is a Technical Lead in Wipro

    Technologies. His interest in IT led him from his Ph.D. in Electronics to object-oriented programming, and then to distributed computing and software

    architecture.

    This document is confidential. The information contained herein is not to be distributed,

    revealed or disseminated outside to any company or any other party without the prior expressed

    consent and written permission of the Author, [email protected]

    Ravi Kumar B Page 1 1/20/2005

    mailto:[email protected]:[email protected]:[email protected]:[email protected]
  • 8/6/2019 RB12105

    2/8

    A white paper on Java Database Interaction Mechanism

    CONTENTS

    Introduct ion ..3

    P u r p o s e . . 3

    S y n o p s i s . . . . 3

    Database Interaction Mechanism ...4

    Conclus ion .. ....8

    Ravi Kumar B Page 2 1/20/2005

  • 8/6/2019 RB12105

    3/8

    A white paper on Java Database Interaction Mechanism

    Introduction

    The conventional approaches in performing Database operations in Java

    through Statement and Prepared Statement etc. are not scalable when they

    require performing complex Database operations on huge data.

    Even though the standard database interaction mechanisms uses the

    connection pooling, the connection objects are not persistent, this leads

    creation of the Prepared Statement in each Database request by sending the

    complete SQLs and their associated parameters to the Database.

    In order to provide solutions to the aggressive business needs it is requiring

    process large and complex Database operations through huge Databases.

    The bets solution to the emerging business needs which require to perform

    huge data transfer through complex Database operations will be through

    Oracle Stored Procedure with Callable Statements. This approach resolves the

    performance issues, but the Stored Procedures are not capable of returning

    the data that can be understandable by Java.

    Purpose

    The purpose of this paper is to describe various the mechanisms that enable to

    make use of Oracle references cursors in Java Database Interaction

    Mechanism.

    Synopsis

    Reference cursors offer the ability to pass the arguments to procedures and

    functions inform of a cursor variable. This approach significantly increases the

    flexibility and scalability of the applications that need to perform huge and

    complex Database operations and data validations.

    In order to make use of the power of Oracle Ref. cursors in Java Database

    programming it require a mechanism that allows the Java to understand the

    ref. cursors that are being returned by the Oracle.

    Ravi Kumar B Page 3 1/20/2005

  • 8/6/2019 RB12105

    4/8

    A white paper on Java Database Interaction Mechanism

    This generic approach allows the developers to explore, use and feel the power

    of Oracle ref. cursors and the tricky logic in using them in Java Database

    programming. This approach will give higher efficiency to the applications by

    increasing the performance with minimal Database errors.

    This suggested mechanism is independent of Application servers, Database

    interaction APIs and connection pooling mechanisms.

    Mechanism

    This section describes on how to define the reference cursors (in a Java

    understandable way) and the way of implementing this mechanism in Java.

    Oracle ref cursors allow you to define queries as stored procedures in the

    Database. They can be used in java by executing a call through a callable

    statement to the stored procedure and casting the returned ref. cursors to

    ResultSet.

    Using the Reference cursors is a bit tricky. The following is the approach that

    allows using the Reference cursors in Java Database programming.

    Here is an example of a Stored Procedure using Ref Cursor.

    /** Package Specification*/

    CREATE OR REPLACE PACKAGE REF_CURSOR_PROCAS

    // Declare reference cursorTYPE CURSOR_TYPE IS REF CURSOR;

    // register all the IN and OUT parameters,// Note: To avoid the sensitivity of java drivers declare the OUT parameters// after the IN parameters

    PROCEDURE getMenu (PRODUCT_TYPE IN VARCHAR2,PRODUCT_CATEGORY IN VARCHAR2,

    PRICE IN VARCHAR2,RESULTS_MENU OUT CURSOR_TYPE

    );End REF_CURSOR_PROC;/

    Ravi Kumar B Page 4 1/20/2005

  • 8/6/2019 RB12105

    5/8

    A white paper on Java Database Interaction Mechanism

    /** Declare Package Body*/

    CREATE OR REPLACE PACKAGE BODY REF_CURSOR_PROC

    AS

    /** Sequence of parameter declaration and signature must be same as* Package specification.*/

    PROCEDURE getSubMenu (PRODUCT_TYPE IN VARCHAR2,PRODUCT_CATEGORY IN VARCHAR2,PRICE IN VARCHAR2,RESULTS_SUB_MENU OUT CURSOR_TYPE

    )ASBEGIN

    /** Opening the reference cursor is very simple by stating a simple open* Statement followed by FOR to hold the out put of the SQL query.*/

    OPEN RESULTS_SUB_MENU FOR

    SELECT PMD.fkmenuid, MM.menuname, MM.cid, MM.SID, MM.hotflag,PMD.amount, PMD.parentmenuid

    FROM packagemenudetails PMD, menumaster MMWHERE PMD.fkmenuid = MM.menuidAND (MM.expiry_date IS NULL OR MM.expiry_date > SYSDATE)AND PMD.parentmenuid = menu_idAND PMD.fkpackageid = package_idAND UPPER (PMD.fklanguageid) LIKE language_idAND UPPER (MM.fkhandsetid) LIKE handset_id

    ORDER BY PMD.menuitemsorder;

    END getSubMenu;

    END REF_CURSOR_PROC;/

    Ravi Kumar B Page 5 1/20/2005

  • 8/6/2019 RB12105

    6/8

    A white paper on Java Database Interaction Mechanism

    Below is the java program that describes on how to use and implement the

    Oracle reference cursors in Java Database programming.

    import java.sql.DriverManager;import java.sql.ResultSet;

    import java.sql.CallableStatement;import java.sql.Connection;import java.sql.SQLException;import oracle.jdbc.driver.*;

    public class RefCursor{

    public static void main(String[] args) throws SQLException,ClassNotFoundException

    {ResultSet cursor = null;Connection con = null;

    CallableStatement cstmt = null;try{

    con = createConnection();cstmt = con.prepareCall ("{call

    RVIDEO_PROC.GET_SUBMENU(?,?,?,?,?)}");cstmt.setString(1, "LG RD2030");cstmt.setString(2, "EN");cstmt.setString(3, "2");cstmt.setString(4, "45");/** This is the way to register the OUT parameter.*/

    cstmt.registerOutParameter(5, OracleTypes.CURSOR);cstmt.execute();

    /** Below is the tricky mechanism to get the ref cursor from Oracle* Stored Procedure.* The most important issue is casting. Casting the Oracle cursor into* java.sql.ResultSet.* When the Oracle Ref Cursor got caste to javas ResultSet, developers* can do all normal ResultSet operations as required.*/

    cursor = ((OracleCallableStatement)cstmt).getCursor(5); while (cursor.next ()) {

    System.out.println ("MENUID : "+cursor.getString(1));System.out.println ("MENUNAME : "+cursor.getString(2));System.out.println ("CID : "+cursor.getString(3));System.out.println ("SID : "+cursor.getString(4));System.out.println ("AMOUNT : "+cursor.getString(6));System.out.println ("-----------------------------------");}

    }catch(Exception e){

    System.out.println("SQL Error : "+e.getMessage());

    }

    Ravi Kumar B Page 6 1/20/2005

  • 8/6/2019 RB12105

    7/8

    A white paper on Java Database Interaction Mechanism

    finally {try{

    if (cursor != null){

    cursor.close();cursor = null;

    }if (cstmt != null){

    cstmt.close();cstmt = null;

    }if (con != null){

    con.close();con = null;

    }}catch (Exception ex){

    System.out.println("Error in closing :"+ex.getMessage());

    }}

    }

    // Static method to get the connection.

    public static Connection createConnection() throws SQLException,

    ClassNotFoundException{DriverManager.registerDriver(new oracle.jdbc.driver.OracleDriver());Class.forName ("oracle.jdbc.driver.OracleDriver");Connection conn = DriverManager.getConnection

    ("jdbc:oracle:thin:@192.168.1.55:1521:nseinfo", "rvideoserver", "rvideoserver");return conn;

    }

    }

    There is another mechanism to cast the Oracle Reference cursor into Java

    ResultSet.

    ResultSet rsObj = (ResultSet) CallableStatement.getObject( int Index);

    Ex. ResultSet rsObj = (ResultSet) cstmt.getObject(4);

    Ravi Kumar B Page 7 1/20/2005

  • 8/6/2019 RB12105

    8/8

    A white paper on Java Database Interaction Mechanism

    Conclusion

    The cast to OracleCallableStatement is superfluous. A simple getCursor(5)

    does the trick.

    This way of returning a cursor is totally and utterly Oracle-specific and thus

    proprietary. We ended up writing our own JDBC-layer in order to encapsulate

    this difference to other JDBC-drivers.

    Even the Oracle thin and Merant-driver does it the regular way, i.e.

    getResultSet().The best way to tackle this problem is not to use FUNCTIONS,

    but PROCEDURES and to specify the last parameter as an OUT cursor. E.g.

    that's the way the Oraclethin driver expects it.

    "The another big advantage here is that the oracle developers can provide

    ready made queries to the java developers, so the java developers do not have

    to know a lot of sql".

    Working on Oracle, the stored procedures are the best option because are

    more efficient than execute sql statements. On the other side, for a java

    developer is more comfortable work with stored functions (that returns the ref

    cursor) than work with stored procedures. But an Oracle developer prefers

    working with procedures.

    Ravi Kumar B Page 8 1/20/2005