HSQLDB 触发器语法 - 不可能在触发器内进行子查询吗?

Posted

技术标签:

【中文标题】HSQLDB 触发器语法 - 不可能在触发器内进行子查询吗?【英文标题】:HSQLDB Trigger Syntax - is it impossible to make subqueries inside a trigger? 【发布时间】:2011-12-12 07:54:06 【问题描述】:

我对 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 语句!

【问题讨论】:

【参考方案1】:

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

【讨论】:

不,这根本没有意义,因为它在插入语句中......unexpected end of statement: required: ) : line: 16 【参考方案2】:

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

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

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

【讨论】:

我现在可能会发现是什么导致了这个问题:hsqldb 只有begin atomic 块在触发器内 在begin atomic 块内我不能使用插入语句...我现在用@ 将它更改为两个触发器987654323@ 子句,这也有效【参考方案3】:

我现在发现是什么导致了这个问题:hsqldb 在触发器内只有begin atomic 块。 在begin atomic 块内我不能使用insert 语句...

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

【讨论】:

以上是关于HSQLDB 触发器语法 - 不可能在触发器内进行子查询吗?的主要内容,如果未能解决你的问题,请参考以下文章

HSQLDB 在触发器中声明行

HSQLDB 删除触发器导致子查询出现问题

HSQLDB 触发器 - 引用新表

Quartz Scheduler +HSQLDB 巨大的 .lobs 文件。尺寸永远增加

HSQLDB 在使用嵌套查询并且数据库处于只读模式时触发 OutOfMemoryError

使用 SimpleJdbcTestUtils.executeSqlScript() 时 HSQLDB 触发语句错误