Привязка к записи будет работать только в node-oracledb 4, который находится в стадии разработки здесь .
У вашего кода также могут быть другие проблемы (количество параметров в вызове PL / SQL, попытка передать какой-либо массив? В запись и т. Д.).
Общее решение для node-oracledb 3.1 состоит в том, чтобы использовать блок-оболочку PL / SQL, с которым вы можете связать допустимые типы. Затем этот блок-обертка массирует значения в запись и вызывает целевую процедуру P_RETENTION_POLICY_CREATE.
Учитывая этот SQL:
set echo on
create or replace package rectest as
type rectype is record (name varchar2(40), pos number);
procedure myproc (p_in in rectype, p_out out rectype);
end rectest;
/
show errors
create or replace package body rectest as
procedure myproc (p_in in rectype, p_out out rectype) as
begin
p_out := p_in;
end;
end rectest;
/
show errors
Вы бы назвали это как:
// Node-oracledb 3.1
'use strict';
const oracledb = require('oracledb');
const config = require('./dbconfig.js');
let sql, binds, options, result;
async function run() {
let connection;
try {
connection = await oracledb.getConnection(config);
sql =
`declare
i_r rectest.rectype; -- input record
o_r rectest.rectype; -- output record
begin
i_r.name := :i_nm;
i_r.pos := :i_ps;
rectest.myproc(i_r, o_r);
:o_nm := o_r.name;
:o_ps := o_r.pos;
end;`;
binds = [
{i_nm: 'def', i_ps: 456},
{i_nm: 'ghi', i_ps: 789},
];
const options = {
bindDefs:
{ i_nm: { type: oracledb.STRING, maxSize: 40 },
i_ps: { type: oracledb.NUMBER },
o_nm: { type: oracledb.STRING, maxSize: 40, dir: oracledb.BIND_OUT },
o_ps: { type: oracledb.NUMBER, dir: oracledb.BIND_OUT }
}
};
result = await connection.executeMany(sql, binds, options);
console.log(result);
} catch (err) {
console.error(err);
} finally {
if (connection) {
try {
await connection.close();
} catch (err) {
console.error(err);
}
}
}
}
run();
Выход
{
outBinds: [ { o_nm: 'def', o_ps: 456 }, { o_nm: 'ghi', o_ps: 789 } ]
}