node.js - 如何从nodejs和node-firebird执行多个程序?

标签 node.js firebird firebird2.5 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 termcommit 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

等等

您不能为此使用执行 block ,因为执行 block 不支持DDL的执行。有一些解决方法可以解决该限制(使用执行语句),但通常不适合使用执行 block

顺便说一句,创建存储过程之间的提交是不必要的。

关于node.js - 如何从nodejs和node-firebird执行多个程序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57890006/

相关文章:

javascript - JSON.parse 没有预期的行为

mysql - 适用于数据库繁重、繁忙的网站/应用程序的数据库管理系统?

Firebird 2.5 TRIM(TRAILING FROM Field)在 UTF8 上非常慢

python - 如何使用Python fdb从Firebird数据库正确调用UDF(外部函数)

javascript - express.static 与 res.sendFile

javascript - 用于在特定时间触发事件的 Node.js 类 Cron 库

javascript - NodeJS 获取异步返回值(回调)

sql - 如何对列表聚合进行排序?

firebird - 如何查找哪个表列对应于 Firebird 数据库中的约束?

firebird - Firebird嵌入式服务器是否提供多线程并发?