节点oracledb从PL/SQL过程获取返回值和输出值时出现问题

节点oracledb从PL/SQL过程获取返回值和输出值时出现问题,sql,node.js,oracle,plsql,node-oracledb,Sql,Node.js,Oracle,Plsql,Node Oracledb,下午好,我在oracle db中有一个存储函数定义: CREATE OR REPLACE FUNCTION GET_INFO(id IN VARCHAR2, account IN VARCHAR2, info out INFO_ITEM) RETURN NUMBER AS rv NUMBER:= 0; ... 我正在尝试使用节点oracledb模块获取返回值和输出值: const sql = ` DECLARE info INFO_ITEM;

下午好,我在oracle db中有一个存储函数定义:

CREATE OR REPLACE FUNCTION GET_INFO(id IN VARCHAR2,
account IN VARCHAR2,
info out INFO_ITEM)
RETURN NUMBER
AS
rv NUMBER:= 0;
...
我正在尝试使用节点oracledb模块获取返回值和输出值:

const sql = `
          DECLARE
          info INFO_ITEM;
          result NUMBER;
          BEGIN 
            :result := GET_INFO(:id, :account, info);                     
          END;
`;
const params = {
          id: '123',
          account: '123',
          result: { dir: BIND_OUT },
        };

const options = {
    outFormat: oracledb.OUT_FORMAT_OBJECT,
};

oracleConnection.execute(sql, params, options)

我得到的查询结果很好({outBinds:{result:1}}),但在计算如何获得输出值时遇到了困难。我对PL/SQL查询非常陌生,因此如果有人能给我一个关于如何实现这一点的建议,我将不胜感激。

看看节点oracledb示例和

此外,还请查看

首先,需要使用另一个bind变量将函数结果返回给。诀窍是设置类型-我不知道
INFO\u ITEM
是什么。类似的方法可能会奏效:

const sql = `
          BEGIN
            :result := GET_INFO(:id, :account, :info);
          END;
`;
const params = {
          id: '123',
          account: '123',
          info: { dir: oracledb.BIND_OUT, type: "THEOWNINGSCHEMANAME.INFO_ITEM" },
          result: { dir: oracledb.BIND_OUT, type: oracledb.NUMBER }
        };

const options = {
    outFormat: oracledb.OUT_FORMAT_OBJECT,
};

oracleConnection.execute(sql, params, options)
注意,文件上说:

处理同一类型的多个对象时,请充分使用 限定名称,如“MDSYS.SDO_GEOMETRY”,而不是“SDO_GEOMETRY”。 或者,保留并使用 connection.getDbObjectClass()。节点oracledb将缓存类型 使用类型的完全限定名作为要避免的键的信息 可能的话,往返旅行的费用。每个连接都有其自身的特性 自己的缓存

另一种方法(实际上可能有性能优势)是将
info
的各个部分作为标量绑定值返回。比如:

const sql = `
          DECLARE
          info INFO_ITEM;
          result NUMBER;
          BEGIN
            :result := GET_INFO(:id, :account, info);
            :v1 := info.whatever;
          END;
`;
const params = {
          id: '123',
          account: '123',
          result: { dir: oracledb.BIND_OUT,  oracledb.NUMBER },
          v1:  { dir: oracledb.BIND_OUT,  oracledb.NUMBER },
        };

const options = {
    outFormat: oracledb.OUT_FORMAT_OBJECT,
};

oracleConnection.execute(sql, params, options)

关于术语,PL/SQL块不是查询。查询类似于SELECT语句。

非常感谢,第一个解决方案非常有效!为了提高性能,您应该将“type”更改为完全限定名,即包括架构名。这有助于减少对数据库的访问并提高性能。我已经更新了示例。另外,您应该对我的第二个选项进行基准测试。