возвращение node-oracledb Ошибка: NJS-044: именованный объект JSON не ожидается в этом контексте при выполнении хранимой процедуры - PullRequest
0 голосов
/ 04 июня 2019

У меня возникла проблема с вызовом хранимой процедуры oracle db с использованием node-oracledb npm ("oracledb": "^ 3.1.2") и ("@ types / oracledb": " ^ 3.1.0 ") в приложение node.js. Хранимая процедура принимает 3 входных параметра типа string, string и array типа oracleDB соответственно. Однако при передаче последнего параметра типа БД приложение node.js выдает исключение "NJS-044: именованный объект JSON не ожидается в этом контексте" .


// DB payload
let obj = {
        tableOwner: 'Mr X',
        tableName: 'Demo',
        retentionData: this.CreateArrayFromJSONObject(array_of_data)
        }

// DB procedure
let procedure: string = `BEGIN PKG_ARCHIVAL_TOOL.P_RETENTION_POLICY_CREATE(:tableOwner, :tableName, :retentionData); END;`;

/// DB execution function call
DBService.getInstance().ExecuteDBProcedureRequest(procedure, userPolicyJSON);

// DB executing
public ExecuteDBProcedureRequest = (procedure: string, inputBody: any) : Promise<any> => {
        return new Promise((resolve, reject) => {
            DBConn.execute(procedure, inputBody, { autoCommit: true}, (err: oracledb.DBError, result: oracledb.Result) => {
                if(err) {
                    reject(err);
                }
                if(result) {
                    resolve(Utils.CreateJSONObject(result));
                }
            })
        });
    }

// SQL procedure call
PKG_ARCHIVAL_TOOL.P_RETENTION_POLICY_CREATE(
                        P_TABLE_OWNER => P_TABLE_OWNER,
                        P_TABLE_NAME => P_TABLE_NAME,
                        P_RETEN_DATA => V_DATA,
                        P_ID => V_ID,
                        P_OUT => V_OUT
                );

P_RETEN_DATA is a table of a record:-
Record - TYPE R_RETENTION_POLICY_DEF IS RECORD(
        COLUMN_NAME    VARCHAR2(40) NOT NULL DEFAULT ' ',
        COLUMN_POS     NUMBER       NOT NULL DEFAULT 1,
        COLUMN_TYPE    VARCHAR2(10) NOT NULL DEFAULT 'NUMBER',
        OPERATOR       VARCHAR2(10) NOT NULL DEFAULT '=',
        GATE           VARCHAR2(10) DEFAULT NULL,
        BRAC_ST        NUMBER       DEFAULT 0,
        BRAC_ED        NUMBER       DEFAULT 0
);
Table :- TYPE T_RETENTION_POLICY_DEF IS TABLE OF R_RETENTION_POLICY_DEF;

array_of_data = [["FNAME, 1, "VARCHAR2", ">", "OR", 0, 0], ["LNAME, 1, "VARCHAR2", "=", "AND", 0, 0]]

1 Ответ

0 голосов
/ 06 июня 2019

Привязка к записи будет работать только в 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 } ]
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...