为了账号安全,请及时绑定邮箱和手机立即绑定

如下是关于java调用oracle函数的问题,请问该怎么改?

如下是关于java调用oracle函数的问题,请问该怎么改?

胡说叔叔 2022-04-14 18:11:10
我在oracle中定义一个自己的myArray类型,is varray(1000) of varchar2(100)然后定义了一个函数,其中要求传入的参数就是我自己定义的myArray,现在我想把java中的String[] 直接作为{call 包名.函数名(String数组)} 这样的话将String数组传给oracle函数。请问这样能行吗? 如果有demo的话不甚感激oracle接收到数组,还要对里面的数据进行读取出来进行操作,并不是简单的把数组插入到表中
查看完整描述

2 回答

?
qq_遁去的一_1

TA贡献1725条经验 获得超7个赞

例:arrayList中存在一些people对象1.首先要在数据库中建立相应的java对象和数组,如:/*和java对象对应的数据库对象*/CREATETYPEpeopleOracleObjectASOBJECT( peopleOracleIDNUMBER(8), nameOraclevarchar(50), ageOracleNumber(3))/数据库中的arrayCREATETYPEpeople_Oracle_LISTASVARRAY(500)OFpeopleOracle;/2.将java中的arrayList转化privatestaticARRAYgetOracleArray(Connectioncon,StringOraclelist,ArrayListobjlist)throwsException{ ARRAYlist=null; if(objlist!=null&&objlist.size()>0){ StructDescriptorstructdesc=newStructDescriptor( "peopleOracleObject",con); STRUCT[]structs=newSTRUCT[objlist.size()]; Object[]result=newObject[0]; for(inti=0;i<objlist.size();i){ result=newObject[2]; result[0]=newLong(((people)(objlist.get(i))).getPeopleID()); result[1]=newLong(((people)(objlist.get(i))).getPeopleName()); result[2]=newLong(((people)(objlist.get(i))).getPeopleAge()); structs=newSTRUCT(structdesc,con,result);}ArrayDescriptordesc=ArrayDescriptor.createDescriptor(Oraclelist, con);list=newARRAY(desc,con,structs);}else{ ArrayDescriptordesc=ArrayDescriptor.createDescriptor(Oraclelist,con); STRUCT[]structs=newSTRUCT[0]; list=newARRAY(desc,con,structs);}returnlist;}//function3./*把转换后的数组加到存储过程中*/publicstaticintupdateADInfo(ArrayListpeoleList,intID){Connectioncon=null;CallableStatementstmt=null;intbackVal; try{ con=pool.getConnection(); if(con!=null){ stmt=con.prepareCall("{callupdatePeople(?,?,?)}"); ARRAYadArray=getOracleArray(con,"people_Oracle_LIST", peoleList); ((OracleCallableStatement)stmt).setARRAY(1,adArray); stmt.setInt(2,ID); stmt.registerOutParameter(3,java.sql.Types.INTEGER); stmt.execute();}else{ backVal=1;}}catch(Exceptione){ e.printStackTrace();}finally{pool.freeDBResource(con,stmt,null);} returnbackVal;}4.存储过程中调用CREATEORREPLACEPROCEDURENAD_SP_CreateWebCostToAd(p_peopleArrayINpeople_Oracle_LIST,p_IDINnumber,p_outOUTVARCHAR2)ASVpeopleIDnumber(8):=0;VpeopleNamevarchar(50):=0;Vagenumber(3):=0;beginfori1...p_peopleArray.countloop peopleObj:=p_peopleArray(i); VpeopleID:=peopleObj.peopleOracleID; VpeopleName:=peopleObj.nameOracle; Vage:=peopleObj.ageOracle;................. endloop; commit;EXCEPTIONWHENOTHERSTHENp_out:=’-1’||SQLERRM;ROLLBACK;END;/SHOWERRORS

查看完整回答
反对 回复 2022-04-19
?
慕妹3146593

TA贡献1820条经验 获得超9个赞

对于java中的对象或者数组要传递到oracle存储过程或者函数中要借助于oracle提供的相应转换工具类

查看完整回答
反对 回复 2022-04-19
  • 2 回答
  • 0 关注
  • 116 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信