2013-04-11 86 views
1

當我運行這個SQL:的Oracle SQL自動遞增PLS-00103

CREATE OR REPLACE TRIGGER test_trigger 
BEFORE INSERT 
ON FITNESS_BMR 
REFERENCING NEW AS NEW 
FOR EACH ROW 
BEGIN 
SELECT t1_seq.nextval INTO :NEW.ID FROM dual; 
END; 

我得到這個錯誤:

"Error at line 7: PLS-00103: Encountered the symbol ""CREATE""","" 

有誰知道爲什麼嗎?

+1

這是一個腳本,與它之前立即另一個語句(可能是一個'創建table'或'創建從以前的問題sequence'),和語句不以分號結束;或者如果它是一個塊,'/'?在顯示的代碼片段之前或之後,似乎是導致或遇到了我認爲的問題,因此如果有更多的代碼,請將其顯示出來。 –

+0

您應該查看SQL小提琴:http://sqlfiddle.com/about.html。這非常有趣,也是學習SQL,解決問題以及與他人共享Schema/SELECTs的好方法。 :) – Jess

+1

在[Michael Durant的回答](http://stackoverflow.com/a/15957306/266304)中針對上一個問題的命令只要在「create trigger」後面有一個'/'就可以完全顯示,當在SQL * Plus或SQL Developer中運行時。所以你要麼做一些不同的事情,忽略'/',或者在一個不喜歡把這些命令放在一起的不同客戶端中。您需要準確顯示您正在運行的內容,並提供有關您在哪裏運行它的更多信息。 –

回答

0

我用你的代碼中an SQL fiddle,我得到一個稍微不同的錯誤:

ORA-00900: invalid SQL statement

我改變你的代碼只刪除dual分號後,我可以用任何錯誤創建。此外,表格必須存在,但我認爲你已經做到了! ;)

create table FITNESS_BMR (a number(2)); 

CREATE OR REPLACE TRIGGER test_trigger 
BEFORE INSERT 
ON FITNESS_BMR 
REFERENCING NEW AS NEW 
FOR EACH ROW 
BEGIN 
SELECT t1_seq.nextval INTO :NEW.ID FROM dual 
END; 
+0

我不認爲SQL Fiddle支持PL/SQL塊......我不完全確定觸發塊是否需要放在「模式」部分; – Sathya

+0

所有DDL必須位於SQL Fiddle的模式部分,但它似乎對觸發器很挑剔。雖然'雙'後肯定需要分號。沒有它,你不會看到一個錯誤,因爲它不是試圖執行它 - 你需要在'end;'之後的一個新行上使用'/';但後來它回到ORA-00900,儘管現在聲明在SQL * Plus等有效,所以這似乎是一個小提琴小故障。 –

+0

好的。我會再嘗試。 – Jess