Ответ 1
Шаг 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