2011-06-08 61 views
3

當我運行此查詢不能有內CREATE TABLE如果其他

DECLARE 
     num NUMBER; 
BEGIN 

    SELECT COUNT(*) INTO num FROM user_all_tables WHERE TABLE_NAME=upper('DatabaseScriptLog') 
    ; 

    IF num < 1 THEN 

     CREATE TABLE DatabaseScriptLog 
     (ScriptIdentifier VARCHAR(100) NOT NULL, 
     ScriptType VARCHAR(50), 
     StartDate TIMESTAMP, 
     EndDate TIMESTAMP, 
     PRIMARY KEY (ScriptIdentifier) 
     ); 

    END IF; 

END; 

當執行上面的,我有以下幾點:

PLS-00103:出現符號 「CREATE」期待 之一以下時:

開始的情況下宣佈退出用於轉到如果 環模空編譯加薪回報 SEL ECT更新而與< <關閉當前刪除 獲取鎖芯打開回滾
保存點設置SQL執行承諾 FORALL合流管 06550. 00000 - 「行%S,列%S:\ n%S」 *原因:通常PL/SQL編譯錯誤。

+2

什麼是你的問題? 「這個錯誤是什麼意思?」,「這是否意味着我無法在條件內創建表?」,「我應該怎麼做?」等。謝謝! – 2011-06-08 00:26:30

回答

0

就像你可以在SQLServer的你不能做到這一點。您需要通過已存在於適當架構中的存儲過程來執行創建代碼。您將創建代碼作爲參數傳遞,具有正確權限的存儲過程將爲您執行此操作。

我使用一個版本的腳本,通過運行IF-THEN子句檢查分貝是什麼版本的分離模式變更操作更新架構到最新版本。改變後,增加版本,以便下一個if語句測試通過等等。如果你是最新的並且運行腳本,ifs會跳過所有更改代碼。如果您的數據庫版本爲46,並且運行的所有更改的腳本最多爲50,則只執行代表版本47-50的塊。

你可以立即執行,但需要提升的特權,我不會推薦。

希望這會有所幫助。

+2

我們需要權限來運行DDL語句。爲了在PL/SQL(匿名塊或存儲過程)中運行它們,我們需要直接授予用戶的權限,而不是通過角色。但是EXECUTE IMMEDIATE不需要任何額外的特權。 – APC 2011-06-08 04:52:10

10

你不能運行這樣的DDL語句。您需要使用動態SQL(EXECUTE IMMEDIATE)。

IF num < 1 THEN 

    EXECUTE IMMEDIATE 'CREATE TABLE DatabaseScriptLog (ScriptIdentifier VARCHAR(100) NOT NULL, ScriptType VARCHAR(50), StartDate TIMESTAMP, EndDate TIMESTAMP, PRIMARY KEY (ScriptIdentifier))' 

END IF; 
+0

需要在表空間中運行,而不是直接從您連接的內容中運行。 – 2011-06-08 00:39:41

+0

是的,我假設你和這段代碼在你想要創建表的模式中(這通常是你要連接的)。不過這與表空間無關。表空間只是定義了物理存儲位置。而且您不必將其存儲在存儲過程中,如果需要,可以直接從腳本文件運行。 – Thilo 2011-06-08 00:42:01

+0

抱歉錯字。我現在在mysql的土地上。模式是正確的。 – 2011-06-08 00:46:00