Frage

Ich verwende Oracle SQL Developer, aber ich habe ein Problem, in dem Ergebnisse aus einem Paket angezeigt werden, das einen Ref Cursor zurückgibt. Unten finden Sie die Paketdefinition:

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.

Waten

Hier ist der Code, den ich verwendet habe, um mein Paket (von Toad generiert) aufgerufen zu haben:

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 bekomme den Fehler:

ORA-06502: PL/SQL: Numerischer oder Wertfehler

Ich hoffe, das klärt es ein bisschen mehr auf.

War es hilfreich?

Lösung

Sie können die Ausgabeergebnisse eines Ref_Cursors im SQL -Entwickler problemlos drucken, um 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;

Schnelle und schmutzige Methode:

select get_employees() from dual; 

Nute und ordentliche Methode:

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

Andere Tipps

Wenn Sie ein Verfahren haben, bei dem ein RefCursor bei der Unterschrift des Proc erforderlich ist, können Sie dies tun:

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

Highlight und schlagen Sie F5.

Der einzig explizite Wert, den ich im generierten Programm sehe, ist

 P_AS_OF_DT := '31-AUG-2009';

Versuchen Sie eine explizite Konvertierung (to_date ('31-AUG-2009', 'DD-MON-YYYY') Stattdessen wird das vielleicht das Problem los.

Wenn das nicht hilft, können Sie dann sehen, ob Ihr Fehler im SP oder im YOR -Code generiert wird? Wenn Sie dies nicht direkt herausfinden können, definieren Sie einen SP aus dem Code, den Sie haben, einen Haltepunkt und treten Sie durch den Code, um festzustellen, woher der Fehler stammt.

In Ihrem Kommentar ist Sie Sayhere der Fehler:

ORA-06502: PL/SQL: Numerischer oder Wertfehler ORA-06512: in Zeile 16

Was auch immer es manchmal erscheint, PL/SQL -Fehler werden nicht zufällig generiert. Dieser Fehler verweist auf eine fehlerhafte Datentypkonvertierung, die in Zeile 16 Ihres Verfahrens auftritt. Ohne Ihre gesamte Prozedur zu sehen, ist es für uns nicht möglich, Zeile 16 zu bestimmen. Glücklicherweise stellt der Code -Editor in SQL Developer Zeilennummern in die Dachrinne ein. Wenn Sie keine Zeilennummern sehen, müssen Sie eine Präferenz umschalten.

Was Sie suchen müssen, ist eine Zeichenfolge, die auf eine Nummer oder eine Datumsvariable gegossen wird, oder eine Nummer, die auf ein Datumsfeld gegossen wird. Dies kann durch einen expliziten 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 eine zufällige und unerwünschte Konvertierung sein, da die Projektion der Auswahlanweisung nicht mit der Signatur des Ref Cursor -Datensatzes übereinstimmt. Das ist leicht zu reparieren.

Machen Sie einfach eine Schleife, die durch den Ref Cursor zurückgekehrt ist. Sie können mithilfe der Konsole ausgeben DBMS_OUTPUT.PUT_LINE() und Auswählen bestimmter Felder, die zu zeigen sind.

Es gibt keine Möglichkeit zu sagen, ohne zu sehen, was die Abfrage des Cursors ist. Schauen Sie sich die Auswahlanweisung an, die Sie in der Prozedur SP ausführen. Einer der Spalten, die Sie in einem numerischen Feld in rec_type auswählen, sind die Zeichendaten, die nicht in eine Zahl konvertiert werden können.

Anstatt zu versuchen, herauszufinden, wie man den Cursor ausgibt, nehmen Sie die Auswahlanweisung von SP und führen Sie ihn eigenständig aus. Schauen Sie die Ergebnisse nach unten, die Sie erhalten. Sie werden nach einigen nicht stellenden Werten suchen, die in einem der Felder zurückkommen, auf denen Sie eine Zahl erwarten.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top