Как узнать номер строки, имя процедуры в PL / SQL в случае ошибки - PullRequest
1 голос
/ 10 мая 2010

Я использую форму D2k 6i и получаю ошибку в форме из хранимой базы данных (oracle9i). Процедура ORA-00001: Уникальное ограничение (.) Нарушено, но я не могу отследить, из какой процедуры оно происходит. Кто-нибудь может мне помочь в этом

Ответы [ 3 ]

1 голос
/ 11 мая 2010

Для потомков, вот решение, которое нашел ОП:

хорошо, в формах D2k есть триггер ON-ERROR, где вы можете использовать функцию DBMS_ERROR_TEXT для получения процедуры, имя пакета, номер строки оператора, из которого происходит ошибка

1 голос
/ 03 марта 2015

Я столкнулся с этой моделью после долгих исследований, стука головы и скрежета зубов:

CREATE OR REPLACE PACKAGE BODY my_schema.package_name
IS

  PROCEDURE foo
  IS
  BEGIN
    -- Call stored procedures/functions that throw unhandled exceptions
  EXCEPTION
    WHEN OTHERS THEN
      DBMS_OUTPUT.PUT_LINE('ERROR! - '
        || DBMS_UTILITY.FORMAT_ERROR_STACK
        || DBMS_UTILITY.FORMAT_ERROR_BACKTRACE);
  END foo;

END;

Кажется, что функция DBMS_UTILITY.FORMAT_ERROR_STACK выдает код ошибки и сообщение, а DBMS_UTILITY.FORMAT_ERROR_BACKTRACE, похоже, дает честную трассировку стека добродетели, с номерами строк и именами хранимых процедур в Oracle 10g, по крайней мере.

Я не уверен, что эти функции доступны в Oracle 9i. Я не смог найти много информации о подобных вещах даже для Oracle 10g, поэтому я подумал, что, по крайней мере, опубликую этот ответ, поскольку 9i довольно старый (а значит, и 10g).

0 голосов
/ 10 мая 2010

Размещение вашего исключения с вашим вопросом даст нам лучшее представление о том, с чем вы столкнулись.

Обычно об исключении сообщается пакет и номер строки в сообщении об ошибке. Отсюда вы можете запросить таблицу USER_SOURCE:

SELECT text 
FROM user_source 
WHERE type = 'PACKAGE BODY' 
  AND name = 'myProcName' 
  AND line = [the line number];

Может быть полезно узнать больше о контексте, в котором была вызвана ошибка. Для этого вы можете использовать оператор `BETWEEN ':

SELECT text 
FROM user_source 
WHERE type = 'PACKAGE BODY' 
  AND name = 'myProcName' 
  AND line BETWEEN [the line number - 5] AND [the line number +5];
...