node oracledb从pl/sql过程获取返回值和输出值时出现问题

rkttyhzu  于 2021-07-29  发布在  Java
关注(0)|答案(1)|浏览(319)

下午好,我在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查询非常陌生,所以如果有人能给我一个关于如何处理这个问题的建议,我将非常感激。

gorkyyrv

gorkyyrv1#

请看节点oracledb示例https://github.com/oracle/node-oracledb/blob/master/examples/plsqlfunc.js 以及https://github.com/oracle/node-oracledb/blob/master/examples/plsqlrecord.js
还要查看node oracledb文档。
首先,需要使用另一个bind变量将函数结果返回给。诀窍是设置类型-我不知道是什么 INFO_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\u geometry”,而不是“sdo\u 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语句。

相关问题