使用 oracledb npm 库循环 PL/SQL 集合

问题描述 投票:0回答:1

我正在使用 oracledb npm 库来调用 PL/SQL 函数,并将 OUT 参数定义为集合。

FUNCTION f_get_messages_for_processing (
  y_message_list        OUT thrgtw_adapter.tc_pcrf_message
) RETURN NUMBER

tc_pcrf_message
定义如下:

create or replace type thrgtw_adapter.to_pcrf_message is object (
  id_message           number,
  message_type         number,
  msisdn               varchar2(15)
)

create or replace type thrgtw_adapter.tc_pcrf_message is table of thrgtw_adapter.to_pcrf_message

如何在javascript中访问和循环messageList?我按如下方式调用 PL/SQL 函数:

const statement = `
  BEGIN
    :ret := thrgtw_adapter.api_pcrf.f_get_messages_for_processing(:messageList);
  END;
`;

const variables = {
  ret: { dir: oracledb.BIND_OUT, type: oracledb.NUMBER},
  messageList: { dir: oracledb.BIND_OUT, type: 'THRGTW_ADAPTER.TC_PCRF_MESSAGE'}
};

return await db.execute(statement, variables);

问题是,当我将结果写入控制台时,我可以看到数据,但我只是不知道如何访问它,因为以下操作都不起作用:

const resultSet = await dbCommands.getMessagesForProcessing();

console.log(resultSet.outBinds.messageList)
console.log(typeof resultSet.outBinds.messageList) // output 'object'
console.log(Object.keys(resultSet.outBinds.messageList)) //output ['_impl']
resultSet.outBinds.messageList.forEach((item) => { // fails TypeError: resultSet.outBinds.messageList.forEach is not a function
  console.log(item)
})

第一个控制台日志输出以下数据,因此根据 typeof resultSet.outBinds.messageList 它是一个对象,但输出中没有大括号。 Object.keys 返回一个具有一个值 '_impl' 的数组

[THRGTW_ADAPTER.TC_PCRF_MESSAGE] [
  { ID_MESSAGE: 1, MESSAGE_TYPE: 31, MSISDN: '421000000001' },
  { ID_MESSAGE: 2, MESSAGE_TYPE: 32, MSISDN: '421000000002' },
  { ID_MESSAGE: 3, MESSAGE_TYPE: 32, MSISDN: '421000000003' },
  { ID_MESSAGE: 4, MESSAGE_TYPE: 32, MSISDN: '421000000004' }
]

那么我该怎么做才能循环messageList呢?

node.js oracle plsql node-oracledb
1个回答
1
投票

查看文档的这一部分 https://node-oracledb.readthedocs.io/en/latest/user_guide/objects.html#objects,特别是第 15.2 章。它提到属性 dbObjectAsPojo,当设置为 true 时,将导致数据库返回纯 JSON 对象 (POJO),而不是 Proxy(DbObject)。

© www.soinside.com 2019 - 2024. All rights reserved.