以下是本人的一个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;
}

解决方案 »

  1.   

    lz具体调用存储过程的代码并没有写出来,不知道是用否用的是自己写的框架,如果是自己的框架用callableStatement(JDBC)方式实现的话应该是不能出入数组形式的参数,建议可以把数组中的数据拼成字符串传入,到过程中自己再拆开。
      

  2.   

    个人意见,仅供参考。我认为你的对应类型
    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,判断数据正确。