第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:嘗試 在已使用的臨時表上創建,更改或刪除索引
看錯誤是否爲predefined。他們不是。因此,他們需要像這樣定義:
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
該表是否真的是全局臨時表? ('創建全局臨時表....')如果是這樣,爲什麼你放棄它?這是安裝腳本的一部分嗎?如果沒有,也許全球臨時表可以滿足您的需求,而無需丟棄它。 –
好吧,我們遇到了「已經存在」的問題,不知何故,它沒有從productino環境中得到證實,表格的狀態如何。此表不是安裝腳本的一部分,而是其單獨過程的一部分。 –
我不明白,你爲什麼遇到一個全球臨時表已經存在的問題。該表應該已經存在,代碼只是使用(插入,刪除,更新等)它。 –