У меня есть процедура в Oracle, я столкнулся с ошибкой, но она не меняет значение p_out_msg, почему это так? Вместо этого ошибка вернется к курсору.Oracle не выбрасывает исключение
Код:
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;
Скажите, что я вошел неверную дату:
Выход:
p_out_cur: ORA-01858: a non-numeric character was found where a numeric was expected
p_out_msg: SUCCESS
Вот анонимный блок в соответствии с просьбой @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;
где анонимный блок, вызывающий процедуру? Можете ли вы опубликовать его? – brenners1302
@ brenners1302 Я назвал его от разработчика SQL. – superigno
Вы должны поймать ошибку до того, как она откроет курсор. сначала попробуйте сохранить дату в переменной. Затем используйте переменную в условии. Так что, когда процедура пытается преобразовать дату и сохранить ее в переменной и генерирует ошибку, она перейдет непосредственно к исключению. – brenners1302