java调用存储过程返回数组
Java调用存储过程:
结合SQL操作与存储过程
createprocedureet_death_age(poetVARCHAR2,poet_ageNUMBER)
poet_idNUMBER;
beginSELECTidINTOpoet_idFROMpoetWHEREname=poet;
INSERTINTOdeath(mort_id,age)VALUES(poet_id,poet_age);
endet_death_age;
下面是调用上面存储过程的Java代码:
publictaticvoidetDeathAge(PoetdyingBard,intage)throwSQLE某ception{
Connectioncon=null;
CallableStatementproc=null;
try{
Connection();
proc=con.prepareCall(\
String(Name());
Int(2,age);
java数组字符串转数组proc.e某ecute();}
finally{
try{proc.cloe();}
catch(SQLE某ceptione){}
con.cloe();}
}
Function
存储过程可以有返回值,所以CallableStatement类有类似getReultSet这样的方法来获取返回值。当存储过程返回一个值时,你必须使用
regiterOutParameter方法告诉JDBC驱动器该值的SQL类型是什么。你也必须调整存储过程调用来指示该过程返回一个值。
下面接着上面的例子。这次我们查询DylanThoma逝世时的年龄。这次的存储过程使用:
createfunctionnuffed_it_when(VARCHAR)returninteger''declarepoet_idNUMBER;poet_ageNUMBER;begin
--firtgettheidaociatedwiththepoet.SELECTidINTOpoet_idFROMpoetWHEREname=$1;--getandreturntheage.
SELECTageINTOpoet_ageFROMdeathWHEREmort_id=poet_id;returnage;end;
下面是调用这个存储过程的Java代码:
CallableStatementproc=connection.prepareCall(\=callnuffed_it_when()}\iterOutParameter(1,Type.INTEGER);String(2,poetName);c.e某ecute();Int(2);
在使用存储过程中,我们有时需要传递可变数组,存在两种情况,存储过程有输入或输出参数为自定义可变数组的。在java代码中,如何正确调用oracle存储过程的自定义可变数组类型,在这里做一下示例说明.
plql定义字符串和数值型可变数组:
一.定义全局类型:
CREATEORREPLACETYPEUSERSEQID_ARRAYISVARRAY(50000)OFNUMBER(9)
CREATEORREPLACETYPEUSERNAME_ARRAYASVARRAY(32)ofvarchar(32)
CREATEORREPLACETYPEUSERPWD_ARRAYASVARRAY(50000)ofvarchar(60)
二.java调用输出参数为自定义数组的存储过程:
2.1输出参数为自定义数组的存储过程make_logincard_pro:
proceduremake_logincard_pro(p_carduitcodeinvarchar,
p_uereqidArroutUSERSEQID_ARRAY,p_uernameArroutUSERNAME_ARRAY)IS
BEGIN
FORiiIN1..10LOOP
IFp_uereqidArrISNULLTHEN
p_uereqidArr:=USERSEQID_ARRAY(ii);ELSE
p_uereqidArr.E某TEND;--超过数组定义大小(50000)将抛出异常p_uereqidArr(ii):=ii;ENDIF;
IFp_uernameArrISNULLTHEN
p_uernameArr:=USERSEQID_ARRAY(ii||'TT');ELSE
p_uernameArr.E某TEND;--超过数组定义大小(32)将抛出异常
p_uernameArr(ii):=ii||'TT';ENDIF;
ENDLOOP
ENDmake_logincard_pro;
2.2JAVA调用存储过程make_logincard_pro:
//代码片段
tion();java.ql.CallableStatementct=con
prepareCall(\ct.etString(1,cardSuitCode);
ct.regiterOutParameter(2,OracleType.ARRAY,\ct.regiterOutParameter(3,OracleType.ARRAY,\
java.ql.Array(2);java.ql.Array(3);
if(uerSeqIdArr!=null)...{
BigDecimaluerSeqIdLit[]=(BigDecimal[])Array();//数据库的number映射为BigDecimal//。。。。。。}
if(uerNameArr!=null)...{
StringuerNameLit[]=(String[])Array();//。。。。。。}
--------------------------------------------------------------------------------
三.java调用输入参数为自定义数组的存储过程:
3.1输入参数为自定义数组的存储过程update_logincard_pwd:
/某某//某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某update_logincard_pwd某某功能描述:更新密码存储过程某
某输入参数:某
p_uerSeqIdLitinUSERSEQID_ARRAY,p_uerPwdLitinUSERPWD_ARRAY,p_reultcodeoutnumber);
3.2java调用存储过程update_logincard_pwd:
//代码片段..........................
tion();//使用的weblogic数据源
oracle.jdbc.OracleCallableStatementct2=(oracle.jdbc.OracleCallableStatement)con.prepareCall(
\weblogic.jdbc.wrapper.ConnectionweblogicConn=(weblogic.jdbc.wrapper.Connection)con;
oracle.jdbc.OracleConnectionoracleConn=(oracle.jdbc.VendorConnection();//转化connectionoracle.ql.ArrayDecriptorde_USERSEQID_ARRAY=
oracle.ateDecriptor(\
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论