数组做为参数传入Oracle存储过程操作数据库

1.注意匿名内部类中的参数con转换成新的conn会导致con无法关闭,抛出关闭的连接异常

2.没导入或多导入会抛出orai18n.jar

oraclei18ntextconverterCharacterConverterOGS.getInstance(I)Loraclei18ntextconverterCharacterConverter;

3.想要传入数组进存储过程必须Connection转OracleConnection

OracleConnection oracleConnection= connection.unwrap(OracleConnection.class);

try(Connection conn = jdbcTemplate.getDataSource().getConnection();

OracleConnection  con = conn.unwrap(OracleConnection.class);)

以上这种方式也会导致conn连接由unwrap转换了,然后又关闭,会警告关闭的连接

所以改成:

try (OracleConnection con = 
pagedJdbcTemplate.getDataSource().getConnection().unwrap(OracleConnection.class);)

4.数据库映射数组参数中varchar2改成nvarchar2才能传入字符

5.java中传入的数组参数必须是数组类型,不能是集合也不会由Object自动转换

数组里存储的是Stringintlang等基本数据类型或引用数据类型(不包括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();

}

首先定义ConnectionCallableStatement2个变量,然后通过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();

}

首先定义ConnectionCallableStatement2个变量,然后通过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定义的数组。

调用存储过程,传入参数并执行

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值