2011-12-12 32 views
0

我有一個HSQLDB中的觸發器奇怪的問題。我已經多次檢查過這個語法,但是我沒有發現任何錯誤。我現在認爲在觸發器內部創建子查詢可能是不可能的。HSQLDB觸發器語法 - 是否不可能在觸發器內進行子查詢?

這是代碼:

create trigger activate_member after update on member 
     REFERENCING OLD AS old NEW AS new 
     for each row 
     begin atomic 
       IF new.active = FALSE AND old.active = TRUE then 
         insert into member_inactive 
          (
           member, 
           since, 
           until 
         ) 
         values (
           new.id, 
           (select since from member_active where 
member = new.id AND since = (select max(since) from member_active where 
member = new.id group by member)), 
           curdate() 
         ); 
       ELSEIF new.active = TRUE AND old.active = FALSE then 
         insert into member_active (member, since) values 
(new.id, curdate()); 
       end if; 
     end; 

我覺得我做了一切正確的:我對IFELSIEF報表內的每個查詢分號,並end if後尾隨分號。

但我仍然收到此錯誤信息:

SEVERE SQL Error at 'database.sql' line 125: 
"create trigger activate_member after update on member 
     REFERENCING OLD AS old NEW AS new 
     for each row 
     begin atomic 
       IF new.active = FALSE AND old.active = TRUE then 
         insert into member_inactive 
         (
           member, 
           since, 
           until 
         ) 
         values (
           new.id, 
           (select since from member_active where member = new.id AND since = (select max(since) from member_active where member = new.id group by member)), 
           curdate() 
         )" 
unexpected end of statement: required: ; : line: 17 
org.hsqldb.cmdline.SqlTool$SqlToolException 

但在這裏我要補充一個分號?我認爲問題是insert中的子查詢,但這沒有意義。

可能是begin atomic有問題。但是我沒有其他辦法可以在沒有觸發器的情況下擁有if-else語句!

回答

0

我現在發現是什麼導致了這個問題:hsqldb在觸發器內只有begin atomic塊。 裏面一個begin atomic塊我不能使用insert語句...

我現在改成了兩個觸發器與where (statement)條款,該作品也

0

您是否嘗試添加「;」 「curdate()」之後? 希望能幫助你解決這個問題。

+0

沒了那個沒有意義可言,因爲它插入語句內。 ..'意外結束的聲明:必需:):行:16 ' – reox

0

您可能會在INSERT語句的VALUES子句的嵌套子查詢中遇到與使用new.id有關的問題。

創建一個變量併爲其計算「SINCE」列,然後在VALUES列表中使用該變量。

但乍一看,它看起來問題可能與您用來執行腳本的軟件有關,該腳本在找到分號時會切斷語句。如果您使用的是SqlTool,請使用最新版本的軟件,並檢查使用RAW模式的指南以避免此問題。

+0

我可能發現現在是什麼造成這個問題:hsqldb只有'開始原子'塊內觸發在'開始原子'塊我不能使用插入語句...我現在用'where(statement)'子句將它改爲兩個觸發器,這也適用 – reox