簡體   English   中英

在Oracle SQL Developer中使用Ref Cursor

[英]Using Ref Cursor in Oracle SQL Developer

我正在使用Oracle SQL Developer,但是我在查看返回引用游標的包的結果時遇到了問題。 以下是包裝定義:

CREATE OR REPLACE package instance.lswkt_chgoff_recov
as
      type rec_type is record
            (
            source_cd                       lswk_tpr.gltrans.tpr_source_cd%TYPE,
            as_of_dt                        lswk_tpr.gltrans.tpr_as_of_dt%TYPE,
            chrg_off_recov                  varchar2(5),
            process_dt                      lswk_tpr.gltrans.dtgltran%TYPE,
            effect_dt                       lswk_tpr.gltrans.dtgltran%TYPE,
            account_nbr                     lswk_tpr.contract.lcontid%TYPE,
            naics_cd                        lswk_tpr.udfdata.sdata%TYPE,
            prod_type                       varchar2(20),
            off_nbr                         lswk_tpr.schedule.sctrcdty%TYPE,
            borrower_nm                     lswk_tpr.customer.scustnm%TYPE,
            tran_type_cd                    lswk_tpr.gltrans.sglcd%TYPE,
            tran_type_desc                  lswk_tpr.gltrans.sglcd%TYPE,
            tran_amt                        lswk_tpr.gltrans.ctranamt%TYPE,
            note_dt                         lswk_tpr.schedule.dtbk%TYPE,
            accru_cd                        number,
            non_accr_cd                     lswk_tpr.schedule.dtlstincsus%TYPE,
            comm_sb_ind                     varchar2(4)
            );

      type cur_type is ref cursor return rec_type;

      procedure sp
            (
            p_as_of_dt              in      date,
            ref_cur                 in out  cur_type
            );
end;
/

我想這個問題是可能的,如果是的話,我需要做什么。 我正在使用Oracle SQL Developer 1.5.5。 謝謝。

這是我用來調用我的包的代碼(由TOAD生成):

DECLARE 
  P_AS_OF_DT DATE;
  REF_CUR instance.LSWKT_CHGOFF_RECOV.CUR_TYPE;
  REF_CUR_row REF_CUR%ROWTYPE;

BEGIN 
  P_AS_OF_DT := '31-AUG-2009';

  instance.LSWKT_CHGOFF_RECOV.SP ( P_AS_OF_DT, REF_CUR );

  DBMS_OUTPUT.Put_Line('REF_CUR =');
  IF REF_CUR%ISOPEN THEN
  DBMS_OUTPUT.Put_Line('  SOURCE_CD  AS_OF_DT  CHRG_OFF_RECOV  PROCESS_DT  EFFECT_DT  ACCOUNT_NBR  NAICS_CD  PROD_TYPE  OFF_NBR  BORROWER_NM  TRAN_TYPE_CD  TRAN_TYPE_DESC  TRAN_AMT  NOTE_DT  ACCRU_CD  NON_ACCR_CD  COMM_SB_IND');
    LOOP
      FETCH REF_CUR INTO REF_CUR_row;
      EXIT WHEN REF_CUR%NOTFOUND;
      DBMS_OUTPUT.Put_Line(
           '  ' || '[TPR_SOURCE_CD%type]'
        || '  ' || '[TPR_AS_OF_DT%type]'
        || '  ' || '''' || REF_CUR_row.CHRG_OFF_RECOV || ''''
        || '  ' || '[DTGLTRAN%type]'
        || '  ' || '[DTGLTRAN%type]'
        || '  ' || '[LCONTID%type]'
        || '  ' || '[SDATA%type]'
        || '  ' || '''' || REF_CUR_row.PROD_TYPE || ''''
        || '  ' || '[SCTRCDTY%type]'
        || '  ' || '[SCUSTNM%type]'
        || '  ' || '[SGLCD%type]'
        || '  ' || '[SGLCD%type]'
        || '  ' || '[CTRANAMT%type]'
        || '  ' || '[DTBK%type]'
        || '  ' || NVL(TO_CHAR(REF_CUR_row.ACCRU_CD), 'NULL')
        || '  ' || '[DTLSTINCSUS%type]'
        || '  ' || '''' || REF_CUR_row.COMM_SB_IND || '''');
    END LOOP;
  ELSE
    DBMS_OUTPUT.Put_line('  (Ref Cursor is closed)');
  END IF;


  COMMIT; 
END;

我收到錯誤:

ORA-06502:PL / SQL:數值或值錯誤

希望這能把它搞清楚一點。

您可以在SQL Developer中輕松打印ref_cursor的輸出結果以查看返回值。

這是一個Refcursor函數的例子:

create or replace function get_employees() return sys_refcursor as
  ret_cursor sys_refcursor;
begin
  open ret_cursor for
    select * from employees;
  return ret_cursor; 
end get_employees;

快速而骯臟的方法:

select get_employees() from dual; 

干凈整潔的方法:

variable v_ref_cursor refcursor;
exec :v_ref_cursor := get_employees(); 
print :v_ref_cursor

如果你有一個程序需要在proc的簽名中使用refcursor,你可以這樣做:

var rc refcursor;
execute <package>.my_proc(:rc);
print rc;

突出顯示並點擊F5。

我在生成的程序中看到的唯一顯式值是

 P_AS_OF_DT := '31-AUG-2009';

嘗試顯式轉換( to_date ('31-AUG-2009', 'DD-MON-YYYY') ,也許可以解決問題。

如果這沒有幫助,你能看到你的錯誤是在sp或yor代碼中生成的嗎? 如果您無法直接解決這個問題,請從您擁有的代碼中定義一個sp,設置一個斷點並逐步執行代碼以查看錯誤的來源。

在你的評論中,你說這是錯誤:

ORA-06502:PL / SQL:數字或值錯誤ORA-06512:第16行

無論有時看起來如何,PL / SQL錯誤都不是隨機生成的。 此錯誤指向在您的過程的第16行發生的有缺陷的數據類型轉換。 在沒有看到整個過程的情況下,我們無法確定第16行。幸運的是,SQL Developer中的代碼編輯器會將行號放在陰溝中; 如果您沒有看到行號,則需要切換首選項。

您需要查找的是將字符串強制轉換為數字或日期變量,或者將數字強制轉換為日期字段。 這可以通過顯式TO_NUMBER()或TO_DATE來發出信號,在這種情況下,您需要檢查格式掩碼和/或數據內容。 或者,您可能有隱式演員表。 在這種情況下,您可能需要使用適當的格式掩碼使其顯式化。 當然,這可能是意外和不需要的轉換,因為SELECT語句的投影與REF CURSOR記錄的簽名不匹配。 這很容易解決。

只需創建一個循環,循環返回引用的ref游標。 您可以使用DBMS_OUTPUT.PUT_LINE()輸出到控制台並選擇要顯示的特定字段。

沒有看到光標的查詢是什么就沒有辦法告訴你。 看一下您在SP過程中運行的SELECT語句。 您在rec_type中選擇數字字段的列之一是返回字符數據,該字符數據無法轉換為數字。

而不是試圖弄清楚如何輸出游標,從sp獲取SELECT語句並獨立運行它。 向下看你得到的結果。 您將在一個您期望數字的字段中查找一些非數字值。

暫無
暫無

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

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