HSQLDB触发器语法 - 是否无法在触发器内创建子查询?

时间:2011-12-12 07:54:06

标签: sql syntax 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语句!

3 个答案:

答案 0 :(得分:0)

您是否尝试添加“;”在“curdate()”之后? 希望这可以帮助您解决这个问题。

答案 1 :(得分:0)

您可能会在INSERT语句的VALUES子句中的嵌套子查询中遇到与使用new.id相关的问题。

创建一个变量并将计算出的“SINCE”列分配给它,然后在VALUES列表中使用该变量。

但是乍一看,它看起来问题可能与您用来执行脚本的软件有关,当它找到分号时会切断语句。如果您使用的是SqlTool,请使用最新版本的软件并查看使用RAW模式的指南以避免此问题。

答案 2 :(得分:0)

我发现现在发生了什么问题:hsqldb在触发器中只有begin atomic块。 在begin atomic块内,我无法使用insert语句...

我现在将其更改为带有where (statement)子句的两个触发器,这也可以