执行存储过程时node-oracledb错误

node-oracledb error when executing a stored procedure

我正在使用 Node 10.x 和 Oracledb 3.0

我正在尝试在 node.js

中执行存储过程

我在程序中有异常块,如下所示:

EXCEPTION
WHEN NO_DATA_FOUND THEN
OUT_STATUS:='FAILURE';
OUT_STATUS_DESC:='USER NOT MAPPED TO A GROUP';
WHEN OTHERS THEN
OUT_STATUS:='FAILURE';
OUT_STATUS_DESC:=dbms_utility.format_error_backtrace;

每当控制转到 node.js 中抛出以下错误的异常块时。

Error: ORA-24338: statement handle not executed

但是,如果我使用相同的 IN 参数在 db 中执行程序,它会给出正确的 OUT 参数,但有错误并且 CURSOR 已关闭。

这些是过程中的 OUT 参数类型。

OUT_STATUS OUT VARCHAR2, OUT_STATUS_DESC OUT VARCHAR2, OUT_MENU_NAME OUT SYS_REFCURSOR

可能是什么问题?

即使您不打算在 node-oracledb 代码中使用它们,也必须将所有 OUT 变量设置为某些内容,请参阅 https://github.com/oracle/node-oracledb/issues/886

事实证明,所有基于 Oracle C 'OCI' API 的 Oracle DB 驱动程序(例如 node-oracledb)都是如此,但症状问题在 node-oracledb 中更常见。

一个解决方法是,如果之前没有打开它,那么在异常块中打开零行的 OUT_MENU_NAME 游标:

EXCEPTION
  WHEN NO_DATA_FOUND THEN
    OUT_STATUS:='FAILURE';
    OUT_STATUS_DESC:='USER NOT MAPPED TO A GROUP';

    -- Replicate your normal cursor output and filter on something that will never be true:
    OPEN  OUT_MENU_NAME FOR
      SELECT 'Nothing'         AS col1,
             DATE '1970-01-01' AS col2,
             0                 AS col3
      FROM DUAL
      WHERE 1 = 0;

  WHEN OTHERS THEN
    OUT_STATUS:='FAILURE';
    OUT_STATUS_DESC:=dbms_utility.format_error_backtrace;

    -- Replicate your normal cursor output and filter on something that will never be true:
    OPEN  OUT_MENU_NAME FOR
      SELECT 'Nothing'         AS col1,
             DATE '1970-01-01' AS col2,
             0                 AS col3
      FROM DUAL
      WHERE 1 = 0;