首页 > 解决方案 > 令牌未知 - 结束触发火鸟

问题描述

我尝试使用此语法在 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;

标签: firebird

解决方案


您的代码有两个问题:

  1. PSQL (Firebird Procedural SQL) 中的语句必须以分号结束。您的插入缺少该分号,因此 Firebird 解析器END在它不期望的插入语句中找到一个,并引发令牌未知错误。
  2. ISQL - 默认情况下 - 使用分号来确定语句何时完成并且可以发送到 Firebird 服务器执行。鉴于 PSQL 在内部使用分号来分隔语句,您需要指示 ISQL使用该命令使用不同的语句终止符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 ;#

顺便说一句,您选择要插入的行的方式相当可疑,因为可能存在INVE01比触发器触发的行更新的行。如果要插入触发器触发的行的值,请使用NEWcontext

您的触发器将如下所示:

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 ;#

推荐阅读