Предоставление более значимого сообщения при возникновении ошибки в PL / SQL - PullRequest
2 голосов
/ 06 августа 2009

Предположим, у меня есть функция PL / SQL, которая выбирает одно значение из таблицы. Если запрос не возвращает записей, я хочу, чтобы ошибка NO_DATA_FOUND распространялась (чтобы вызывающий код мог ее перехватить), но с более значимым сообщением об ошибке при вызове SQLERRM.

Вот пример того, чего я пытаюсь достичь:

FUNCTION fetch_customer_id(customer_name VARCHAR2) RETURN NUMBER;
    customer_id NUMBER;
BEGIN
    SELECT customer_id
      INTO customer_id
      FROM CUSTOMERS
     WHERE customer_name = fetch_customer_id.customer_name;

    RETURN customer_id;
EXCEPTION
    WHEN NO_DATA_FOUND THEN
        meaningful_error_message := 'Customer named ' || customer_name || ' does not exist';
        RAISE;
END;

Есть ли способ связать meaningful_error_message с ошибкой NO_DATA_FOUND?

Обновление: Было предложено использовать RAISE_APPLICATION_ERROR, чтобы вызвать пользовательский код ошибки при обнаружении NO_DATA_FOUND. Цель этого вопроса состояла в том, чтобы определить, можно ли избежать этого метода, чтобы вызывающий код мог перехватывать NO_DATA_FOUND ошибок, а не пользовательский код ошибки. Поймать NO_DATA_FOUND кажется более семантически правильным, но я могу ошибаться.

Ответы [ 2 ]

7 голосов
/ 06 августа 2009

Использование RAISE_APPLICATION_ERROR (-20001, 'your message');

Это вернет номер ошибки -20001 и ваше сообщение вместо сообщения NO_DATA_FOUND. Oracle зарезервировала номера ошибок от -20001 до -210000 для использования пользователями в своих приложениях, поэтому вы не будете скрывать другую ошибку Oracle, используя эти числа.

РЕДАКТИРОВАТЬ: RAISE_APPLICATION_ERROR специально разработан, чтобы позволить вам создавать свои собственные сообщения об ошибках. Таким образом, у Oracle нет другого метода разрешения динамических сообщений об ошибках. Для дальнейшего уточнения этого вы можете определить свое собственное исключение в пакете, где вы определяете свою процедуру. Добавить следующее:

CUSTOMER_NO_DATA_FOUND  EXCEPTION; 
EXCEPTION_INIT (CUSTOMER_NO_DATA_FOUND, -20001);

В вашем коде процедуры вы делаете RAISE_APPLICATION_ERROR, а код клиента может сделать WHEN CUSTOMER_NO_DATA_FOUND THEN, который выглядит лучше, и у них все еще есть сообщение об ошибке, записанное в SQLERRM.

2 голосов
/ 06 августа 2009

Как подсказывает Томас , вы можете использовать RAISE_APPLICATION_ERROR. Если вы также хотите сохранить ошибку NO_DATA_FOUND в стеке ошибок, вы можете добавить значение TRUE в качестве третьего параметра функции:

DECLARE
   l NUMBER;
BEGIN
   SELECT NULL INTO l FROM dual WHERE 1 = 2;
EXCEPTION
   WHEN no_data_found THEN
      raise_application_error(-20001, 'Meaningful Message', TRUE);
END;

ORA-20001: Meaningful Message
ORA-06512: at line 8
ORA-01403: no data found (*)

Строка с меткой (*) является исходным сообщением об ошибке.

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