数组做为参数传入Oracle存储过程操作数据库
来源:互联网 发布:我的世界,java.net 编辑:程序博客网 时间:2024/05/22 10:42
数组里存储的是String、int、lang等基本数据类型或引用数据类型(不包括java bean)
转载:http://www.cnblogs.com/iyoume2008/p/6139925.html
一、在oracle中定义一个数组类型(TYPE)
代码如下:
createorreplacetypemsg_arrayastableofnumber;
意思是创建一个名称为msg_array,存放类型为整型的数组类型
二、在oracle中定义一个存储过程
代码如下:
createorreplaceproceduremodifyage(m_arrayinmsg_array)
as
begin
foriin1..m_array.countloop
updateuserssetage=age+1whereid=m_array(i);
endloop;
commit;
exception
whenothersthen
rollback;
endmodifyage;
创建一个存储过程,传入的参数是上面定义的msg_array类型,操作内容为循环传入的数组,对表的age字段做加1操作。
三、JAVA代码如下
Connectionconn =null;
CallableStatementcstmt =null;
try{
Class.forName("oracle.jdbc.OracleDriver");
conn= DriverManager.getConnection(
"jdbc:oracle:thin:@localhost:1521:orcl","orcl_dev",
"dev");
Listlist =newArrayList();
list.add(30);
list.add(31);
list.add(32);
list.add(33);
ArrayDescriptortabDesc = ArrayDescriptor.createDescriptor(
"MSG_ARRAY",conn);
ARRAYvArray =newARRAY(tabDesc, conn, list.toArray());
cstmt= conn.prepareCall("callmodifyage(?)");
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)定义数组描述方式。
在通过newARRAY(tabDesc, conn,list.toArray()),把要传入的数组按批定的数组描述方式生成一个新的Oracle定义的数组。
调用存储过程,传入参数并执行。
数组里存储的是javabean
一、在oracle中定义一个对象类型(OBJECT)
createorreplacetypeuserobjasobject(
id number,
usernamenvarchar2(20),
age number,
passwordnvarchar2(20)
)
意思是创建一个名称为userobj的对象类型,字符串的类型一定要写成nvarchar2,否则,传入数据库的字符串为null
二、在oracle中定义一个数组类型(TYPE)
代码如下:
createorreplacetypeobj_arrayastableofuserobj;
意思是创建一个名称为obj_array,存放类型为userobj的数组类型
三、在oracle中定义一个存储过程
代码如下:
createorreplaceproceduresaveObjArray
(
avc_objArrayin obj_array,
rowcountoutnumber,
msg outvarchar2
)as
userinfouserobj;
begin
foriinavc_objArray.First()..avc_objArray.Last()loop
userinfo:=avc_objArray(i);
insertintousers(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;
endsaveObjArray;
创建一个存储过程,传入的参数是上面定义的obj_array类型的数组,循环数组,分别插入数据库。返回受影响的行数和提式信息。
四、JAVA代码如下
Connectionconn =null;
CallableStatementcstmt =null;
try{
Class.forName("oracle.jdbc.OracleDriver");
conn= DriverManager.getConnection(
"jdbc:oracle:thin:@localhost:1521:orcl","orcl_dev",
"dev");
List<User>userList =newArrayList<User>();
Useruser =newUser();
user.setId(37);
user.setUsername("dddddd");
user.setPassword("dddddd");
user.setAge(14);
userList.add(user);
StructDescriptorrecDesc =
StructDescriptor.createDescriptor("USEROBJ",conn);
ArrayList<STRUCT>pstruct =newArrayList<STRUCT>();
for(Useru : userList){
Object[]objs =newObject[4];
objs[0]= u.getId();
objs[1]= u.getUsername();
objs[2]= u.getAge();
objs[3]= u.getPassword();
STRUCTstruct =newSTRUCT(recDesc, conn, objs);
pstruct.add(struct);
}
ArrayDescriptortabDesc =
ArrayDescriptor.createDescriptor("OBJ_ARRAY",conn);
ARRAYvArray =newARRAY(tabDesc, conn, pstruct.toArray());
cstmt= conn.prepareCall("callsaveObjArray(?,?,?)");
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(Exceptione){
e.printStackTrace();
}
首先定义Connection、CallableStatement2个变量,然后通过JDBC的方式得到Connection,然后定义要传给存储过程的数组。
映射Oracle端对象AS OBJECT类型
首先通过StructDescriptor.createDescriptor("USEROBJ",conn)定义对象描述方式。
然后,把javabean的各个属性赋值给Object类型的数组,通过newSTRUCT(recDesc, conn, objs)方法,把javabean按照对象描述方式描述成Oracle可以识别的对象。最后放到数组里。
映射Oracle端数组AS TABLE OF类型
通过ArrayDescriptor.createDescriptor("OBJ_ARRAY",conn)定义数组描述方式。
在通过newARRAY(tabDesc, conn,pstruct.toArray()),把要传入的数组按批定的数组描述方式生成一个新的Oracle定义的数组。
调用存储过程,传入参数并执行。
- 数组做为参数传入Oracle存储过程操作数据库
- 数组做为参数传入Oracle存储过程操作数据库
- oracle 向存储过程传入数组类型参数
- Java调用Oracle存储过程传入数组参数的方法
- java中的arrayList传入oracle中的以数组(array)为参数的存储过程
- java调用oracle存储过程传入参数为数组的处理
- java 调用oracle存储过程传入 数组参数 不用纯jdbc连接
- Oracle存储过程传入类似java中list、数组类型的参数并使用
- Oracle数据库中使用存储过程时对传入和传出参数的使用说明
- ORACLE存储过程传入参数值无法使用
- JAVA调用Oracle存储过程传入结构化参数
- Oracle 存储过程中的游标cursor使用传入参数
- java ibatis调动oracle传入clob参数的存储过程
- oracle存储过程中传入日期参数,插入到表
- Java中传入数组调用oracle存储过程
- 存储过程传入DataTable参数
- oracle 存储过程 传入时间
- java oracle存储过程/函数(1):字符串数组、int数组传入存储过程
- 在try,catch,finally中return,throw覆盖的问题总结
- linux中fork()函数详解(原创!!实例讲解)
- eclipse代码自动补全
- 数学之路(2)-数据分析-R基础(1)
- Codeforces 219D Choosing Capital for Treeland DP(Tree)
- 数组做为参数传入Oracle存储过程操作数据库
- 让时间处理简单化 【第三方扩展类库org.apache.commons.lang.time】
- WPF控件之RichTextbox
- centos7 查看.so导出函数
- css3 实现十字光标和光标外圆圈环绕
- 合理的电梯(水题 杭电排位赛-6)
- OpenCV3.2.0官网中文教程-索引
- 【备忘】2017新东方日语初级+中级+高级 高清视频【完整版无加密】
- 6:边框-1.1.2边框阴影