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;
我认为我所做的一切都是正确的:IF
和 ELSIEF
语句中的每个查询都有分号,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 触发器语法 - 不可能在触发器内进行子查询吗?的主要内容,如果未能解决你的问题,请参考以下文章
Quartz Scheduler +HSQLDB 巨大的 .lobs 文件。尺寸永远增加