2011-10-28 105 views
10

2單獨的問題。刪除全球臨時表

  1. 我使用這個腳本刪除表[解決]

    BEGIN 
        EXECUTE IMMEDIATE 'DROP TABLE_NAME'; 
        DBMS_OUTPUT.PUT_LINE ('Global table TABLE_NAME Dropped'); 
        EXCEPTION 
         WHEN OTHERS THEN 
          DBMS_OUTPUT.PUT_LINE ('Global table TABLE_NAME Doesn''t exist.'); 
    END; 
    /
    

反正如果表「不存在」我可以分化或者是一些正在使用其他會話(在這種情況下,它會被鎖定,無法刪除)。我不確定是否可以在user_tables中看到該表。我不完全知道權限。

我加入這個代碼現在

WHEN OTHERS THEN 
     i_code := SQLCODE; 
     v_errm := SUBSTR(SQLERRM, 1, 64); 
    if i_code = -942 THEN 
    DBMS_OUTPUT.PUT_LINE ('TABLE_NAME doesn''t exist. Script will continue to create it'); 
    ELSE 
    DBMS_OUTPUT.PUT_LINE ('Error dropping temporary table. The error code is ' || i_code || '- ' || v_errm); 
    END IF ; 

2.我看到在每個過程的這樣

END PROCEDURE_NAME; 
. 
/
sho err; 

最後我就是不明白爲什麼已經在這裏了。它是語法還是什麼?

+0

該表是否真的是全局臨時表? ('創建全局臨時表....')如果是這樣,爲什麼你放棄它?這是安裝腳本的一部分嗎?如果沒有,也許全球臨時表可以滿足您的需求,而無需丟棄它。 –

+0

好吧,我們遇到了「已經存在」的問題,不知何故,它沒有從productino環境中得到證實,表格的狀態如何。此表不是安裝腳本的一部分,而是其單獨過程的一部分。 –

+0

我不明白,你爲什麼遇到一個全球臨時表已經存在的問題。該表應該已經存在,代碼只是使用(插入,刪除,更新等)它。 –

回答

12

第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 

所以兩個錯誤陷阱:

  1. ORA- 00942:表或視圖不存在
  2. 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 
-1

DECLARE GLOBAL TEMPORARY TABLE語句爲當前連接定義一個臨時表。

這些表不駐留在系統目錄中,並且不是持久的。

臨時表僅在聲明它們的連接期間存在,並且不能在該連接之外被引用。

當連接關閉時,表的行被刪除,臨時表的內存描述被刪除。

供您參考http://docs.oracle.com/javadb/10.6.2.1/ref/rrefdeclaretemptable.html

+0

您正在討論與OP不同的數據庫產品。對於Oracle數據庫http://docs.oracle.com/database/121/CNCPT/tablecls.htm#CNCPT1138。 &「在Oracle中,全局臨時表是存儲臨時會話特定(或特定事務)數據的永久對象。」 http://stackoverflow.com/questions/3682360/sql-server-oracle-private-temporary-tables –

15
 
-- First Truncate temporary table 
SQL> TRUNCATE TABLE test_temp1; 

-- Then Drop temporary table 
SQL> DROP TABLE test_temp1; 
+2

此解決方案不起作用。 – zygimantus

+0

它在重新連接(更改會話)後在我的情況下工作。 –

0
  1. 下的Apache服務器在putty cd $ADMIN_SCRIPTS_HOME ./adstpall.sh
  2. 刪除全局臨時表 drop table t;

這將鍛鍊下方運行。