怎么在存储过程中定义out参数是游标?
怎么在java程序中接收存储过程out参数是%rowtype类型的变量

解决方案 »

  1.   

    1.create or replace procedure aaaaa1 (
        p_user_id_i  in  varchar2,
        o_cur out sys_refcursor

    as
    begin
        open o_cur for select * from test where t1 = p_user_id_i;
    end aaaaa1;
    /
    2.java接收%ROWTYPE?还不如返回一个只有一行的游标。下面的DBI.TYPE.T_SMS_TASK是我自定义的类型,不知道java怎么处理%ROWTYPE,我没试过,一般我都用游标返回%ROWTYPE 的。
    public static SMSTaskObj selectSmsTask(int terminateTime) {
    ICallableStatement cs = null;
    SMSTaskObj taskObj = null;
    try {
    cs = DbFactory.getInstance().getCallableStatement(
    DBI.SERVER_DB_NAME, PROC_SEL_SMS_TASK); cs.setInt(1, terminateTime);
    cs.registerOutParameter(2, OracleTypes.STRUCT, DBI.TYPE.T_SMS_TASK);
    cs.registerOutParameter(3, OracleTypes.INTEGER);
    cs.execute(); int retVal = cs.getInt(3); if (retVal != 0) {
    throw new Exception("Oracle procedure PROC_SEL_SMS_TASK error!");
    } STRUCT struct = (STRUCT) cs.getObject(2); Datum[] dt = struct.getOracleAttributes(); if (String.valueOf(dt[0].bigDecimalValue()).equals("-1")) {
    return null;
    } taskObj = new SMSTaskObj(); taskObj.setTaskId(String.valueOf(dt[0].bigDecimalValue()));
    taskObj.setTempId(String.valueOf(dt[1].bigDecimalValue()));
    taskObj.setUserGroupId(String.valueOf(dt[2].bigDecimalValue()));
    taskObj.setUserId(String.valueOf(dt[3].bigDecimalValue()));
    taskObj.setTempContent(dt[4].toString());
    taskObj.setParamAmount(dt[5].intValue());
    taskObj.setPriorityLevel(String.valueOf(dt[6].intValue())); } catch (Exception ex) {

    log.error(ex);
    } finally {
    try {
    if (cs != null)
    cs.close(); } catch (SQLException sqle) {
    log.error(sqle);
    }
    }
    return taskObj;
    }