2013-07-09 29 views
0

我第一次使用Oracle,更習慣於sql server及其身份。但現在我正在嘗試使用序列和觸發器。但不斷收到我無法修復的錯誤。序列和觸發器,PL/SQL

identifiers may not start with any ASCII character other than 
     letters and numbers. $#_ are also allowed after the first 
     character. Identifiers enclosed by doublequotes may contain 
     any character other than a doublequote. Alternative quotes 
     (q'#...#') cannot use spaces, tabs, or carriage returns as 
     delimiters. For all other contexts, consult the SQL Language 
     Reference Manual. 

任何人都可以幫助解決它,這裏是我的代碼。

EXECUTE IMMEDIATE' CREATE SEQUENCE stagechardata_stagecharid 
    START WITH 1 
    INCREMENT BY 1;'; 

EXECUTE IMMEDIATE' CREATE OR REPLACE TRIGGER stagechardata_stagecharid_TRG 
    BEFORE INSERT 
    ON stage_char_data 
    FOR EACH ROW 
    BEGIN 
    IF NEW.stage_char_id IS NULL THEN 
     SELECT stagechardata_stagecharid.NEXTVAL INTO NEW.stage_char_id 
      FROM DUAL; 
      END IF; 
    END;'; 
+0

你爲什麼使用'execute immediate'?你是否有理由需要從PL/SQL而不是普通的SQL動態創建這些動態? (事實上​​,在第一個動態語句結束時,你不應該有分號,並且你的'new'引用缺少冒號,但是那些不會導致那個錯誤)。你可以顯示其餘的PL/SQL塊或腳本嗎? –

+0

在'create sequence'語句的末尾刪除';'。當使用'execute immediate'時,僅在創建PL/SQL過程時才需要使用常規SQL語句。 –

回答

0

遠射,但看起來好像在IMMEDIATE之後和啓動語句的引號之前缺少一個空格。

+0

謝謝,這就是我原來的樣子,沒有運氣。 –

+0

布萊克,你可以嘗試自己輸入語句(不立即執行)到你用來手動與數據庫交互的任何東西嗎?我在SQL小提琴嘗試,似乎是好的。獲取表不存在的錯誤,但這意味着語法檢查工作。 – asantaballa

+0

當我這樣做,它實際上編譯,但然後我收到一個錯誤,指出。綁定變量「NEW」未被聲明。 –

0

的序列是包含SQL satements的對象,但不存儲數據。 觸發器是在表上進行操作時執行的SQL塊。

0

首先,沒有明顯的理由使用EXECUTE IMMEDIATE。有沒有看不見?它看起來像你應該刪除它並直接在SQL模式下執行這些語句。

下,它看起來像你忘了使用冒號:NEW.stage_char_id IS NULL應該是:NEW.stage_char_id IS NULL等。