zoukankan      html  css  js  c++  java
  • 数组做为参数传入Oracle存储过程操作数据库

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


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

    代码如下:

    createorreplacetype msg_array astableofnumber;

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

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

    代码如下:

    createorreplaceprocedure modifyage(m_array in msg_array)

    as

    begin

    for i in1..m_array.count loop

    update users set age=age+1where id=m_array(i);

    endloop;

    commit;

    exception

    whenothersthen

    rollback;

    end modifyage;

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

    三、JAVA代码如下

    Connection conn = null;

    CallableStatement cstmt = null;

    try {

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

    conn = DriverManager.getConnection(

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

    "dev");

    List list = new ArrayList();

    list.add(30);

    list.add(31);

    list.add(32);

    list.add(33);

    ArrayDescriptor tabDesc = ArrayDescriptor.createDescriptor(

    "MSG_ARRAY", conn);

    ARRAY vArray = new ARRAY(tabDesc, conn, list.toArray());

    cstmt = conn.prepareCall("call modifyage(?)");

    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)定义数组描述方式。

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

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


    数组里存储的是java bean


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

    createorreplacetype userobj asobject(

    id number,

    username nvarchar2(20),

    age number,

    password nvarchar2(20)

    )

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

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

    代码如下:

    createorreplacetype obj_array astableof userobj;

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

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

    代码如下:

    createorreplaceprocedure saveObjArray

    (

    avc_objArray in obj_array,

    rowcountoutnumber,

    msg outvarchar2

    )as

    userinfo userobj;

    begin

    for i in avc_objArray.First()..avc_objArray.Last()loop

    userinfo := avc_objArray(i);

    insertinto users (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;

    end saveObjArray;

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

    四、JAVA代码如下

    Connection conn = null;

    CallableStatement cstmt = null;

    try{

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

    conn = DriverManager.getConnection(

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

    "dev");

    List<User> userList = new ArrayList<User>();

    User user = new User();

    user.setId(37);

    user.setUsername("dddddd");

    user.setPassword("dddddd");

    user.setAge(14);

    userList.add(user);

    StructDescriptor recDesc =

    StructDescriptor.createDescriptor("USEROBJ", conn);

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

    for(User u : userList){

    Object[] objs = new Object[4];

    objs[0] = u.getId();

    objs[1] = u.getUsername();

    objs[2] = u.getAge();

    objs[3] = u.getPassword();

    STRUCT struct = new STRUCT(recDesc, conn, objs);

    pstruct.add(struct);

    }

    ArrayDescriptor tabDesc =

    ArrayDescriptor.createDescriptor("OBJ_ARRAY", conn);

    ARRAY vArray = new ARRAY(tabDesc, conn, pstruct.toArray());

    cstmt = conn.prepareCall("call saveObjArray(?,?,?)");

    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(Exception e){

    e.printStackTrace();

    }

    首先定义ConnectionCallableStatement2个变量,然后通过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定义的数组。

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

  • 相关阅读:
    mysqldump全量和增量备份脚本
    mysqldump根据通配符批量导出
    xtrabackup2.4_MySQL5.7备份与恢复
    ArrayInt
    Oracle wallet配置登陆凭证
    percona xtrabackup8.0.4备份恢复mysql8.0.12
    mysql修改密码
    range
    一周感悟
    Target
  • 原文地址:https://www.cnblogs.com/iyoume2008/p/6139925.html
Copyright © 2011-2022 走看看