Ich habe eine Prozedur in Oracle, ich habe einen Fehler festgestellt, aber der Wert von p_out_msg wird nicht geändert. Warum ist das so? Der Fehler geht stattdessen zum Cursor.
Code:
PROCEDURE get_proj(p_date IN VARCHAR2,
p_out_cur OUT sys_refcursor,
p_out_msg OUT VARCHAR2)
IS
BEGIN
OPEN p_out_cur FOR
SELECT *
FROM table t
WHERE TO_DATE(p_date, 'DD-MM-YYYY HH24:MI:SS') = t.date
p_out_msg := 'SUCCESS';
EXCEPTION
WHEN OTHERS THEN
p_out_msg := SUBSTR('An error was encountered: '||SQLERRM, 1, 250);
END get_proj;
Angenommen, ich habe ein ungültiges Datum eingegeben:
Ausgabe:
p_out_cur: ORA-01858: a non-numeric character was found where a numeric was expected
p_out_msg: SUCCESS
Hier ist der anonyme Block, wie angefordert von @brenners1302
:
DECLARE
P_DATE VARCHAR2(200);
P_OUT_CUR sys_refcursor;
P_OUT_MSG VARCHAR2(200);
BEGIN
P_DATE := '1111';
PACKAGE_TEST.GET_PROJ(
P_DATE => P_DATE,
P_OUT_CUR => P_OUT_CUR,
P_OUT_MSG => P_OUT_MSG
);
DBMS_OUTPUT.PUT_LINE(P_OUT_MSG); --SUCCESS
END;
Wenn Sie einen Cursor mit OPEN p_out_cur FOR
der Abfrage öffnen, SELECT * FROM ...
wird diese momentan nicht ausgeführt, sondern nur der Cursor-Variablen zugeordnet. So kann eine Ausnahme angezeigt , wenn Sie beginnen FETCH
ab p_out_cur
, denn das ist , wenn die zugehörige Abfrage seine Ausführung beginnt.
Der einfachste Weg, dies zu sehen, besteht darin, Ihr Verfahren auf diese Weise zu ändern.
PROCEDURE get_proj(p_date IN VARCHAR2,
p_out_cur OUT sys_refcursor,
p_out_msg OUT VARCHAR2)
IS
l_rec myTable%ROWTYPE;
BEGIN
OPEN p_out_cur FOR
SELECT *
FROM myTable t
WHERE TO_DATE(p_date, 'DD-MM-YYYY HH24:MI:SS') = t.date
-- at this point we can get an exception
FETCH p_out_cur INTO l_rec;
p_out_msg := 'SUCCESS';
EXCEPTION
WHEN OTHERS THEN
p_out_msg := SUBSTR('An error was encountered: '||SQLERRM, 1, 250);
END get_proj;
Ja, es bedeutet, dass derjenige, der versucht, ihn abzurufen, eine Ausnahme erhalten kann, wenn Sie einen Ref-Cursor öffnen und an die 'Außenwelt' übergeben. Sie können die Anzahl solcher Fälle verringern, indem Sie Parameter überprüfen, bevor Sie sie an die in SQL verwendeten Funktionen übergeben, die Cursorn zugeordnet sind. Beispielsweise,
PROCEDURE get_proj(p_date IN VARCHAR2,
p_out_cur OUT sys_refcursor,
p_out_msg OUT VARCHAR2)
IS
l_normal_date DATE;
BEGIN
-- if p_date has wrong format we better find it out
-- before using it in a query
l_normal_date := TO_DATE(p_date, 'DD-MM-YYYY HH24:MI:SS');
OPEN p_out_cur FOR
SELECT *
FROM myTable t
WHERE l_normal_date = t.date
p_out_msg := 'SUCCESS';
EXCEPTION
WHEN OTHERS THEN
p_out_msg := SUBSTR('An error was encountered: '||SQLERRM, 1, 250);
END get_proj;
Dieser Artikel stammt aus dem Internet. Bitte geben Sie beim Nachdruck die Quelle an.
Bei Verstößen wenden Sie sich bitte [email protected] Löschen.
Lass mich ein paar Worte sagen