入参为数组的存储过程调用问题

sxlcom 2009-03-05 11:07:19
以下是本人的一个J2EE项目中一个DAO中的方法,作用是调用ORACLE存储过程,入参是一个String数组,我在后台存储过程中用了自定义的类型来接受,但总是报内部错误,
(在入参数组转换成java.sql.Types.ARRAY报错)


---------------------------- 数据库部份----------------------------
create table study_array_nick_tab
(
name varchar2(200)
);

create or replace type study_array_nick_list is VARRAY(1000) of varchar2(200);



create or replace procedure study_array_nick(in_array in study_array_nick_list,aa out char) is
v_i number;
begin
for v_i in 1 .. in_array.count loop
insert into study_array_nick_tab(name) values(in_array(v_i));
end loop;

commit;
aa:='1';
exception when others then
rollback;
aa:='0';
raise_application_error('20999','测试错误');
end study_array_nick;


------------------------------------JAVA部份----------------------------------------------------

public String bulkinsert_StoredProcedureExecute(String[] param1) throws Exception{
BulkInsertStoredProcedure proc = new BulkInsertStoredProcedure(getJdbcTemplate().getDataSource()) ;
Map results = proc.execute(param1);
String re_Sring = printflag_1(results);
return re_Sring.trim();
}

private class BulkInsertStoredProcedure extends StoredProcedure {
public static final String SQL = "study_array_nick";
public BulkInsertStoredProcedure(DataSource ds) {
setDataSource(ds);
setSql(SQL);
setFunction(false);
declareParameter(new SqlParameter("IN_PROPERTIES", java.sql.Types.ARRAY,"study_array_nick_list"));
declareParameter(new SqlOutParameter("ob_status", OracleTypes.CHAR,
new RowMapper() {
public Object mapRow(ResultSet rs, int rowNum)
throws SQLException {
String vo = rs.getString(1);
return vo;
}
}));
compile();
}
public Map execute(String[] param1) {
Map inputs = new HashMap();
inputs.put("IN_PROPERTIES", param1);
return super.execute(inputs);
}
}
private String printflag_1(Map r) {
String re_status = null;
for (Iterator it = r.entrySet().iterator(); it.hasNext();) {
Map.Entry entry = (Map.Entry) it.next();
re_status = (String) entry.getValue();
}
return re_status;
}

...全文
285 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
songyun870 2009-03-08
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 mumu_java 的回复:]
lz具体调用存储过程的代码并没有写出来,不知道是用否用的是自己写的框架,如果是自己的框架用callableStatement(JDBC)方式实现的话应该是不能出入数组形式的参数,建议可以把数组中的数据拼成字符串传入,到过程中自己再拆开。
[/Quote]

同意....
jnh1983 2009-03-08
  • 打赏
  • 举报
回复
个人意见,仅供参考。

我认为你的对应类型
java: OracleTypes.CHAR,java.sql.Types.ARRAY
proc: varchar2(200),VARRAY(1000) of varchar2(200);

OracleTypes.CHAR==varchar2(200)?

调试过程:
1.procedure
单独运行procedure,证明procedure正确。


2.java
打印数据,或设置断点,得到输入procedure的数据,手动输入procedure,判断数据正确。
mumu_java 2009-03-06
  • 打赏
  • 举报
回复
lz具体调用存储过程的代码并没有写出来,不知道是用否用的是自己写的框架,如果是自己的框架用callableStatement(JDBC)方式实现的话应该是不能出入数组形式的参数,建议可以把数组中的数据拼成字符串传入,到过程中自己再拆开。
sxlcom 2009-03-05
  • 打赏
  • 举报
回复
顶一下,怎么没有人回呀,大家没有遇到过这样的情况吗?

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧