Похоже, что разработчик (который написал это приложение) вызвал путаницу.
Вот как Oracle обычно обрабатывает такое нарушение проверочного ограничения:
SQL> create table test
2 (col varchar2(1) check (col in ('Y', 'N')));
Table created.
SQL> insert into test (col) values ('X');
insert into test (col) values ('X')
*
ERROR at line 1:
ORA-02290: check constraint (SCOTT.SYS_C007013) violated
SQL>
Как видите, никаких дополнительных "должно быть Y или N "сообщение.
Я подозреваю, что приложение делает следующее: во-первых, найти имя ограничения:
SQL> select constraint_name from user_constraints where table_name = 'TEST';
CONSTRAINT_NAME
------------------------------
SYS_C007013
SQL>
Теперь используйте его: объявить исключение (ex_chk
вмой пример) и прагма exception_init
, в которой говорится, что ex_chk
следует использовать для ORA-02290
.Таким образом, если проверочное ограничение нарушено, отобразите сообщение, которое выглядит как оригинальное, и добавьте дополнительную информацию:
SQL> declare
2 ex_chk exception;
3 pragma exception_init(ex_chk, -2290);
4 begin
5 insert into test (col) values ('x');
6 exception
7 when ex_chk then
8 dbms_output.put_line
9 ('ORA-02290: check constraint (.SYS_C007013) violated must be Y or N');
10 end;
11 /
ORA-02290: check constraint (.SYS_C007013) violated must be Y or N
PL/SQL procedure successfully completed.
SQL>
Я полагаю, что вы не делаете этого в SQL * Plus, но любое приложение (например, Oracle Forms) способно сделать это, возможно, не используя вызов DBMS_OUTPUT.PUT_LINE
, а MESSAGE
, ALERT
или что-либо еще.
Поэтому проверьте само приложение.Вы не найдете эту информацию в базе данных, если только такой код PL / SQL не хранится как процедура - автономная или в пакете.В этом случае:
select * from user_source where upper(text) like '%SYS_C007013%';