我使用Firebird 2.5和节点-firebird 0.8.6。我必须运行带有多个存储过程的SQL文件,但总是会出现以下错误
错误:动态SQL错误,SQL错误代码= -104,令牌未知-第1行,第5列,(/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( /home/somasys/Downloads/testefb/node_modules/node-firebird/lib/messages.js:54:21 at FSReqCallback.wrapper as oncomplete )
这里是我的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脚本中?
发布于 2019-09-11 14:49:44
Firebird的语句API只能执行单个语句。此外,SET TERM语句不是Firebird语法的一部分。它只是ISQL和其他Firebird工具中的客户端特性,用于确定语句何时完成。另见firebird procedural query throwing "token unknown" error at "SET TERM #;"。
你需要:
SET TERM语句我还建议不要执行commit work,而是使用节点-火鸟的事务控制选项。我不确定执行commit work是否能在节点-firebird中工作,但是一些驱动程序会中断,因为您只是在没有使用它们的事务API的情况下关闭了它们上的事务。
换句话说,您需要执行:
CREATE OR ALTER PROCEDURE PRC_CALCULATRIBUTA()
BEGIN
...
END可以选择使用节点-firebird API执行提交或显式提交,然后
CREATE OR ALTER PROCEDURE PRC_CORRIGEENCERR()
BEGIN
...
END等。
您不能为此使用execute block,因为execute block不支持DDL的执行。这个限制有一些解决办法(使用execute statement),但它通常不是execute block的好使用。
顺便说一句,在创建存储过程之间提交是不必要的。
https://stackoverflow.com/questions/57890006
复制相似问题