BindOut ora-06502: pl / sql: ошибка числового значения или значения: слишком маленький буфер символьных строк в Node.js i - PullRequest
0 голосов
/ 20 июня 2019

Когда я запускаю этот SP в Oracle Dev,

, выводится ошибка

TABLE_1(:p_txn_seq, :v_rec_seq); ORA-02091: transaction rolled back
ORA-02291: integrity constraint (TABLE_1.COLUMN1_FK1) violated - parent key not found

Но в узле js возникает ошибка, связанная с привязкой

ora-06502: pl/sql: numeric or value error: character string buffer too small

Вот код в node.js

 const sql = `BEGIN
    SP_NAME(
      :INPUT_TXN,
      :INPUT_SEQ_CNT,
      :IGNORE,
      :ROW_ERROR,
      :STATUS);
    END;`;
    const bindVars = {
      INPUT_TXN: transactionSeq, 
      INPUT_SEQ_CNT: count, 
      IGNORE: '', 
      ROW_ERROR: { dir: Database.BIND_OUT, type: Database.STRING, maxSize: 200 }, 
      STATUS: { dir: Database.BIND_OUT, type: Database.STRING, maxSize: 2000 }, 
    }

    let result;
    try {
      result = await this._database.simpleExecute(sql, bindVars);
    } catch (err) {
      return this.throwTxnError(417, "error. txnSeq: " + transactionSeq, err,
        { transactionSeq, sql, bindVars });
    }

Переменная связывания состояния содержит STATUS: {dir: Database.BIND_OUT, тип: Database.STRING, maxSize: 2000}

Спасибо за вашу помощь

1 Ответ

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

Проверьте размер возвращаемых строк и увеличьте maxSize при необходимости.

Это также дает ORA-06502: PL/SQL: numeric or value error: character string buffer too small, но если вы увеличите первое значение maxSize до 3, тогда все будет хорошо.

await connection.execute(
  `create or replace procedure SP_NAME(
     INPUT_TXN      IN  NUMBER,
     INPUT_SEQ_CNT  IN  NUMBER,
     IGNORE         IN  VARCHAR2,
     ROW_ERROR      OUT VARCHAR2,
     STATUS         OUT VARCHAR2) as
   begin
     row_error := 'abc';
     status := 'def';
   end;`);

const sql = `BEGIN
SP_NAME(
  :INPUT_TXN,
  :INPUT_SEQ_CNT,
  :IGNORE,
  :ROW_ERROR,
  :STATUS);
END;`;

let transactionSeq = 123;
let count = 456;

const bindVars = {
  INPUT_TXN: transactionSeq,
  INPUT_SEQ_CNT: count,
  IGNORE: '',
  ROW_ERROR: { dir: oracledb.BIND_OUT, type: oracledb.STRING, maxSize: 2 },
  STATUS: { dir: oracledb.BIND_OUT, type: oracledb.STRING, maxSize: 20 },
};

result = await connection.execute(sql, bindVars);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...