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
在它不期望的插入语句中找到一个,并引发令牌未知错误。 - 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
比触发器触发的行更新的行。如果要插入触发器触发的行的值,请使用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 ;#
推荐阅读
- java - 插件 'org.apache.maven.plugins:maven-compiler-plugin:3.8.0' 未找到
- db2 - 将文件中的 TIMESTAMP 数据加载到 IBM Db2 on Cloud
- postgresql - Heroku 错误:sqlalchemy.exc.OperationalError:(psycopg2.OperationalError)无法连接到服务器:连接被拒绝
- javascript - 保持 Vuetify 扩展面板默认打开
- python - 使用 BeautifulSoup 从网站下载特定图像
- node.js - GCP Secret Manager 抛出:“路径”参数必须是字符串类型
- flask - 如何使用 Flask/Heroku 修复 500 内部错误?
- rest - Spring webflux with webclient bodyToMono UnsupportedMediaTypeException 不支持内容类型'application/json'
- python - py-thesaurus 仍然可以使用吗?
- multithreading - Vulkan 受干扰的应用程序在互斥锁下的队列提交中收到错误消息