数组做为参数传入Oracle存储过程操作数据库

来源:互联网 发布:我的世界,java.net 编辑:程序博客网 时间:2024/05/22 10:42

数组里存储的是Stringintlang等基本数据类型或引用数据类型(不包括java bean

转载:http://www.cnblogs.com/iyoume2008/p/6139925.html

一、在oracle中定义一个数组类型(TYPE

代码如下:

createorreplacetypemsg_arrayastableofnumber;

意思是创建一个名称为msg_array,存放类型为整型的数组类型

二、在oracle中定义一个存储过程

代码如下:

createorreplaceproceduremodifyage(m_arrayinmsg_array)

as

begin

foriin1..m_array.countloop

updateuserssetage=age+1whereid=m_array(i);

endloop;

commit;

exception

whenothersthen

rollback;

endmodifyage;

创建一个存储过程,传入的参数是上面定义的msg_array类型,操作内容为循环传入的数组,对表的age字段做加1操作。

三、JAVA代码如下

Connectionconn =null;

CallableStatementcstmt =null;

try{

Class.forName("oracle.jdbc.OracleDriver");

conn= DriverManager.getConnection(

"jdbc:oracle:thin:@localhost:1521:orcl","orcl_dev",

"dev");

Listlist =newArrayList();

list.add(30);

list.add(31);

list.add(32);

list.add(33);

ArrayDescriptortabDesc = ArrayDescriptor.createDescriptor(

"MSG_ARRAY",conn);

ARRAYvArray =newARRAY(tabDesc, conn, list.toArray());

cstmt= conn.prepareCall("callmodifyage(?)");

cstmt.setArray(1,vArray);

cstmt.execute();

cstmt.close();

conn.close();

}catch(Exception e) {

e.printStackTrace();

}

首先定义ConnectionCallableStatement2个变量,然后通过JDBC的方式得到Connection,然后定义要传给存储过程的数组。

映射Oracle端数组AS TABLE OF类型

通过ArrayDescriptor.createDescriptor("MSG_ARRAY",conn)定义数组描述方式。

在通过newARRAY(tabDesc, conn,list.toArray()),把要传入的数组按批定的数组描述方式生成一个新的Oracle定义的数组。

调用存储过程,传入参数并执行。


数组里存储的是javabean


一、在oracle中定义一个对象类型(OBJECT

createorreplacetypeuserobjasobject(

id number,

usernamenvarchar2(20),

age number,

passwordnvarchar2(20)

)

意思是创建一个名称为userobj的对象类型,字符串的类型一定要写成nvarchar2,否则,传入数据库的字符串为null

二、在oracle中定义一个数组类型(TYPE

代码如下:

createorreplacetypeobj_arrayastableofuserobj;

意思是创建一个名称为obj_array,存放类型为userobj的数组类型

三、在oracle中定义一个存储过程

代码如下:

createorreplaceproceduresaveObjArray

(

avc_objArrayin obj_array,

rowcountoutnumber,

msg outvarchar2

)as

userinfouserobj;

begin

foriinavc_objArray.First()..avc_objArray.Last()loop

userinfo:=avc_objArray(i);

insertintousers(id,name,password,age)

values(userinfo.id,userinfo.username,userinfo.password,userinfo.age);

endloop;

rowcount:=sql%rowcount;

commit;

exception

whenothersthen

rowcount:=0;

msg:=sqlerrm;

rollback;

endsaveObjArray;

创建一个存储过程,传入的参数是上面定义的obj_array类型的数组,循环数组,分别插入数据库。返回受影响的行数和提式信息。

四、JAVA代码如下

Connectionconn =null;

CallableStatementcstmt =null;

try{

Class.forName("oracle.jdbc.OracleDriver");

conn= DriverManager.getConnection(

"jdbc:oracle:thin:@localhost:1521:orcl","orcl_dev",

"dev");

List<User>userList =newArrayList<User>();

Useruser =newUser();

user.setId(37);

user.setUsername("dddddd");

user.setPassword("dddddd");

user.setAge(14);

userList.add(user);

StructDescriptorrecDesc =

StructDescriptor.createDescriptor("USEROBJ",conn);

ArrayList<STRUCT>pstruct =newArrayList<STRUCT>();

for(Useru : userList){

Object[]objs =newObject[4];

objs[0]= u.getId();

objs[1]= u.getUsername();

objs[2]= u.getAge();

objs[3]= u.getPassword();

STRUCTstruct =newSTRUCT(recDesc, conn, objs);

pstruct.add(struct);

}

ArrayDescriptortabDesc =

ArrayDescriptor.createDescriptor("OBJ_ARRAY",conn);

ARRAYvArray =newARRAY(tabDesc, conn, pstruct.toArray());

cstmt= conn.prepareCall("callsaveObjArray(?,?,?)");

cstmt.setArray(1,vArray);

cstmt.registerOutParameter(2,Types.INTEGER);

cstmt.registerOutParameter(3,Types.VARCHAR);

cstmt.execute();

System.out.println(cstmt.getString(2));

System.out.println(cstmt.getString(3));

cstmt.close();

conn.close();

}catch(Exceptione){

e.printStackTrace();

}

首先定义ConnectionCallableStatement2个变量,然后通过JDBC的方式得到Connection,然后定义要传给存储过程的数组。

映射Oracle端对象AS OBJECT类型

首先通过StructDescriptor.createDescriptor("USEROBJ",conn)定义对象描述方式。

然后,把javabean的各个属性赋值给Object类型的数组,通过newSTRUCT(recDesc, conn, objs)方法,把javabean按照对象描述方式描述成Oracle可以识别的对象。最后放到数组里。

映射Oracle端数组AS TABLE OF类型

通过ArrayDescriptor.createDescriptor("OBJ_ARRAY",conn)定义数组描述方式。

在通过newARRAY(tabDesc, conn,pstruct.toArray()),把要传入的数组按批定的数组描述方式生成一个新的Oracle定义的数组。

调用存储过程,传入参数并执行。

阅读全文
0 0
原创粉丝点击