zoukankan      html  css  js  c++  java
  • 数组做为参数传入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定义的数组。

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

  • 相关阅读:
    lambda 和 iterable
    使用Jenkins部署Python项目
    python下selenium自动化测试自我实践
    【其它】数学学科编码
    【其它】音阶中的数学
    【数理统计基础】 06
    【数理统计基础】 05
    【数理统计基础】 04
    【数理统计基础】 03
    【数理统计基础】 02
  • 原文地址:https://www.cnblogs.com/ios9/p/8858177.html
Copyright © 2011-2022 走看看