Mit Ref Cursor in Oracle SQL-Developer
Bin ich mit dem Oracle SQL-Developer, aber ich habe ein Problem sehen, Ergebnisse aus einem Paket, das gibt einen ref-cursor. Unten ist die Paket-definition:
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 das möglich und wenn ja, was muss ich tun. Ich bin mit Oracle SQL Developer 1.5.5. Danke.
Wade
Hier ist der code, den ich verwendet, um rufen Sie mein Paket (erstellt von 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;
Bekomme ich die Fehlermeldung:
ORA-06502: PL/SQL: numerische oder Wert-Fehler
Hoffe, das klärt es ein wenig mehr.
- Alles, was ich sehe, ist die spc - wo ist der bdy?
- Was "die Frage" sind Sie mit?
- Das Problem, das ich habe ist, dass wenn ich versuche zu Lesen, den ref cursor bekomme ich Fehler. Ich legte die spc-nur um zu zeigen, was mein ref cur aussieht und ich hoffe, jemand kann mir zeigen, die PL/SQL-code ausführen in SQL Entwickler ausgegeben werden.
- Was ist die Nummer der Zeile mit dem Fehler verknüpfte? Für das, was Sie haben, ich glaube, es hat zu tun mit dem Auffüllen der
rec_type.accru_cd
imSP
Verfahren... - Hier ist der Fehler: ORA-06502: PL/SQL: numerische oder Wert-Fehler ORA-06512: in Zeile 16
Du musst angemeldet sein, um einen Kommentar abzugeben.
Können Sie leicht drucken Sie die Ausgabe-Ergebnisse einer ref_cursor im SQL Developer zu sehen, die Rückkehr Wert..
Hier ist ein Beispiel für ein Refcursor-Funktion:
Quick-and-dirty-Methode:
Sauber und ordentlich-Methode:
Wenn Sie ein Verfahren, das erfordert ein refcursor " in der Signatur der Prozedur, die Sie dies tun können:
Markieren, und drücken Sie die Taste F5.
Nur die expliziten Wert, den ich sehe in das erzeugte Programm ist
Versuchen, eine explizite Konvertierung (
to_date ('31-AUG-2009', 'DD-MON-YYYY')
statt, vielleicht entledigt sich des Problems.Wenn das nicht hilft, können Sie sehen, ob Ihre Fehler in der sp-oder in Y-code? Wenn Sie nicht dieses heraus direkt an, definieren Sie eine sp von dem code, den Sie haben, einen Haltepunkt setzen und den code schrittweise Durchlaufen, um zu sehen, wo der Fehler herkommt.
In Ihrem Kommentar, auf den Sie sayHere ist der Fehler:
Was auch immer es erscheinen mag, wie manchmal, PL/SQL-Fehler werden nicht zufällig generiert werden. Dieser Fehler weist auf eine fehlerhafte Konvertierung der Datentypen, die tritt in Zeile 16 der Prozedur. Ohne zu sehen, Ihre ganze Vorgehensweise ist es uns nicht möglich, genau festzustellen, Zeile 16. Glücklicherweise ist der Code-Editor in SQL Entwickler setzen Zeilennummern im Bundsteg; wenn Sie nicht sehen, die Linie von zahlen, die Sie brauchen, um umzuschalten, eine Präferenz.
Was Sie suchen müssen, ist ein string gegossen, um eine Zahl oder ein Datum, eine variable oder eine Zahl wird umgewandelt in ein Datum-Feld. Dies kann signalisiert werden durch eine explizite TO_NUMBER() oder TO_DATE, in dem Fall müssen Sie die format-Maske und/oder die Inhalte der Daten. Alternativ können Sie einen impliziten cast. In diesem Fall müssen Sie eventuell machen Sie ausdrücklich, mit dem entsprechenden format Maske. Natürlich könnte es sein, eine unbeabsichtigte und unerwünschte Umwandlung, weil die Projektion der SELECT-Anweisung nicht mit der Unterschrift des REF CURSOR-Datensatz. Das ist einfach zu beheben.
Einfach eine Schleife, die durchläuft das ref cursor zurückgegeben. Sie können die Ausgabe an der Konsole mit
DBMS_OUTPUT.PUT_LINE()
und Auswahl bestimmter Felder zu zeigen.Gibt es keine Möglichkeit zu sagen, ohne zu sehen, was die cursor-Abfrage ist. Werfen Sie einen Blick auf die SELECT-Anweisung, die Sie ausführen möchten in dem Verfahren SP. Ein von der Spalte, die Sie auswählen, wird in ein numerisches Feld in rec_type ist die Rückkehr Charakter von Daten, die nicht in eine Zahl umgewandelt werden.
Anstatt zu versuchen, herauszufinden, wie die Ausgabe der cursor, nehmen Sie die SELECT-Anweisung von sp und führen es eigenständig. Schauen Sie unten auf der Ergebnisse, die Sie erhalten. Sie sind auf der Suche für einige non-stellige Werte kommen zurück in eines der Felder, wo Sie erwarten eine Zahl.