数组做为参数传⼊Oracle存储过程操作数据库
注:本⽂来源:《》
数组⾥存储的是String、int、lang等基本数据类型或引⽤数据类型(不包括java bean)
⼀、在oracle中定义⼀个数组类型(TYPE)
代码如下:
1
2 replace type msg_array number;
3
4
意思是创建⼀个名称为msg_array,存放类型为整型的数组类型
⼆、在oracle中定义⼀个存储过程
1
2
3 replace modifyage(m_array msg_array)
4
5
6
7
8
9 _array. loop
10
11 users age=age+1 id=m_array(i);
12
13 loop;
14
15 ;
16
17
18
19 others
20
21 roll back;
22
23 modifyage;
24
创建⼀个存储过程,传⼊的参数是上⾯定义的msg_array类型,操作内容为循环传⼊的数组,对表的age字段做加1操作。
三、JAVA代码如下
1 Connection conn = null;
2
3 CallableStatement cstmt = null;
4
5try {
6
7 Class.forName("oracle.jdbc.OracleDriver");
8
9 conn = Connection(
10
oracle 字符串转数组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 = ateDescriptor(
26
27 "MSG_ARRAY", conn);
28
29 ARRAY vArray = new ARRAY(tabDesc, conn, Array());
30
31 cstmt = conn.prepareCall("call modifyage(?)");
32
33 cstmt.setArray(1, vArray);
ute();
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类型
通过ateDescriptor("MSG_ARRAY",conn)定义数组描述⽅式。
在通过new ARRAY(tabDesc, conn, Array()),把要传⼊的数组按批定的数组描述⽅式⽣成⼀个新的Oracle定义的数组。调⽤存储过程,传⼊参数并执⾏。
数组⾥存储的是java bean
⼀、在oracle中定义⼀个对象类型(OBJECT) 1 createorreplacetype userobj asobject(
2
3 id number,
4
5 username 2(20),
6
7 age number,
8
9 password 2(20)
10
11 )
12
意思是创建⼀个名称为userobj的对象类型,字符串的类型⼀定要写成nvarchar2,否则,传⼊数据库的字符串为null ⼆、在oracle中定义⼀个数组类型(TYPE)
代码如下:
1 replace type obj_array astable userobj;
意思是创建⼀个名称为obj_array,存放类型为userobj的数组类型
三、在oracle中定义⼀个存储过程
代码如下:
1 replace saveObjArray
2
3 (
4
5 avc_objArray obj_array,
6
7 rowcountout number,
8
9 msg outvarchar2
10
11 )
12
13 userinfo userobj;
14
15
16
17 i avc_objArray.()..avc_objArray.() loop
18
19 userinfo := avc_objArray(i);
20
21 insertinto users (id,name,password,age)
22
23 (userinfo.id,userinfo.username,userinfo.password,userinfo.age);
24
25 end loop;
26
27 :=%;
28
29 ;
30
31
32
33 others
34
35 :=0;
36
37 msg :=sqlerrm;
40
41 saveObjArray;
42
创建⼀个存储过程,传⼊的参数是上⾯定义的obj_array类型的数组,循环数组,分别插⼊数据库。返回受影响的⾏数和提式信息。
四、JAVA代码如下
1 Connection conn = null;
2
3 CallableStatement cstmt = null;
4
5try{
6
7 Class.forName("oracle.jdbc.OracleDriver");
8
9 conn = Connection(
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
ateDescriptor("USEROBJ", conn);
32
33 ArrayList<STRUCT> pstruct = new ArrayList<STRUCT>();
34
35for(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
ateDescriptor("OBJ_ARRAY", conn);
56
57 ARRAY vArray = new ARRAY(tabDesc, conn, Array());
58
59 cstmt = conn.prepareCall("call saveObjArray(?,?,?)");
60
61 cstmt.setArray(1, vArray);
62
isterOutParameter(2, Types.INTEGER);
64
isterOutParameter(3, Types.VARCHAR);
66
ute();
68
69 System.out.String(2));
70
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类型
⾸先通过ateDescriptor("USEROBJ",conn)定义对象描述⽅式。
然后,把java bean 的各个属性赋值给Object类型的数组,通过new STRUCT(recDesc, conn, objs)⽅法,把java bean按照对象描述⽅式描述成Oracle可以识别的对象。最后放到数组⾥。
映射 Oracle端数组 AS TABLE OF类型
通过ateDescriptor("OBJ_ARRAY",conn)定义数组描述⽅式。
在通过new ARRAY(tabDesc, conn, Array()),把要传⼊的数组按批定的数组描述⽅式⽣成⼀个新的Oracle定义的数组。
调⽤存储过程,传⼊参数并执⾏。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论