我正在使用 Firebird 2.5 和 node-firebird 0.8.6。我必须使用多个存储过程运行 SQL 文件,但总是遇到如下错误
Error: Dynamic SQL Error, SQL error code = -104, Token unknown - line 1, column 5, term at doCallback (/home/somasys/Downloads/testefb/node_modules/node-firebird/lib/index.js:1234:18) at /home/somasys/Downloads/testefb/node_modules/node-firebird/lib/index.js:2929:21 at /home/somasys/Downloads/testefb/node_modules/node-firebird/lib/messages.js:151:25 at search (/home/somasys/Downloads/testefb/node_modules/node-firebird/lib/messages.js:117:13) at /home/somasys/Downloads/testefb/node_modules/node-firebird/lib/messages.js:54:21 at FSReqCallback.wrapper [as oncomplete] (fs.js:477:5)
这是我的 SQL 文件的某些部分:
set term ^;
CREATE OR ALTER PROCEDURE PRC_CALCULATRIBUTA()
BEGIN
...
END^
set term ;^
commit work;
set term ^;
CREATE OR ALTER PROCEDURE PRC_CORRIGEENCERR()
BEGIN
...
END^
set term ;^
commit work;
我已经尝试删除这些set term
和commit work
并在一个
EXECUTE BLOCK AS
BEGIN
...
END
但即便如此,我还是遇到了与上述错误相同的错误。我的 SQL 脚本中是否需要添加任何指令或语句?
最佳答案
Firebird的语句API只能执行单个语句。此外,SET TERM
语句不是 Firebird SQL 语法的一部分。它只是 ISQL 和其他 Firebird 工具中的一个客户端功能,用于确定语句何时完成。另请参阅firebird procedural query throwing "token unknown" error at "SET TERM #;" .
您需要:
- 将 SQL 脚本拆分为单独的语句,
- 删除
SET TERM
语句 - 删除过程体之外的所有语句终止符,并且
- 单独执行语句。
我还建议不要执行commit work
,而是使用node-firebird中的事务控制选项。我不确定执行 commit work
是否能在 node-firebird 中工作,但某些驱动程序会崩溃,因为您只是在没有使用其事务 API 的情况下关闭了它们的事务。
换句话说,您需要执行:
CREATE OR ALTER PROCEDURE PRC_CALCULATRIBUTA()
BEGIN
...
END
可选择执行提交,或使用node-firebird API显式提交,然后
CREATE OR ALTER PROCEDURE PRC_CORRIGEENCERR()
BEGIN
...
END
等等
您不能为此使用执行 block
,因为执行 block
不支持DDL的执行。有一些解决方法可以解决该限制(使用执行语句
),但通常不适合使用执行 block
。
顺便说一句,创建存储过程之间的提交是不必要的。
关于node.js - 如何从nodejs和node-firebird执行多个程序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57890006/