Во-первых, ваш код перехватывает ошибку, которая возникает, когда ограничение не может быть активировано, и он выбрасывает эту ошибку, а не вызывает ее заново. Это почти всегда ошибка. Если вы не хотите игнорировать тот факт, что включение ограничения не удалось, вам нужно что-то вроде
FOR rec IN ( SELECT constraint_name,
table_name
FROM user_constraints
where status = 'DISABLED'
and constraint_type = 'R'
OR constraint_type = 'P' )
LOOP
BEGIN
l_sql_stmt := 'alter table '||rec.table_name||
' enable constraint ' || rec.constraint_name;
dbms_output.put_line( l_sql_stmt );
EXECUTE IMMEDIATE l_sql_stmt;
EXCEPTION
WHEN OTHERS THEN
dbms_output.put_line('ERROR: ' || l_sql_stmt );
raise; -- re-raise the exception
END;
END LOOP;
Поскольку ALTER TABLE - это DDL, откат невозможен. Если вы столкнулись с ошибкой включения одного ограничения, вы не сможете откатить включение всех предыдущих ограничений.
Судя по вашему последнему обновлению, вы можете не захотеть отключать и включать ограничения вообще. Вы можете просто захотеть создать отложенные ограничения.
SQL> create table foo (
2 col1 number
3 );
Table created.
SQL> ed
Wrote file afiedt.buf
1 alter table foo
2 add constraint pk_foo
3 primary key( col1 )
4* deferrable
SQL> /
Table altered.
Обычно это ведет себя как любое другое ограничение первичного ключа
SQL> insert into foo values( 1 );
1 row created.
SQL> insert into foo values( 1 );
insert into foo values( 1 )
*
ERROR at line 1:
ORA-00001: unique constraint (SCOTT.PK_FOO) violated
SQL> rollback;
Rollback complete.
Но если вы отложите ограничение, оно не будет проверено, пока вы не подтвердите. И если ограничение нарушается при завершении транзакции, транзакция откатывается.
SQL> alter session set constraints = deferred;
Session altered.
SQL> select * from foo;
no rows selected
SQL> insert into foo values( 1 );
1 row created.
SQL> insert into foo values( 1 );
1 row created.
SQL> insert into foo values( 1 );
1 row created.
SQL> commit;
commit
*
ERROR at line 1:
ORA-02091: transaction rolled back
ORA-00001: unique constraint (SCOTT.PK_FOO) violated