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