Информация об исключениях Oracle - PullRequest
0 голосов
/ 21 октября 2011

Мне интересно, есть ли способ получить немного больше информации о том, что вызвало исключение:

Error starting at line 5 in command:
exec ....
Error report:
ORA-06502: PL/SQL: numeric or value error: character string buffer too small
ORA-06512: at ..., line 558
ORA-06512: at ..., line 752
ORA-06512: at line 1
06502. 00000 -  "PL/SQL: numeric or value error%s"
*Cause:    
*Action:

Я предполагаю, что это означает, что у меня есть переменная, которая слишком мала для того, что япытался вставить это ... Но почему Oracle не может сказать мне, что это за переменная?Было бы замечательно, чтобы как отладчики, так и специалисты по поддержке производства могли сказать нашему клиенту, я думаю, что у вас слишком большое поле, и именно это вызвало ошибку, а не просто «какое-то значение было слишком большим, и мы действительно понятия не имеем, какиеone "... Использование номера строки потребовало бы того, кто понимает sql и смотрит на код, который не идеален.

Почему в полях Cause и Action ничего нет?

Когда выпопробуйте вставить в столбец с данными, которые слишком велики, он говорит вам, какой столбец ... Я хотел бы подобную информацию здесь.

Возможно ли это без необходимости помещать обработчик исключений после каждой строки кода plsql?

1 Ответ

3 голосов
/ 21 октября 2011

Oracle не может знать, каково ваше намерение с информацией об ошибке. Знание имени переменной, в которой вы ее храните, или откуда именно оно пришло, не обязательно отвечает интересам конечного пользователя или безопасности.

Например, я могу легко сгенерировать вашу ошибку:

SQL> declare
  2  v_tooshort varchar2(3);
  3  begin
  4    select 'too long' into v_tooshort from dual;
  5  end;
  6  /
declare
*
ERROR at line 1:
ORA-06502: PL/SQL: numeric or value error: character string buffer too small
ORA-06512: at line 4

Ошибка уже дает номер строки.

Вы бы предпочли, чтобы ошибка давала имя переменной (v_tooshort)? Это не полезно для пользователя.

Является ли правильная информация значением "слишком длинным"? Или тот факт, что это фиктивный столбец из таблицы dual? (или фактический столбец и таблица)?

Поскольку ошибка возникает из-за select into вместо оператора insert, это не значит, что существует конкретное ограничение базы данных, которое исключение может идентифицировать по имени.

РЕДАКТИРОВАТЬ (для решения проблемы, поднятой в комментарии): Это не правда. Вы получите имя и длину столбца, возвращенные при выполнении insert (как ORA-12899), но не при выполнении select into, даже если он использует данные из таблицы:

SQL> create table test_length (tooshort varchar2(3));

Table created.

SQL> begin
  2    insert into test_length(tooshort) values ('too long');
  3  end;
  4  /
begin
*
ERROR at line 1:
ORA-12899: value too large for column "MYUSER"."TEST_LENGTH"."TOOSHORT"
(actual: 8, maximum: 3)
ORA-06512: at line 2

SQL> insert into test_length(tooshort) values ('abc');

1 row created.

SQL> commit;

Commit complete.

SQL> declare
  2    v_onechar varchar2(1);
  3  begin
  4    select tooshort into v_onechar from test_length;
  5  end;
  6  /
declare
*
ERROR at line 1:
ORA-06502: PL/SQL: numeric or value error: character string buffer too small
ORA-06512: at line 4

РЕДАКТИРОВАТЬ 2:

Вы можете вложить ваш select into в его собственный блок begin-exception-end и вызвать любую ошибку, какую захотите (предоставив уникальный номер ошибки и текст описания ошибки):

SQL> ed
Wrote file afiedt.buf

  1  declare
  2    v_onechar varchar2(1);
  3  begin
  4    select tooshort into v_onechar from test_length;
  5  exception
  6    when value_error then
  7      RAISE_APPLICATION_ERROR(-20011, 'my variable named v_onechar is too short for the data returned from test_lengt
h.tooshort');
  8* end;
SQL> /
declare
*
ERROR at line 1:
ORA-20011: my variable named v_onechar is too short for the data returned from
test_length.tooshort
ORA-06512: at line 7
...