令牌未知 - 结束触发 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;

您的代码有两个问题:

  1. PSQL(Firebird Procedural SQL)中的语句必须以分号结束。您的插入缺少该分号,因此 Firebird 解析器在插入语句中发现了一个 END,但它不希望出现 END,并引发 token unknown 错误。
  2. 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 ;#