如何从 nodejs 和 node-firebird 执行多个程序?
How to execute multiples procedures from nodejs and node-firebird?
我使用的是 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
以及 运行 它(SQL 脚本)
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
等等
您不能为此使用 execute block
,因为 execute block
不支持执行 DDL。有解决该限制的方法(使用 execute statement
),但通常不能很好地使用 execute block
.
顺便说一句,创建存储过程之间的提交是不必要的。
我使用的是 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
以及 运行 它(SQL 脚本)
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
等等
您不能为此使用 execute block
,因为 execute block
不支持执行 DDL。有解决该限制的方法(使用 execute statement
),但通常不能很好地使用 execute block
.
顺便说一句,创建存储过程之间的提交是不必要的。