簡體   English   中英

如何從CallableStatement中獲取對象。(無效的列索引)

[英]How to get Object from CallableStatement.(Invalid column index)

我需要在Java中執行過程PL sql。

我的PL / SQL。

TYPE REF_CURSOR IS REF CURSOR;
PROCEDURE GET_REPORT( P_account_number_param    IN VARCHAR2,
                      P_cycle_cut_param         IN VARCHAR2,
                      P_from_date_param         IN VARCHAR2,
                      P_to_date_param           IN VARCHAR2,
                      P_last_requested_by_param IN VARCHAR2,
                      P_worker_id_param         IN VARCHAR2,
                      P_requeset_type_param     IN VARCHAR2,
                      P_INQUIRY                 OUT REF_CURSOR,
                      P_RESULT                  out varchar2);

當我執行時拋出錯誤rs = (ResultSet) cstmt.getObject(8);
說明錯誤:無效的列索引。 廠商代碼:17003

我嘗試了多種方法來獲取索引1、2或8,但無法正常工作。

爪哇

CallableStatement cstmt = conn.prepareCall(sql);
int paramIdx = 1;
// pass IN parameter
if (params != null)
    for (int i = 0; i < params.length; i++) {
        cstmt.setString(paramIdx++, params[i]);
    }
// register result
cstmt.registerOutParameter(paramIdx++, OracleTypes.CURSOR);// index = 8
cstmt.registerOutParameter(paramIdx++, OracleTypes.VARCHAR);
cstmt.execute();
rs = (ResultSet) cstmt.getObject(8);
ResultSetMetaData md = rs.getMetaData();
int columns = md.getColumnCount();
results = new ArrayList<Map<String, Object>>();

這是我的PL / sql:

PROCEDURE GET__REPORT(P_account_number_param    IN VARCHAR2,
                                          P_cycle_cut_param         IN VARCHAR2,
                                          P_from_date_param         IN VARCHAR2,
                                          P_to_date_param           IN VARCHAR2,
                                          P_last_requested_by_param IN VARCHAR2,
                                          P_worker_id_param         IN VARCHAR2,
                                          P_requeset_type_param     IN VARCHAR2,
                                          P_INQUIRY                 OUT REF_CURSOR,
                                          P_RESULT                  out varchar2) is
SQL_STRING VARCHAR2(5000);
  BEGIN
BEGIN
 --OPEN P_INQUIRY FOR
 SQL_STRING := 'select a.account_number , a.cycle_cut , a.last_requested_by, a.last_requested_date , 
                CASE a.app_status 
                  WHEN ''I'' THEN ''Initial failed'' 
                  WHEN ''G'' THEN ''Generate failed''  
                  WHEN ''C'' THEN ''Check-In failed'' 
                  WHEN ''F'' THEN ''Send fax failed'' 
                  WHEN ''S'' THEN ''Successful'' 
                  ELSE a.app_status
                END as app_status
                , c.email 
                ,
                CASE c.email_status 
                  WHEN ''P'' THEN ''Wait'' 
                  WHEN ''Y'' THEN ''Success''
                  ELSE c.email_status 
                END as email_status 
                , d.fax_no 
                , 
                CASE d.fax_status 
                  WHEN ''P'' THEN ''Wait'' 
                  WHEN ''Y'' THEN ''Success''
                  WHEN ''D'' THEN ''Fax failed''
                  WHEN ''F'' THEN ''Gen Billing failed'' 
                  WHEN ''N'' THEN ''Billing not found'' 
                  WHEN ''U'' THEN ''CD not available'' 
                  ELSE d.fax_status 
                END as fax_status   
                from 
                ecm_billing_tax a LEFT JOIN ecm_billing_req b 
                ON a.billing_tax_id = b.billing_tax_id
                LEFT JOIN ecm_billing_tax_email c
                ON b.billing_tax_email_id = c.billing_tax_email_id
                LEFT JOIN ecm_billing_tax_fax d
                ON b.billing_tax_fax_id = d.billing_tax_fax_id
              Where a.account_number is not null ';


      IF P_account_number_param IS NOT NULL  THEN
            SQL_STRING := SQL_STRING ||' and a.account_number = ''' ||P_account_number_param || '''';
         END IF;
      IF P_cycle_cut_param IS NOT NULL  THEN
            SQL_STRING := SQL_STRING ||' and a.cycle_cut = to_date(''' ||P_cycle_cut_param || ''',''DD/MM/YYYY'') ';
         END IF;
      IF P_from_date_param IS NOT NULL  THEN
            SQL_STRING := SQL_STRING ||' and trunc(a.last_requested_date) >= to_date(''' ||P_from_date_param || ''',''DD/MM/YYYY'') ';
         END IF;
      IF P_to_date_param IS NOT NULL  THEN
            SQL_STRING := SQL_STRING ||' and trunc(a.last_requested_date) <= to_date(''' ||P_to_date_param || ''',''DD/MM/YYYY'') ';
         END IF;           
      IF P_last_requested_by_param IS NOT NULL  THEN        
              IF P_last_requested_by_param = 'ECM Poltal'  THEN
                    SQL_STRING := SQL_STRING ||' and a.last_requested_by = ''' ||P_worker_id_param || '''';
              ELSE
                    SQL_STRING := SQL_STRING ||' and a.last_requested_by = ''' ||P_last_requested_by_param || '''';
              END IF;
         END IF;             
      IF P_requeset_type_param IS NOT NULL  THEN        
              IF P_requeset_type_param = 'Fax'  THEN
                    SQL_STRING := SQL_STRING ||' and b.billing_tax_fax_id is not null ';
              ELSIF P_requeset_type_param = 'E-Mail'  THEN
                    SQL_STRING := SQL_STRING ||' and b.billing_tax_mail_id is not null ';
              END IF;
         END IF;

 OPEN P_INQUIRY FOR SQL_STRING;
  P_RESULT := 1;
EXCEPTION
  WHEN NO_DATA_FOUND THEN
    P_RESULT := 0;
  WHEN TOO_MANY_ROWS THEN
    P_RESULT := -1;
  WHEN OTHERS THEN
    P_RESULT := sqlerrm;

END;

END GET_REPORT;

請幫幫我。
謝謝前進。

我看到“ java.sql.SQLException:無效的列索引”的出現主要是由於兩個原因:

1) Setting column data using setXXXX(int coloumIndex) e.g. setInt(0) setString(0)
2) Getting column data using getXXX(int columnIndex) e.g. getInt(0) getString(0)

“ java.sql.SQLException:無效的列索引”的最常見原因是誤解,認為列索引以“ 0”開頭,例如數組或字符串索引,但事實並非如此,而是列索引以“ 1”開頭,因此無論何時嘗試獲取或設置列索引為“ 0”的列數據,您將獲得“ java.sql.SQLException:無效的列索引”。

檢查是否正在將params[i]分配給各個索引。 另外,檢查要在getObject()方法中傳遞的OUT參數索引。 它應該是8或9。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM