Обработка ошибок в хранимой процедуре Oracle

Возможно ли узнать строку №. при которой произошла ошибка внутри хранимой процедуры Oracle или SQL Server?

В Oracle вы можете использовать DBMS_UTILITY.FORMAT_ERROR_STACK чтобы получить стек ошибок и DBMS_UTILITY.FORMAT_CALL_STACK чтобы получить стек вызовов. Оба возвращают varchar2 (2000). Хорошим примером использования является http://psoug.org/reference/exception_handling.html в библиотеке Дэна Моргана. Существует много информации и номера строк.

В SQL Server вы можете уловить все атрибуты ошибки.

 BEGIN TRY -- Generate a divide-by-zero error. SELECT 1/0; END TRY BEGIN CATCH SELECT ERROR_NUMBER() AS ErrorNumber ,ERROR_SEVERITY() AS ErrorSeverity ,ERROR_STATE() AS ErrorState ,ERROR_PROCEDURE() AS ErrorProcedure ,ERROR_LINE() AS ErrorLine ,ERROR_MESSAGE() AS ErrorMessage; END CATCH; GO 

http://msdn.microsoft.com/en-us/library/ms175976.aspx

Еще лучше создайте таблицу ошибок и хранимую процедуру, чтобы вставить эти значения в таблицу. Затем выполните хранимую процедуру в блоке catch.

Для SQL Server он предоставит вам строку на вкладке сообщений при запуске proc из SQL Server Management Studio

Например, если у вас есть этот процесс

 CREATE PROCEDURE prTest AS SELECT 1 SELECT 2 SELECT bla FROM SOMETABLE SELECT 3 GO 

и вы запускаете его так

 EXEC prTest 

вы получите это сообщение об ошибке

Msg 208, уровень 16, состояние 1, процедура
prTest, строка 7 Недопустимое имя объекта «SOMETABLE».

В вашей процедуре вам нужно поймать исключение. Вы даже можете отправить исключение в таблицу журнала ошибок. Как весело! Или вы можете просто отправить сообщение DBMS_OUTPUT, но это может быть довольно долго. DBMS_OUTPUT имеет ограничение на размер сообщений. Значение по умолчанию – 20000 символов.

Вы даже можете создавать собственные исключения .

Сначала вам понадобится переменная

 EM VARCHAR(2000); 

Затем это в конце вашей процедуры.

  EXCEPTION WHEN OTHERS THEN EM := substr(SQLERRM, 1, 2000) ; ROLLBACK; INSERT INTO ERROR_LOG(ERROR_TIME, PROC_NAME , ERROR_MSG) VALUES(SYSTIMESTAMP , 'PKG.get_stuff', EM); COMMIT; RETURN NULL; 
  • Форматирование результата числового запроса SQL с произвольным числом десятичных знаков
  • Есть ли у Oracle что-то вроде изменения сбора данных в SQL Server 2008?
  • Преобразование SQL Server в Oracle
  • Единая дата SQL в Oracle SQL и SQL Server
  • Имеет ли Oracle концепцию фильтрованного индекса?
  • Как получить список java-процессов вместе с их идентификатором PID (id процесса), который выполняется на сервере UAT под специальной учетной записью?
  • Поддерживает ли SQL SERVER функцию FIRST_ROWS, такую ​​как oracle?
  • sql - Как вернуть NULL строку из левой таблицы для каждого родителя, даже если существуют дочерние записи
  • Вставьте настройку производительности
  • Как написать приложение .Net, которое работает как с SqlServer, так и с Oracle (теперь, когда System.Data.OracleClient устарел)
  • Отбрасывание базы данных с помощью SQL-запроса?
  • Interesting Posts

    Как преобразовать список разделенных запятыми NVARCHAR в INT?

    SQL: множественное предложение Where, основанное на нескольких фильтрах

    SQL Server: процесс Kill с использованием хранимой процедуры

    Самый эффективный и надежный способ получить Unix-файлы в SQL Server

    Получить записи на основе текущей даты и настроенных данных

    Резервное копирование данных SQL Server 2000 Live

    Автоматическое добавление отдельных столбцов при создании новой таблицы

    Обновить таблицу в sql-сервере со значениями в кадре данных pandas

    Каково использование именованных каналов? Можно ли подключиться из студии управления с использованием именованного канала?

    Что делает один из этих запросов быстрее?

    Несоответствие поведения в полнотекстовом поиске между SQL Server 2005 и SQL Server 2012

    Как удалить часть строки из определенного слова?

    SQL SORT BY DATENAME не работает

    Как удалить данные из таблицы, содержащей внешний ключ внешней ссылки

    Случай SQL с условиями

    Давайте будем гением компьютера.