Обработка ошибок в хранимой процедуре Oracle - PullRequest
2 голосов
/ 23 марта 2011

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

Ответы [ 4 ]

4 голосов
/ 23 марта 2011

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

1 голос
/ 24 марта 2011

В 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.

0 голосов
/ 24 марта 2011

В вашей процедуре вам нужно поймать исключение. Вы даже можете отправить исключение в таблицу журнала ошибок. Как это весело! Или вы можете просто 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;
0 голосов
/ 23 марта 2011

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

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

CREATE PROCEDURE prTest
AS
SELECT 1

SELECT 2

SELECT bla FROM SOMETABLE


SELECT 3

GO

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

EXEC prTest

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

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

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