2011-05-30 83 views
2

我寫的PL/SQL腳本(的作品,但並不好看):刪除表,如果不存在

DECLARE 
    v_exists NUMBER; 
BEGIN 
    SELECT count(*) INTO v_exists FROM dba_tablespaces WHERE tablespace_name = 'hr_test'; 
    IF v_exists > 0 THEN 
    BEGIN 
     EXECUTE IMMEDIATE 'DROP TABLESPACE hr_test INCLUDING CONTENTS AND DATAFILES CASCADE CONSTRAINTS'; 
    END; 
    END IF; 
    EXECUTE IMMEDIATE 'CREATE TABLESPACE hr_RJ DATAFILE ''E:\hr_test_01.dbf'' SIZE 16M'; 
END; 

有沒有辦法改寫這個腳本,而不EXECUTE IMMEDIATE

+0

一個更好的辦法是不要運行'SELECT COUNT(*)'在所有 - 只需運行'DROP'和處理異常,如果它被提出的「沒有找到表」。 – 2011-05-31 04:38:57

回答

3

不可以。您不能在靜態PL/SQL中發出DDL語句。

是的,這是完全正常使用原生動態SQL DDL用途:

您需要在以下 情況動態SQL:

要執行一個SQL數據 定義語句(如CREATE), 數據控制語句(如 GRANT)或會話控制語句 (如ALTER SESSION)。在PL/SQL中, 這樣的語句不能靜態執行 。

Oracle dynamic SQL