数组做为参数传入Oracle存储过程操作数据库
Posted ✧*꧁一品堂.技术学习笔记꧂*✧.
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数组做为参数传入Oracle存储过程操作数据库相关的知识,希望对你有一定的参考价值。
注:本文来源:《 数组做为参数传入Oracle存储过程操作数据库 》
数组里存储的是String、int、lang等基本数据类型或引用数据类型(不包括java bean)
一、在oracle中定义一个数组类型(TYPE)
代码如下:
意思是创建一个名称为msg_array,存放类型为整型的数组类型
二、在oracle中定义一个存储过程
1 2 3 create or replace procedure modifyage(m_array in msg_array) 4 5 as 6 7 begin 8 9 for i in1..m_array.count loop 10 11 update users set age=age+1where id=m_array(i); 12 13 end loop; 14 15 commit; 16 17 exception 18 19 when others then 20 21 roll back; 22 23 end modifyage; 24创建一个存储过程,传入的参数是上面定义的msg_array类型,操作内容为循环传入的数组,对表的age字段做加1操作。
三、JAVA代码如下
1 Connection conn = null; 2 3 CallableStatement cstmt = null; 4 5 try { 6 7 Class.forName("oracle.jdbc.OracleDriver"); 8 9 conn = DriverManager.getConnection( 10 11 "jdbc:oracle:thin:@localhost:1521:orcl", "orcl_dev", 12 13 "dev"); 14 15 List list = new ArrayList(); 16 17 list.add(30); 18 19 list.add(31); 20 21 list.add(32); 22 23 list.add(33); 24 25 ArrayDescriptor tabDesc = ArrayDescriptor.createDescriptor( 26 27 "MSG_ARRAY", conn); 28 29 ARRAY vArray = new ARRAY(tabDesc, conn, list.toArray()); 30 31 cstmt = conn.prepareCall("call modifyage(?)"); 32 33 cstmt.setArray(1, vArray); 34 35 cstmt.execute(); 36 37 cstmt.close(); 38 39 conn.close(); 40 41 } catch (Exception e) { 42 43 e.printStackTrace(); 44 45 } 46
首先定义Connection、CallableStatement2个变量,然后通过JDBC的方式得到Connection,然后定义要传给存储过程的数组。
映射 Oracle端数组 AS TABLE OF类型
通过ArrayDescriptor.createDescriptor("MSG_ARRAY",conn)定义数组描述方式。
在通过new ARRAY(tabDesc, conn, list.toArray()),把要传入的数组按批定的数组描述方式生成一个新的Oracle定义的数组。
调用存储过程,传入参数并执行。
数组里存储的是java bean
一、在oracle中定义一个对象类型(OBJECT)
1 createorreplacetype userobj asobject( 2 3 id number, 4 5 username nvarchar2(20), 6 7 age number, 8 9 password nvarchar2(20) 10 11 ) 12意思是创建一个名称为userobj的对象类型,字符串的类型一定要写成nvarchar2,否则,传入数据库的字符串为null
二、在oracle中定义一个数组类型(TYPE)
代码如下:
意思是创建一个名称为obj_array,存放类型为userobj的数组类型
三、在oracle中定义一个存储过程
代码如下:
1 create or replace procedure saveObjArray 2 3 ( 4 5 avc_objArray in obj_array, 6 7 rowcountout number, 8 9 msg outvarchar2 10 11 )as 12 13 userinfo userobj; 14 15 begin 16 17 for i in avc_objArray.First()..avc_objArray.Last() loop 18 19 userinfo := avc_objArray(i); 20 21 insertinto users (id,name,password,age) 22 23 values(userinfo.id,userinfo.username,userinfo.password,userinfo.age); 24 25 end loop; 26 27 rowcount:=sql%rowcount; 28 29 commit; 30 31 exception 32 33 when others then 34 35 rowcount:=0; 36 37 msg :=sqlerrm; 38 39 rollback; 40 41 end saveObjArray; 42
创建一个存储过程,传入的参数是上面定义的obj_array类型的数组,循环数组,分别插入数据库。返回受影响的行数和提式信息。
四、JAVA代码如下
1 Connection conn = null; 2 3 CallableStatement cstmt = null; 4 5 try{ 6 7 Class.forName("oracle.jdbc.OracleDriver"); 8 9 conn = DriverManager.getConnection( 10 11 "jdbc:oracle:thin:@localhost:1521:orcl", "orcl_dev", 12 13 "dev"); 14 15 List<User> userList = new ArrayList<User>(); 16 17 User user = new User(); 18 19 user.setId(37); 20 21 user.setUsername("dddddd"); 22 23 user.setPassword("dddddd"); 24 25 user.setAge(14); 26 27 userList.add(user); 28 29 StructDescriptor recDesc = 30 31 StructDescriptor.createDescriptor("USEROBJ", conn); 32 33 ArrayList<STRUCT> pstruct = new ArrayList<STRUCT>(); 34 35 for(User u : userList){ 36 37 Object[] objs = new Object[4]; 38 39 objs[0] = u.getId(); 40 41 objs[1] = u.getUsername(); 42 43 objs[2] = u.getAge(); 44 45 objs[3] = u.getPassword(); 46 47 STRUCT struct = new STRUCT(recDesc, conn, objs); 48 49 pstruct.add(struct); 50 51 } 52 53 ArrayDescriptor tabDesc = 54 55 ArrayDescriptor.createDescriptor("OBJ_ARRAY", conn); 56 57 ARRAY vArray = new ARRAY(tabDesc, conn, pstruct.toArray()); 58 59 cstmt = conn.prepareCall("call saveObjArray(?,?,?)"); 60 61 cstmt.setArray(1, vArray); 62 63 cstmt.registerOutParameter(2, Types.INTEGER); 64 65 cstmt.registerOutParameter(3, Types.VARCHAR); 66 67 cstmt.execute(); 68 69 System.out.println(cstmt.getString(2)); 70 71 System.out.println(cstmt.getString(3)); 72 73 cstmt.close(); 74 75 conn.close(); 76 77 }catch(Exception e){ 78 79 e.printStackTrace(); 80 81 } 82
首先定义Connection、CallableStatement2个变量,然后通过JDBC的方式得到Connection,然后定义要传给存储过程的数组。
映射 Oracle端对象 AS OBJECT类型
首先通过StructDescriptor.createDescriptor("USEROBJ",conn)定义对象描述方式。
然后,把java bean 的各个属性赋值给Object类型的数组,通过new STRUCT(recDesc, conn, objs)方法,把java bean按照对象描述方式描述成Oracle可以识别的对象。最后放到数组里。
映射 Oracle端数组 AS TABLE OF类型
通过ArrayDescriptor.createDescriptor("OBJ_ARRAY",conn)定义数组描述方式。
在通过new ARRAY(tabDesc, conn, pstruct.toArray()),把要传入的数组按批定的数组描述方式生成一个新的Oracle定义的数组。
调用存储过程,传入参数并执行。
以上是关于数组做为参数传入Oracle存储过程操作数据库的主要内容,如果未能解决你的问题,请参考以下文章