Шаг 1. Выясните, какие ошибки вы хотите перехватить:
Если таблица не существует:
SQL> drop table x;
drop table x
*
ERROR at line 1:
ORA-00942: table or view does not exist
Если таблица используется:
SQL> create global temporary table t (data varchar2(4000));
Table created.
Использовать таблицу в другом сеансе. (Не замечайте коммит или что-либо после вставки.)
SQL> insert into t values ('whatever');
1 row created.
Вернувшись в первый сеанс, попытайтесь сбросить:
SQL> drop table t;
drop table t
*
ERROR at line 1:
ORA-14452: attempt to create, alter or drop an index on temporary table already in use
Итак, две ошибки в ловушке:
- ORA-00942: таблица или представление не существует
- ORA-14452: попытка
создать, изменить или удалить индекс для временной таблицы, которая уже используется
Проверьте, являются ли ошибки предопределенными . Это не так. Таким образом, они должны быть определены так:
create or replace procedure p as
table_or_view_not_exist exception;
pragma exception_init(table_or_view_not_exist, -942);
attempted_ddl_on_in_use_GTT exception;
pragma exception_init(attempted_ddl_on_in_use_GTT, -14452);
begin
execute immediate 'drop table t';
exception
when table_or_view_not_exist then
dbms_output.put_line('Table t did not exist at time of drop. Continuing....');
when attempted_ddl_on_in_use_GTT then
dbms_output.put_line('Help!!!! Someone is keeping from doing my job!');
dbms_output.put_line('Please rescue me');
raise;
end p;
И результаты, сначала без t
:
SQL> drop table t;
Table dropped.
SQL> exec p;
Table t did not exist at time of drop. Continuing....
PL/SQL procedure successfully completed.
А теперь, когда используется t
:
SQL> create global temporary table t (data varchar2(4000));
Table created.
В другой сессии:
SQL> insert into t values (null);
1 row created.
А затем в первом сеансе:
SQL> exec p;
Help!!!! Someone is keeping from doing my job!
Please rescue me
BEGIN p; END;
*
ERROR at line 1:
ORA-14452: attempt to create, alter or drop an index on temporary table already in use
ORA-06512: at "SCHEMA_NAME.P", line 16
ORA-06512: at line 1