ORACLE захватить объект исключения - PullRequest
1 голос
/ 18 декабря 2009

Привет, есть ли способ захватить объекты (например, таблицу и столбец), где было создано исключение в ORACLE?

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

Я знаю, что есть переменные SQLCODE и SQLERRM, но мне интересно, есть ли какая-нибудь дополнительная переменная или функция, которая возвращает мне имя объекта ошибки.

я хочу что-то вроде этого

exception
  when others then
    begin
     if SQLCODE = -20010
       then dbms_output.put_line('The Value Too Large in the field ' || GetObjectNameError);
     end if;
   end;

UPDATE

на примере Тони

CREATE TABLE t (v varchar2(3));
COMMENT ON TABLE t IS 'my table description';
COMMENT ON COLUMN t.v IS 'my column description';
insert into t values ('xxxx');

На самом деле поднять эту ошибку *

ERROR at line 1:
ORA-12899: value too large for column "MYSCHEMA"."T"."V" (actual: 4, maximum: 3)

Я хочу показать что-то вроде этого

ORA-12899: value too large for column "my column description" in table "my table description" (actual: 4, maximum: 3)

заранее спасибо.

Ответы [ 3 ]

2 голосов
/ 18 декабря 2009

Нет.

Ну, метод lift_application_exception () позволяет вам два элемента: код ошибки и одно текстовое сообщение. Если вы создаете свои собственные исключения, вы можете отформатировать сообщение, чтобы оно содержало эту информацию, и проанализировать ее.

Альтернатива состоит в том, чтобы поместить эту информацию в глобальный «ERROR TABLE», а затем вызвать исключение.

Чтобы прокомментировать комментарий ниже, оракул 10G включает в себя:

DBMS_UTILITY.FORMAT_ERROR_BACKTRACE

Это позволяет вам анализировать множественные ошибки. В этом блоге показано, как анализировать эту информацию, чтобы извлечь больше и лучше информации из стека вызовов. Но это все еще требует анализа сообщений об ошибках, а не ваших собственных.

2 голосов
/ 18 декабря 2009

Нет, нет. Но более поздние версии Oracle (по крайней мере, 10G) делают это для вас со своими собственными исключениями:

SQL> create table t (v varchar2(3));

Table created.

SQL> insert into t values ('xxxx');
insert into t values ('xxxx')
                      *
ERROR at line 1:
ORA-12899: value too large for column "MYSCHEMA"."T"."V" (actual: 4, maximum: 3)

Чтобы получить то, что вы ищете, вы можете проанализировать эту ошибку, чтобы получить имена таблиц и столбцов (в данном примере T и V), а затем найти комментарии от USER_TAB_COMMENTS и USER_COL_COMMENTS и пересоздать сообщение, используя их.

1 голос
/ 18 декабря 2009

Да, вы можете сделать это, но только для местоположений исходного кода. Проверьте Dbms_Utility.Format_Error_Stack() и Dbms_Utility.Format_Call_Stack().

Вы получаете строку, содержащую номер (а) строки и имя (и) объекта фрагмента (ов) PL / SQL, в котором произошла ошибка.

...