Стъпка 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
person
Shannon Severance
schedule
28.10.2011
create global temporary table ....
) Ако е така, защо го зарязвате? Това част от инсталационен скрипт ли е? Ако не, може би глобална временна таблица ще отговори на вашите нужди, без да е необходимо да я изпускате. - person Shannon Severance   schedule 28.10.2011