В PL / SQL (Oracle) исключения могут распространяться через вызовы функций / процедур? - PullRequest
1 голос
/ 13 февраля 2012

как это происходит в закрытых блоках
Если анонимный блок вызывает функцию, которая вызывает исключения, они не показываются ни на консоли, ни в замкнутых блоках ...
Более того, после того, как обработчик перехватил функцию, строки после вызова функции в анонимном блоке выполняются нормально!

Вызывается процедура:

CREATE OR REPLACE PROCEDURE qt(pno number, qty OUT number)
IS
BEGIN
select sum(qty_on_hand) into qty from products where productno=pno;
END;

Вызывающий блок:

DECLARE
qty number;
BEGIN
qt(&pno, qty);
dbms_output.put_line('qty is: '||qty);
END;

В случае неверного номера продукта ошибка не отображается; почему?

Ответы [ 3 ]

8 голосов
/ 13 февраля 2012

Если исключение перехватывается обработчиком в функции и не вызывается повторно , то исключение не будет вызвано в вызывающей программе.Это правильное поведение.Если вы хотите, чтобы исключение было видимым для вызывающего, вы должны повторно вызвать его в функции с помощью команды RAISE:

FUNCTION fun ...
...
EXCEPTION
  WHEN some_exception THEN
    ...
    RAISE;
END;

В качестве альтернативы вы можете вызвать другое исключение, например

EXCEPTION
  WHEN some_exception THEN
    ...
    RAISE_APPLICATION_ERROR(-20001,'My error message');
END;
6 голосов
/ 13 февраля 2012

В вашем конкретном примере я думаю, что никаких исключений не возникает вообще. Вы говорите «в случае неправильного номера продукта», под которым я предполагаю, что вы имеете в виду номер продукта, который не существует. Это звучит так, как будто вы ожидаете, что ваш запрос выдаст NO_DATA_FOUND, но поскольку он использует агрегатную функцию без GROUP BY, он на самом деле вернет одну строку, содержащую NULL, если нет соответствующих строк.

0 голосов
/ 13 февраля 2012

Просто чтобы добавить ответ Тони.Вы можете не знать, какой тип исключения может вызвать вызывающая функция.В этом случае вы можете сделать:

EXCEPTION
  WHEN exception_that_may_occur_in_my_function THEN
    ...
    RAISE_APPLICATION_ERROR(-20001,'My error message');

  WHEN others THEN  -- Any exception that can come from a function I'm calling
    RAISE;

END;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...