2009-10-29 8 views
7

Ich verwende Oracle SQL Developer, aber ich habe ein Problem, Ergebnisse von einem Paket zu sehen, das einen Ref-Cursor zurückgibt. Unten ist die Paketdefinition:Verwenden von Ref-Cursor in 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; 
/

Ich denke, die Frage ist dies möglich, und wenn ja, was muss ich tun. Ich verwende Oracle SQL Developer 1.5.5. Vielen Dank.

Wade

Hier ist der Code, den ich verwendet, mein Paket zu nennen (von TOAD generiert):

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; 

ich den Fehler:

ORA-06502: PL/SQL: numerische oder Wert Fehler

Hoffe das klärt es ein wenig mehr auf.

+0

Alles, was ich sehe, ist der SPC - wo ist der Bdy? –

+0

Welches "Problem" haben Sie? – kurosch

+0

Das Problem, das ich habe, ist, dass wenn ich versuche, den Ref-Cursor zu lesen, bekomme ich Fehler. Ich platzierte den SPC nur, um zu zeigen, wie meine ref cur aussieht und hoffentlich kann jemand mir den PL/SQL-Code zeigen, der in SQL Developer ausgeführt wird, um ihn auszugeben. – Wade73

Antwort

12

Sie einfach die Ausgabeergebnisse eines ref_cursor in SQL Developer drucken können den Rückgabewert zu sehen ..

Hier ist ein Beispiel für eine refcursor Funktion:

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; 

quick and dirty-Methode:

select get_employees() from dual; 

Saisonbedi Methode:

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

Machen Sie einfach eine Schleife, die durch den zurückgegebenen Ref-Cursor iteriert. Sie können über DBMS_OUTPUT.PUT_LINE() auf der Konsole ausgeben und bestimmte Felder auswählen, die angezeigt werden sollen.

+0

Ich habe eine Modifikation oben gemacht, da das nicht zu funktionieren scheint. – Wade73

0

Der einzige explizite Wert, die ich in dem erzeugten Programm zu sehen ist

P_AS_OF_DT := '31-AUG-2009'; 

Versuchen Sie, eine explizite Umwandlung (to_date ('31-AUG-2009', 'DD-MON-YYYY') statt, vielleicht ist das das Problem entledigt.

Wenn das nicht hilft Können Sie sehen, ob Ihr Fehler in der Sp-oder in der Code generiert wird? Wenn Sie nicht direkt herausfinden können, definieren Sie einen SP aus dem Code, einen Haltepunkt und Schritt durch den Code, um zu sehen, wo der Fehler kommt von

0

Es gibt keine Möglichkeit zu sagen, ohne zu sehen, was die Abfrage des Cursors ist. Sehen Sie sich die SELECT-Anweisung an, die Sie in der Prozedur SP ausführen. Eine der Spalten, die Sie in rec_type in ein numerisches Feld auswählen, gibt Zeichendaten zurück, die nicht in eine Zahl konvertiert werden können.

Anstatt herauszufinden, wie der Cursor ausgegeben wird, nehmen Sie die SELECT-Anweisung von sp und führen Sie sie eigenständig aus. Schauen Sie sich die Ergebnisse an, die Sie erhalten. Du wirst nach einigen nicht-einstelligen Werten suchen, die in einem der Felder, in denen du eine Zahl erwartest, zurückkommen.

1

In Ihrem Kommentar Sie sayHere ist der Fehler:

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

Was auch immer es wie manchmal, PL/SQL-Fehler werden nicht zufällig generiert erscheinen. Dieser Fehler verweist auf eine fehlerhafte Datentypkonvertierung, die in Zeile 16 der Prozedur auftritt. Ohne Ihre ganze Prozedur zu sehen, ist es uns nicht möglich, Zeile 16 zu lokalisieren.Glücklicherweise setzt der Code-Editor in SQL Developer Zeilennummern in den Gutter; Wenn Sie keine Zeilennummern sehen, müssen Sie eine Einstellung umschalten.

Sie müssen nach einer Zeichenfolge suchen, die in eine Zahlen- oder Datumsvariable umgewandelt wird, oder eine Zahl, die in ein Datumsfeld umgewandelt wird. Dies kann durch eine explizite TO_NUMBER() oder TO_DATE signalisiert werden. In diesem Fall müssen Sie die Formatmaske und/oder den Dateninhalt überprüfen. Alternativ können Sie eine implizite Besetzung haben. In diesem Fall müssen Sie es möglicherweise mit der entsprechenden Formatmaske explizit machen. Natürlich könnte es sich um eine versehentliche und unerwünschte Konvertierung handeln, da die Projektion der SELECT-Anweisung nicht mit der Signatur des REF CURSOR-Datensatzes übereinstimmt. Das ist einfach zu beheben.

8

Wenn Sie über ein Verfahren, das eine refcursor in der Unterzeichnung des proc erfordert, können Sie dies tun:

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

markieren und drücken Sie F5.

Verwandte Themen