令牌未知 - 结束触发 Firebird
Token unknown -end Trigger Firebird
我尝试使用此语法在 Firebird ISQL 工具中创建触发器,但收到此消息错误:
Statement failed, SQLSTATE = 42000
Dynamic SQL Error
-SQL error code = -104
-Token unknown - line 6, column 1
-end
CREATE TRIGGER dataweb_inve
ACTIVE AFTER INSERT POSITION 0
ON INVE01
AS
BEGIN
INSERT INTO dataweb (CVE_ART, DESCR, EXIST, NUM_MON, CVE_BITA) SELECT CVE_ART, DESCR, EXIST, NUM_MON, CVE_BITA FROM INVE01 ORDER BY FCH_ULTCOM desc rows 1
END;
您的代码有两个问题:
- PSQL(Firebird Procedural SQL)中的语句必须以分号结束。您的插入缺少该分号,因此 Firebird 解析器在插入语句中发现了一个
END
,但它不希望出现 END
,并引发 token unknown 错误。
- ISQL - 默认情况下 - 使用分号来确定语句何时完成并可以发送到 Firebird 服务器执行。鉴于 PSQL 在内部使用分号来分隔语句,您需要指示 ISQL 使用不同的 statement terminator using the
SET TERM
命令。
总之,你需要在ISQL中使用以下内容:
set term #;
CREATE TRIGGER dataweb_inve
ACTIVE AFTER INSERT POSITION 0
ON INVE01
AS
BEGIN
INSERT INTO dataweb (CVE_ART, DESCR, EXIST, NUM_MON, CVE_BITA)
SELECT CVE_ART, DESCR, EXIST, NUM_MON, CVE_BITA
FROM INVE01
ORDER BY FCH_ULTCOM desc
rows 1;
END#
set term ;#
顺便说一句,您 select 插入行的方式相当可疑,因为 INVE01
中可能存在比触发器触发的行更新的行。如果要插入触发触发器的行的值,请使用 NEW
context.
您的触发器将如下所示:
set term #;
CREATE TRIGGER dataweb_inve
ACTIVE AFTER INSERT POSITION 0
ON INVE01
AS
BEGIN
INSERT INTO dataweb (CVE_ART, DESCR, EXIST, NUM_MON, CVE_BITA)
values (new.CVE_ART, new.DESCR, new.EXIST, new.NUM_MON, new.CVE_BITA);
END#
set term ;#
我尝试使用此语法在 Firebird ISQL 工具中创建触发器,但收到此消息错误:
Statement failed, SQLSTATE = 42000
Dynamic SQL Error
-SQL error code = -104
-Token unknown - line 6, column 1
-end
CREATE TRIGGER dataweb_inve
ACTIVE AFTER INSERT POSITION 0
ON INVE01
AS
BEGIN
INSERT INTO dataweb (CVE_ART, DESCR, EXIST, NUM_MON, CVE_BITA) SELECT CVE_ART, DESCR, EXIST, NUM_MON, CVE_BITA FROM INVE01 ORDER BY FCH_ULTCOM desc rows 1
END;
您的代码有两个问题:
- PSQL(Firebird Procedural SQL)中的语句必须以分号结束。您的插入缺少该分号,因此 Firebird 解析器在插入语句中发现了一个
END
,但它不希望出现END
,并引发 token unknown 错误。 - ISQL - 默认情况下 - 使用分号来确定语句何时完成并可以发送到 Firebird 服务器执行。鉴于 PSQL 在内部使用分号来分隔语句,您需要指示 ISQL 使用不同的 statement terminator using the
SET TERM
命令。
总之,你需要在ISQL中使用以下内容:
set term #;
CREATE TRIGGER dataweb_inve
ACTIVE AFTER INSERT POSITION 0
ON INVE01
AS
BEGIN
INSERT INTO dataweb (CVE_ART, DESCR, EXIST, NUM_MON, CVE_BITA)
SELECT CVE_ART, DESCR, EXIST, NUM_MON, CVE_BITA
FROM INVE01
ORDER BY FCH_ULTCOM desc
rows 1;
END#
set term ;#
顺便说一句,您 select 插入行的方式相当可疑,因为 INVE01
中可能存在比触发器触发的行更新的行。如果要插入触发触发器的行的值,请使用 NEW
context.
您的触发器将如下所示:
set term #;
CREATE TRIGGER dataweb_inve
ACTIVE AFTER INSERT POSITION 0
ON INVE01
AS
BEGIN
INSERT INTO dataweb (CVE_ART, DESCR, EXIST, NUM_MON, CVE_BITA)
values (new.CVE_ART, new.DESCR, new.EXIST, new.NUM_MON, new.CVE_BITA);
END#
set term ;#