java 存储过程 数组_Java调用存储过程返回数组
Java調(diào)用存儲(chǔ)過程:
結(jié)合SQL操作與存儲(chǔ)過程
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)用上面存儲(chǔ)過程的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
存儲(chǔ)過程可以有返回值,所以CallableStatement類有類似getResultSet這樣的方法來(lái)獲取返回值。當(dāng)存儲(chǔ)過程返回一個(gè)值時(shí),你必須使用registerOutParameter方法告訴JDBC驅(qū)動(dòng)器該值的SQL類型是什么。你也必須調(diào)整存儲(chǔ)過程調(diào)用來(lái)指示該過程返回一個(gè)值。
下面接著上面的例子。這次我們查詢Dylan Thomas逝世時(shí)的年齡。這次的存儲(chǔ)過程使用:
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)用這個(gè)存儲(chǔ)過程的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);
在使用存儲(chǔ)過程中,我們有時(shí)需要傳遞可變數(shù)組,存在兩種情況,存儲(chǔ)過程有輸入或輸出參數(shù)為自定義可變數(shù)組的。在java代碼中,如何正確調(diào)用oracle存儲(chǔ)過程的自定義可變數(shù)組類型,在這里做一下示例說(shuō)明.
java調(diào)用oracle存儲(chǔ)過程的自定義類型:
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ù)組的存儲(chǔ)過程:
2.1 輸出參數(shù)為自定義數(shù)組的存儲(chǔ)過程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)用存儲(chǔ)過程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ù)庫(kù)的number映射為BigDecimal
//。。。。。。
}
if ( userNameArr? != null ) ...{
String userNameList[] = (String[])userNameArr.getArray();
//。。。。。。
}
--------------------------------------------------------------------------------
三. java調(diào)用輸入?yún)?shù)為自定義數(shù)組的存儲(chǔ)過程:
3.1 輸入?yún)?shù)為自定義數(shù)組的存儲(chǔ)過程update_logincard_pwd:
/**//**********************************************
*????????? update_logincard_pwd?????????????? *
*功能描述:更新密碼存儲(chǔ)過程???????? *
*輸入?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)用存儲(chǔ)過程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();//轉(zhuǎn)化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);
.....................................
....................................
因?yàn)槲沂褂玫氖莣eblogic配置的數(shù)據(jù)源,在取得的connection對(duì)象時(shí)需要注意,通過數(shù)據(jù)源取得的Connection對(duì)象為weblogic.jdbc.wrapper.Connection,所以不能直接轉(zhuǎn)化為oracle.jdbc.OracleConnection,否則會(huì)出現(xiàn)java.lang.ClassCastException異常,所以我們要通過weblogic.jdbc.wrapper.Connection.getVendorConnection()取得java.sql.Connection,在強(qiáng)制轉(zhuǎn)化為oracle.jdbc.OracleConnection。
--------------------------------------------------------------------------------
通過上述兩種情況,就可以在Oracle存儲(chǔ)過程中使用zid
總結(jié)
以上是生活随笔為你收集整理的java 存储过程 数组_Java调用存储过程返回数组的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: 视网膜脱落可以拔牙吗
- 下一篇: 丁香空结雨中愁(芭蕉不展丁香结的全诗)
