节点oracledb从PL/SQL过程获取返回值和输出值时出现问题
下午好,我在oracle db中有一个存储函数定义:节点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;
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”更改为完全限定名,即包括架构名。这有助于减少对数据库的访问并提高性能。我已经更新了示例。另外,您应该对我的第二个选项进行基准测试。