1. 程式人生 > >數組做為參數傳入Oracle存儲過程操作數據庫

數組做為參數傳入Oracle存儲過程操作數據庫

dddddd .get abd www. comm 屬性 jar prepare href

註:本文來源:《 數組做為參數傳入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存儲過程操作數據庫