数组做为参数传入Oracle存储过程操作数据库
2016-12-07 09:35
381 查看
p { margin-bottom: 0.25cm; direction: ltr; color: rgb(0, 0, 0); line-height: 120%; text-align: justify }
p.western { font-family: "Times New Roman", serif; font-size: 10pt }
p.cjk { font-family: "宋体", "SimSun"; font-size: 10pt }
p.ctl { font-family: "Times New Roman", serif; font-size: 10pt }
数组里存储的是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定义的数组。
调用存储过程,传入参数并执行。
p.western { font-family: "Times New Roman", serif; font-size: 10pt }
p.cjk { font-family: "宋体", "SimSun"; font-size: 10pt }
p.ctl { font-family: "Times New Roman", serif; font-size: 10pt }
数组里存储的是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定义的数组。
调用存储过程,传入参数并执行。
相关文章推荐
- 数组做为参数传入Oracle存储过程操作数据库
- 数组做为参数传入Oracle存储过程操作数据库
- 数组做为参数传入Oracle存储过程操作数据库
- JavaScript抽奖翻牌游戏/定义数组保存传入参数数组,避免操作传入数组/洗牌动作队列洗牌及翻牌效果
- 如何把多维数组传入函数做为参数之几个方法
- mybatis批量操作之传入类型为数组及多个参数,使用@Parm注解完美解决
- Mybatis mapper配置文件传入数组参数,同时操作一组数据
- 好东西:让存储过程的参数也能传入数组的方法
- 给数据库传递组合字符串参数,类似数组的解决方法
- 使用函数传递参数来执行相应的数据库操作
- ORACLE存储过程使用数组参数
- .NET调用ORACLE存储过程使用数组参数
- 关于arrylist的一些操作(包含利用params传递数组参数)
- 项目问题-------传入存储过程中的参数的长度一定要和数据库表的字段长度保持一直
- 数组做为参数传递给函数
- c# 操作mssql数据库 含有带参数sql语句运行
- ORACLE存储过程使用数组参数
- 使用函数传递参数来执行数据库操作
- .NET调用Oracle存储过程,使用数组类型的参数(如ArrayList)
- 传入参数,动态的组织N个数组的所有对数