2009-10-29 84 views
7

我正在使用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:數字或值錯誤

希望這會使它更清晰一點。

+0

我看到的全部是spc - 哪裏是bdy? – 2009-10-29 18:16:25

+0

你有什麼「問題」? – kurosch 2009-10-29 18:27:03

+0

我遇到的問題是,當我嘗試閱讀參考遊標時,我得到錯誤。爲了顯示我的參考看起來像什麼,並且希望有人能夠向我展示要在SQL Developer中運行的PL/SQL代碼以輸出它,我放置了spc。 – Wade73 2009-10-29 19:21:51

回答

12

您可以輕鬆打印ref_cursor的輸出結果在SQL Developer中看到的返回值..

這裏有一個指針函數的例子:

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 
0

只需製作一個循環,該循環遍歷返回的參考光標。您可以使用DBMS_OUTPUT.PUT_LINE()並選擇要顯示的特定字段輸出到控制檯。

+0

我上面做了一個修改,因爲這似乎沒有工作。 – Wade73 2009-10-29 20:11:31

0

我在生成的程序看到的唯一明確的值是

P_AS_OF_DT := '31-AUG-2009'; 

嘗試顯式轉換(to_date ('31-AUG-2009', 'DD-MON-YYYY')代替,也許擺脫了這個問題。

如果沒有幫助,你可以看到你的錯誤是在sp還是在你的代碼中產生的?如果你不能直接看出來,從你的代碼中定義一個sp,設置一個斷點並遍歷代碼,看看錯誤來自哪裏from。

0

There's no不看光標的查詢是什麼的方式。看看你在程序SP中運行的SELECT語句。在rec_type中選擇一個數字字段的列之一是返回字符數據,該數據無法轉換爲數字。

不是試圖弄清楚如何輸出遊標,而是從sp中取出SELECT語句並單獨運行。看看你得到的結果。您將要尋找一些您希望得到數字的字段中的一些非數字值。

1

在你的評論sayHere是錯誤:

ORA-06502: PL/SQL: numeric or value error ORA-06512: at line 16

不管它可能會出現像有些時候,不是隨機生成的PL/SQL的錯誤。此錯誤指向您的過程的第16行中出現的有缺陷的數據類型轉換。沒有看到你的整個程序,我們不可能找出第16行。幸運的是,SQL Developer中的代碼編輯器會將行號放入裝訂線中;如果您沒有看到行號,則需要切換首選項。

你需要查找的是一個字符串被轉換爲數字或日期變量,或將數字轉換爲日期字段。這可以通過明確的TO_NUMBER()或TO_DATE來指示,在這種情況下,您需要檢查格式掩碼和/或數據內容。或者,你可能有一個隱式強制轉換。在這種情況下,您可能需要使用適當的格式掩碼來明確它。當然,由於SELECT語句的投影與REF CURSOR記錄的簽名不匹配,它可能是意外和不必要的轉換。這很容易解決。

8

如果您有需要在proc的簽名一個指針的程序,你可以這樣做:

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

選中,然後按F5。