2011-02-23 127 views
1

查詢我的查詢序列:多個「立即執行」,在甲骨文

begin 
execute immediate 'drop table mytable1'; 
exception when others then null; 
end; 

begin 
execute immediate 'drop table mytable2'; 
exception when others then null; 
end; 

begin 
execute immediate 'drop table mytable3'; 
exception when others then null; 
end; 

但是當我嘗試在SQL便籤來執行它,它說「遇到的符號開始」,它指出了我所有的疑問必須在一個開始... 如果我刪除所有開始結束exept的第一個開始和最後一個結束它給我 「無效的SQL語句」如何執行多個下拉表或多個創建表與上部模式,並檢查如果表存在?我知道,我與exception when others then null;的風格被認爲是類似於空抓不好的做法()'ES在其他語言,但多數民衆贊成我來檢查表是否存在/不存在於甲骨文

+0

'那FO的最簡單方法r我檢查一個表是否存在/不存在於oracle中 - 您可以查詢'USER_TABLES' /'DBA_TABLES' /'ALL_TABLES' – Sathya

+0

另外,爲什麼在存儲過程中使用DDL? – Sathya

回答

1
BEGIN 
    EXECUTE IMMEDIATE 'drop table mytable1'; 

    EXECUTE IMMEDIATE 'drop table mytable2'; 

    EXECUTE IMMEDIATE 'drop table mytable3'; 
EXCEPTION 
    WHEN OTHERS THEN 
    NULL; 
END; 

正常工作的最簡單的方法。


如果你問我,應該避免使用exception when others then null。如果你想檢查一個表是否存在 - 查詢USER_TABLES

DECLARE 
    V_EXISTS NUMBER; 

BEGIN 

SELECT 1 INTO V_EXISTS FROM USER_TABLES WHERE TABLE_NAME = 'TEST'; 

IF V_EXISTS = 1 THEN 
    EXECUTE IMMEDIATE 'DROP TABLE TEST'; 
END IF; 

EXCEPTION 
    WHEN NO_DATA_FOUND THEN 
    DBMS_OUTPUT.PUT_LINE('Table not found'); 
END; 

REGd中:你的評論,如果你仍然想去關於你的問題使用方法,在外面匿名塊把它包

BEGIN 

    BEGIN 
    EXECUTE IMMEDIATE 'drop table mytable1'; 
    EXCEPTION 
    WHEN OTHERS THEN 
     NULL; 
    END; 

    BEGIN 
    EXECUTE IMMEDIATE 'drop table mytable2'; 
    EXCEPTION 
    WHEN OTHERS THEN 
     NULL; 
    END; 

    BEGIN 
    EXECUTE IMMEDIATE 'drop table mytable3'; 
    EXCEPTION 
    WHEN OTHERS THEN 
     NULL; 
    END; 

END; 

結果:

SQL> BEGIN 
    2 
    3 BEGIN 
    4  EXECUTE IMMEDIATE 'drop table mytable1'; 
    5 EXCEPTION 
    6  WHEN OTHERS THEN 
    7  NULL; 
    8 END; 
    9 
10 BEGIN 
11  EXECUTE IMMEDIATE 'drop table mytable2'; 
12 EXCEPTION 
13  WHEN OTHERS THEN 
14  NULL; 
15 END; 
16 
17 BEGIN 
18  EXECUTE IMMEDIATE 'drop table mytable3'; 
19 EXCEPTION 
20  WHEN OTHERS THEN 
21  NULL; 
22 END; 
23 
24 END; 
25 
26/

PL/SQL procedure successfully completed. 

SQL> 
+0

但是,如果第一個drop引發異常 - 其他兩個不會嘗試執行。有沒有辦法執行它們,如果第一次拋出異常表不存在? – Dominating

+0

將每個'立即執行'包裹在另一個匿名塊中。 @Dominating – Sathya