日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

java 存储过程 数组_Java调用存储过程返回数组

發(fā)布時間:2024/9/19 java 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java 存储过程 数组_Java调用存储过程返回数组 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

Java調(diào)用存儲過程:

結合SQL操作與存儲過程

create procedure set_death_age(poet VARCHAR2, poet_age NUMBER)

poet_id NUMBER;

begin SELECT id INTO poet_id FROM poets WHERE name = poet;

INSERT INTO deaths (mort_id, age) VALUES (poet_id, poet_age);

end set_death_age;

下面是調(diào)用上面存儲過程的Java代碼:

public static void setDeathAge(Poet dyingBard, int age) throws SQLException{

Connection con = null;

CallableStatement proc = null;

try {

con = connectionPool.getConnection();

proc = con.prepareCall("{ call set_death_age(?, ?) }");

proc.setString(1, dyingBard.getName());

proc.setInt(2, age);

proc.execute();

}

finally {

try { proc.close(); }

catch (SQLException e) {}

con.close();

}

}

Functions

存儲過程可以有返回值,所以CallableStatement類有類似getResultSet這樣的方法來獲取返回值。當存儲過程返回一個值時,你必須使用registerOutParameter方法告訴JDBC驅動器該值的SQL類型是什么。你也必須調(diào)整存儲過程調(diào)用來指示該過程返回一個值。

下面接著上面的例子。這次我們查詢Dylan Thomas逝世時的年齡。這次的存儲過程使用:

create function snuffed_it_when (VARCHAR) returns integer ''declare

poet_id NUMBER;

poet_age NUMBER;

begin

--first get the id associated with the poet.

SELECT id INTO poet_id FROM poets WHERE name = $1;

--get and return the age.

SELECT age INTO poet_age FROM deaths WHERE mort_id = poet_id;

return age;

end;

下面是調(diào)用這個存儲過程的Java代碼:

connection.setAutoCommit(false);

CallableStatement proc = connection.prepareCall("{ ? = call snuffed_it_when(?) }"); proc.registerOutParameter(1, Types.INTEGER);

proc.setString(2, poetName); cs.execute();

int age = proc.getInt(2);

在使用存儲過程中,我們有時需要傳遞可變數(shù)組,存在兩種情況,存儲過程有輸入或輸出參數(shù)為自定義可變數(shù)組的。在java代碼中,如何正確調(diào)用oracle存儲過程的自定義可變數(shù)組類型,在這里做一下示例說明.

java調(diào)用oracle存儲過程的自定義類型:

plsql定義字符串和數(shù)值型可變數(shù)組:

一.定義全局類型:

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調(diào)用輸出參數(shù)為自定義數(shù)組的存儲過程:

2.1 輸出參數(shù)為自定義數(shù)組的存儲過程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;?? --超過數(shù)組定義大小(50000)將拋出異常

p_userseqidArr(ii) := ii;

END IF;

IF p_usernameArr IS NULL THEN

p_usernameArr := USERSEQID_ARRAY(ii || 'TT');

ELSE

p_usernameArr.EXTEND;????? --超過數(shù)組定義大小(32)將拋出異常

p_usernameArr(ii) := ii || 'TT';

END IF;

END LOOP

END make_logincard_pro ;

2.2JAVA調(diào)用存儲過程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();//數(shù)據(jù)庫的number映射為BigDecimal

//。。。。。。

}

if ( userNameArr? != null ) ...{

String userNameList[] = (String[])userNameArr.getArray();

//。。。。。。

}

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

三. java調(diào)用輸入?yún)?shù)為自定義數(shù)組的存儲過程:

3.1 輸入?yún)?shù)為自定義數(shù)組的存儲過程update_logincard_pwd:

/**//**********************************************

*????????? update_logincard_pwd?????????????? *

*功能描述:更新密碼存儲過程???????? *

*輸入?yún)?shù):???????????????????????????????????????? *

*輸出參數(shù):??????????? ?????????????????????????????*

*作者:hanjiong??????????????????????????????????? *

***********************************************/

procedure update_logincard_pwd (

p_userSeqIdList in USERSEQID_ARRAY,

p_userPwdList in USERPWD_ARRAY,

p_resultcode out number

);

3.2 java調(diào)用存儲過程update_logincard_pwd:

//代碼片段

..........................

Connection con = session.connection();//使用的weblogic數(shù)據(jù)源

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);

.....................................

....................................

因為我使用的是weblogic配置的數(shù)據(jù)源,在取得的connection對象時需要注意,通過數(shù)據(jù)源取得的Connection對象為weblogic.jdbc.wrapper.Connection,所以不能直接轉化為oracle.jdbc.OracleConnection,否則會出現(xiàn)java.lang.ClassCastException異常,所以我們要通過weblogic.jdbc.wrapper.Connection.getVendorConnection()取得java.sql.Connection,在強制轉化為oracle.jdbc.OracleConnection。

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

通過上述兩種情況,就可以在Oracle存儲過程中使用zid

總結

以上是生活随笔為你收集整理的java 存储过程 数组_Java调用存储过程返回数组的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。