java呼叫oracle儲存過程的自定義型別(可變陣列)

85579711發表於2014-04-01

java呼叫oracle儲存過程的自定義型別(可變陣列)。2010-05-14 10:06

在使用儲存過程中,我們有時需要傳遞可變陣列,存在兩種情況,儲存過程有輸入或輸出引數為自定義可變陣列的。在java程式碼中,如何正確呼叫oracle儲存過程的自定義可變陣列型別,在這裡做一下示例說明.

java呼叫oracle儲存過程的自定義型別:

plsql定義字串和數值型可變陣列:

一。定義全域性型別:

CREATE OR REPLACE TYPE USERSEQID_ARRAY IS VARRAY(50000) OF NUMBER(9)

CREATE OR REPLACE TYPE USERNAME_ARRAY AS VARRAY(32) of varchar(32)

CREATE OR REPLACE TYPE USERPWD_ARRAY AS VARRAY(50000) of varchar(60)

二。java呼叫輸出引數為自定義陣列的儲存過程:

2.1 輸出引數為自定義陣列的儲存過程make_logincard_pro:

procedure make_logincard_pro (
p_cardsuitcode in varchar,
p_userseqidArr out USERSEQID_ARRAY ,
p_usernameArr out USERNAME_ARRAY 
)
IS
v_addedtime date:= sysdate;

BEGIN

    FOR ii IN 1 .. 10 LOOP

        IF p_userseqidArr IS NULL THEN
          p_userseqidArr := USERSEQID_ARRAY(ii);
        ELSE
           p_userseqidArr.EXTEND;   --超過陣列定義大小(50000)將丟擲異常 
           p_userseqidArr(ii) := ii;                
        END IF;

        IF p_usernameArr IS NULL THEN
          p_usernameArr := USERSEQID_ARRAY(ii || 'TT');
        ELSE
           p_usernameArr.EXTEND;      --超過陣列定義大小(32)將丟擲異常
           p_usernameArr(ii) := ii || 'TT';                
        END IF;


    END LOOP

END make_logincard_pro ; 2.2JAVA呼叫儲存過程make_logincard_pro:


//程式碼片段
Connection con = session.connection();
java.sql.CallableStatement cst = con
        prepareCall("call CNBT.test_pro(?,?,?)");
cst.setString(1, cardSuitCode);
cst.registerOutParameter(2, OracleTypes.ARRAY,"USERSEQID_ARRAY");
cst.registerOutParameter(3, OracleTypes.ARRAY,"USERNAME_ARRAY");

java.sql.Array userSeqIdArr = cst.getArray(2);
java.sql.Array userNameArr = cst.getArray(3);

if ( userSeqIdArr != null ) ...{
    BigDecimal userSeqIdList[] = (BigDecimal[])userSeqIdArr.getArray();//資料庫的number對映為BigDecimal 
    //。。。。。。
}
if ( userNameArr != null ) ...{
    String userNameList[] = (String[])userNameArr.getArray(); 
    //。。。。。。
}



--------------------------------------------------------------------------------

三. java呼叫輸入引數為自定義陣列的儲存過程:

3.1 輸入引數為自定義陣列的儲存過程update_logincard_pwd:

/**//**********************************************
   *          update_logincard_pwd               *
   *功能描述:更新密碼儲存過程         *
   *輸入引數:                                         *
   *輸出引數:                                         *
   *作者:hanjiong                                    *
   ***********************************************/   
procedure update_logincard_pwd (
     p_userSeqIdList in USERSEQID_ARRAY,
     p_userPwdList in USERPWD_ARRAY,
     p_resultcode out number
   );3.2 java呼叫儲存過程update_logincard_pwd:

//程式碼片段
..........................
Connection con = session.connection();//使用的weblogic資料來源
oracle.jdbc.OracleCallableStatement cst2 = (oracle.jdbc.OracleCallableStatement)con
                                    .prepareCall(
                                    "call CNBT.update_logincard_pwd(?,?,?)");
                            weblogic.jdbc.wrapper.Connection weblogicConn = (weblogic.jdbc.wrapper.Connection)con;
                            oracle.jdbc.OracleConnection oracleConn = (oracle.jdbc.OracleConnection)weblogicConn.getVendorConnection();//轉化connection
                            oracle.sql.ArrayDescriptor des_USERSEQID_ARRAY =
                                    oracle.sql.ArrayDescriptor.createDescriptor("USERSEQID_ARRAY",oracleConn);
                            oracle.sql.ArrayDescriptor des_USERPWD_ARRAY =
                                    oracle.sql.ArrayDescriptor.createDescriptor("USERPWD_ARRAY",oracleConn);
                            oracle.sql.ARRAY ora_array1 = new oracle.sql.ARRAY(des_USERSEQID_ARRAY, oracleConn, userAccSeqIdArr);
                            oracle.sql.ARRAY ora_array2 = new oracle.sql.ARRAY(des_USERPWD_ARRAY, oracleConn, userPwdList);
                            cst2.setArray(1, ora_array1);
                            cst2.setArray(2, ora_array2);
                            cst2.registerOutParameter(3, java.sql.Types.INTEGER);
                            cst2.execute();
                            updateCode = cst2.getInt(3);

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29063131/viewspace-1133822/,如需轉載,請註明出處,否則將追究法律責任。

相關文章