2009-10-29 18 views
7

Używam Oracle SQL Developer, ale mam problem z wyświetlaniem wyników z pakietu, który zwraca kursor ref. Poniżej znajduje się definicja pakietu:Używanie kursora Ref w 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; 
/

Domyślam się, że to jest możliwe, a jeśli tak, to co muszę zrobić. Korzystam z Oracle SQL Developer 1.5.5. Dzięki.

Wade

Oto kod użyłem zadzwonić do mojego pakietu (generowane przez 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; 

pojawia się błąd:

ORA-06502: PL/SQL: numeryczny lub błąd wartości

Mam nadzieję, że to wyczyści nieco więcej.

+0

Wszystko co widzę to spc - gdzie jest bdy? –

+0

Jaki "problem" masz? – kurosch

+0

Problem, który mam, polega na tym, że gdy próbuję odczytać kursor ref, otrzymuję błędy. Umieściłem Spc tylko po to, by pokazać, jak wygląda moja ref ref, i mam nadzieję, że ktoś może mi pokazać kod PL/SQL, który będzie działał w SQL Developer, aby go wyprowadzić. – Wade73

Odpowiedz

12

można łatwo wydrukować wyniki wyjściowe o ref_cursor w SQL Developer, aby zobaczyć wartość powrotną ..

Oto przykład funkcji 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; 

Szybki i brudny sposób:

select get_employees() from dual; 

czyste i uporządkowany sposób:

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

Po prostu wykonaj pętlę, która jest iterowana przez zwróconą kursor ref. Możesz wyprowadzać dane na konsolę, używając DBMS_OUTPUT.PUT_LINE() i wybierając określone pola do wyświetlenia.

+0

Zrobiłem modyfikację powyżej, ponieważ to nie działa. – Wade73

0

Jedyną wyraźną wartość, którą widzę w wygenerowanym programie jest

P_AS_OF_DT := '31-AUG-2009'; 

Spróbuj wyraźną przemianę (to_date ('31-AUG-2009', 'DD-MON-YYYY') zamiast, może to pozbywa się problemu.

Jeśli to nie pomoże , czy widzisz, czy Twój błąd jest generowany w kodzie sp lub yor? Jeśli nie możesz tego dokładnie określić, zdefiniuj sp z posiadanego kodu, ustaw punkt przerwania i przejdź przez kod, aby zobaczyć, gdzie pojawia się błąd od.

0

Nie ma sposób powiedzieć, nie widząc, jakie jest zapytanie kursora. Spójrz na instrukcję SELECT, którą uruchamiasz w procedurze SP. Jedną z kolumn, którą wybierasz w polu liczbowym w rec_type, jest zwracanie danych znakowych, których nie można przekonwertować na liczbę.

Zamiast próbować dowiedzieć się, jak wyprowadzić kursor, weź instrukcję SELECT z sp i uruchom ją jako samodzielną. Spójrz na wyniki, które otrzymujesz. Będziesz szukał wartości niecyfrowych powracających w jednym z pól, w których spodziewasz się numeru.

1

W swoim komentarzu możesz sayHere jest błąd:

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

Cokolwiek może wyglądać czasami błędy PL/SQL nie są generowane losowo. Ten błąd wskazuje na błędną konwersję typu danych, która występuje w linii 16 procedury. Nie widząc całej procedury, nie możemy wskazać linii 16.Na szczęście edytor kodu w SQL Developer umieści numery linii w rynnie; jeśli nie widzisz numerów linii, musisz przełączyć preferencję.

Należy wyszukać ciąg będący rzutowany na zmienną liczby lub daty lub liczbę rzutowaną na pole daty. Może to być sygnalizowane przez TO_NUMBER() lub TO_DATE, w którym to przypadku musisz sprawdzić maskę formatu i/lub zawartość danych. Alternatywnie możesz mieć niejawną obsadę. W takim przypadku może być konieczne wyraźne podanie odpowiedniej maski formatu. Oczywiście może to być przypadkowa i niechciana konwersja, ponieważ rzutowanie instrukcji SELECT nie jest zgodne z sygnaturą rekordu REF CURSOR. To jest łatwe do naprawienia.

8

Jeśli masz procedurę, która wymaga refcursor w podpisaniu proc, można to zrobić:

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

Zaznacz i uderzył F5.

Powiązane problemy