數組里存儲的是String、int、lang等基本數據類型或引用數據類型(不包括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();
}
首先定義Connection、CallableStatement2個變量,然后通過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();
}
首先定義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定義的數組。
調用存儲過程,傳入參數並執行。