Поскольку Sqlerrm() возвращает сообщение и код, предоставленный orecle.

исключение 1: например, для неявного курсора, когда данные не найдены, возникает ошибка n, мы пишем обработку исключений, например dbms_ou..(sqlerrm());

вывод: ORA-01403: данные не найдены и для Dbms_output..(sqlcode()); -- при том же исключении данные не найдены

вывод: 100

исключение 2: когда возникает исключение too_many_rows, для него возвращается

вывод: когда sqlerrm(): ORA-01422: точная выборка возвращает больше запрошенного количества строк.

вывод: когда sqlcode(): -1422

Итак, в первой ситуации sqlcode() возвращает 100, а в too_many_rows возвращает -1422 (это код, предоставленный оракулом).??

Так что это мой вопрос, каков правильный ответ. какая функция sqlcode() возвращает номер кода, предоставленный оракулом, или любой анонимный номер??

1
harsha lohana 4 Фев 2022 в 08:54
1
Отсутствие данных (sqlcode = 100) не считается ошибкой. Только ошибки имеют отрицательные значения sqlcode.
 – 
jarlh
4 Фев 2022 в 11:33

2 ответа

В том, что вы говорите, нет ничего необычного, поскольку это описано в Документация.

Для внутренних исключений SQLCODE возвращает номер соответствующей ошибки Oracle. Число, которое возвращает SQLCODE, является отрицательным, если только ошибка Oracle не содержит данных, и в этом случае SQLCODE возвращает +100.

1
Littlefoot 4 Фев 2022 в 09:15

Я не знаю, почему Oracle однажды решила заменить -01403 на +100 в коде SQL. Однако это единственное существующее исключение. Мы используем следующую функцию для обработки всех исключений:

FUNCTION get_ora_code(vi_sqlcode INTEGER) RETURN INTEGER IS
BEGIN
 if vi_sqlcode = 100 then
   return -1403;
 else
   return vi_sqlcode;
 end if;
END get_ora_code;

Тогда наши обработчики исключений могут выглядеть так:

EXCEPTION WHEN OTHERS THEN
  vo_msg := regexp_replace(sqlerrm || ' ' || dbms_utility.format_error_backtrace, '[[:space:]]+', ' ');
  v_ora_code := get_ora_code(sqlcode);
  RETURN v_ora_code;
END my_package_function;

Таким образом, наши функции всегда возвращают отрицательное значение в случае ошибки (и сообщают полное сообщение об ошибке и стек в выходной переменной vo_msg). Мы используем код возврата 0 для успеха и положительные значения для успеха с предупреждением (которое мы также комментируем в vo_msg). Я думаю, это хорошее соглашение о коде.

0
Thorsten Kettner 4 Фев 2022 в 09:49