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