如何检索在java中作为对象类型的OUT参数的数据

时间:2015-03-09 05:50:51

标签: java jdbc plsql

oracle类型是

    create or replace type course_info as object(col1 varchar2(10),col2 varchar2(10));
    create or replace type t_course_info as table of course_info;

procedure p_course_info(
course_term IN varchar2,
user_name IN varchar2,
out_type OUT t_course_info,
out_error_code OUT number,
out_error_message OUT varchar2)
is
begin
out_type := t_course_info();
out_type.extend;
out_type(1) := course_info('abc','xyz');
end p_course_info;

Java代码

STRUCT output_oracle_record;
    Object[] return_record_array = new Object[2];
    CallableStatement csmt=null;
String SQL = "{call student_api.p_course_info (?,?,?,?,?)";
         System.out.println(" call success");
         try {
            csmt = con.prepareCall (SQL);
            csmt.setString(1, course);
            csmt.setString(2, username);
            csmt.registerOutParameter(3,OracleTypes.STRUCT,"T_COURSE_INFO");
            csmt.registerOutParameter(4, OracleTypes.INTEGER);
            csmt.registerOutParameter(5, OracleTypes.VARCHAR);

            csmt.execute();
            output_oracle_record=((OracleCallableStatement)csmt).getSTRUCT(3);
            return_record_array= output_oracle_record.getAttributes();
            System.out.println("return"+return_record_array[0]);

当我执行上面的操作时,由于无法构造描述符而出现错误:无效的参数。任何人都可以帮我解决错误

1 个答案:

答案 0 :(得分:0)

由于您的OUT参数属于table类型,因此您需要注册OracleTypes.ARRAY作为第三个输出参数。

你读它的方式应该是这样的:

Object[] data = (Object[]) ((Array) csmt.getObject(3)).getArray();
for (Object datum : data) {
    Struct row = ((Struct) datum).getAttributes();
    // do what as you will here with the object.
}