我对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语句!
答案 0 :(得分:0)
您是否尝试添加“;”在“curdate()”之后? 希望这可以帮助您解决这个问题。
答案 1 :(得分:0)
您可能会在INSERT语句的VALUES子句中的嵌套子查询中遇到与使用new.id相关的问题。
创建一个变量并将计算出的“SINCE”列分配给它,然后在VALUES列表中使用该变量。
但是乍一看,它看起来问题可能与您用来执行脚本的软件有关,当它找到分号时会切断语句。如果您使用的是SqlTool,请使用最新版本的软件并查看使用RAW模式的指南以避免此问题。
答案 2 :(得分:0)
我发现现在发生了什么问题:hsqldb在触发器中只有begin atomic
块。
在begin atomic
块内,我无法使用insert
语句...
我现在将其更改为带有where (statement)
子句的两个触发器,这也可以