【问题标题】:How to execute multiples procedures from nodejs and node-firebird?如何从 nodejs 和 node-firebird 执行多个程序?
【发布时间】:2021-05-01 00:44:13
【问题描述】:

我正在使用 Firebird 2.5 和 node-firebird 0.8.6。我必须使用多个存储过程运行 SQL 文件,但我总是遇到如下错误

错误:动态 SQL 错误,SQL 错误代码 = -104,令牌未知 - 第 1 行,第 5 列,术语 在 doCallback (/home/somasys/Downloads/testefb/node_modules/node-firebird/lib/index.js:1234:18) 在/home/somasys/Downloads/testefb/node_modules/node-firebird/lib/index.js:2929:21 在/home/somasys/Downloads/testefb/node_modules/node-firebird/lib/messages.js:151:25 在搜索(/home/somasys/Downloads/testefb/node_modules/node-firebird/lib/messages.js:117:13) 在/home/somasys/Downloads/testefb/node_modules/node-firebird/lib/messages.js:54:21 在 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 并在 a 中运行它(SQL 脚本)

EXECUTE BLOCK AS 
BEGIN
  ...
END

但即便如此,我也遇到了与上述相同的错误。是否有任何指令或语句可以放入我的 SQL 脚本中?

【问题讨论】:

    标签: node.js firebird firebird2.5 node-firebird


    【解决方案1】:

    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

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

    【讨论】:

    • 提前致谢。你的回答很有启发性。我将采取这些步骤并重新运行我的 sql 文件。再来一次谢谢。
    • @FelipePaz 也许您可以在node-firebird 之上实现脚本执行,然后将其提交到库。它需要一个有限的基于 FSM 的 SQL 半解析器,它可以将脚本拆分为独立的语句。您可以查看 Delphi Unified Interbase 库的示例实现。
    猜你喜欢
    • 2019-01-28
    • 1970-01-01
    • 2015-04-27
    • 2014-06-11
    • 1970-01-01
    • 2018-01-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多