數組做為參數傳入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定義的數組。

調用存儲過程,傳入參數並執行。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM