以下是本人的一个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;
}
(在入参数组转换成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;
}
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,判断数据正确。