數組做為參數傳入Oracle存儲過程操作數據庫
註:本文來源:《 數組做為參數傳入Oracle存儲過程操作數據庫 》
數組裏存儲的是String、int、lang等基本數據類型或引用數據類型(不包括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) 45 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(); 1617 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存儲過程操作數據庫