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

Posted ✧*꧁一品堂.技术学习笔记꧂*✧.

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数组做为参数传入Oracle存储过程操作数据库相关的知识,希望对你有一定的参考价值。

注:本文来源:《   数组做为参数传入Oracle存储过程操作数据库   》



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

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

代码如下:

  1 
  2  create or replace type msg_array as table of number;
  3 
  4 

意思是创建一个名称为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)

代码如下:

  1 create or replace type obj_array astable of userobj;

意思是创建一个名称为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存储过程操作数据库的主要内容,如果未能解决你的问题,请参考以下文章

如何给SQLSERVER存储过程传递数组参数

java字符串数组作为参数传递oracle存储过程

oracle带参(传入,传出)的存储过程怎么执行

mysql存储过程把字段作为传入参数

oracle 存储过程 数组循环

SQL Server2008 存储过程传入表名称和列名称,如何在语句中使用表明引用列名?