Способ вставить заявление в oracle-db (Node-js) - PullRequest
0 голосов
/ 06 июня 2019

Я занимаюсь разработкой веб-приложения.Я сталкиваюсь с трудностями при создании оператора SQL для вставки в таблицу.Другие операторы, такие как select, работают.Я использовал oracle db для соединения.

Это фрагмент для создания оператора вставки

  async setAuditLogReprocessData( action, transaction_sequence, user) {

    const bindVars = {
      AUDIT_LOG_ID: AUDIT_LOG_ID_SEQ.NEXTVAL,
      AC: action,
      TRANSACTION_SEQUENCE: transaction_sequence,
      USER_ID: user
    };

    const sql = "AUDIT_LOG_ID, ACTION, TRANSACTION_SEQUENCE, USER_ID";

    let result;
    try {
      result = await this._database.simpleExecute(
        `INSERT INTO TABLE1 ${sql}
        VALUES (AUDIT_LOG_ID_SEQ.NEXTVAL, AC, TRANSACTION_SEQUENCE, USER_ID)`,
        bindVars
      );
    } catch (err) {
      this._logger.error("Could not add audit trail.", err);
      throw new TxnError(500, `Audit Trail error. ${err.message}`);
    }

    return result;

Это код для database.js

  simpleExecute(statement, binds = [], opts = {}) {
    return new Promise(async (resolve, reject) => {
      let conn;

      opts.outFormat = oracledb.OBJECT;
      opts.autoCommit = true;

      try {
        conn = await oracledb.getConnection();

        const result = await conn.execute(statement, binds, opts);
        resolve(result);
      } catch (err) {
        reject(err);
      } finally {
        if (conn) { // conn assignment worked, need to close
          try {
            await conn.close();
          } catch (err) {
            this._server.getLogger().log(err);
          }
        }
      }
    });
  }

Спасиботак много за вашу помощь.

1 Ответ

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

Вообще говоря, полезно показывать сообщение об ошибке, которое вы получаете, когда вам нужна помощь в решении проблемы.Я постараюсь помочь, поскольку есть некоторые очевидные ошибки.

Во-первых, в вашем операторе SQL не определены переменные связывания.Переменные связывания определяются путем ввода точки с запятой перед именем переменной связывания.Поэтому ваш вызов simpleExecute должен выглядеть следующим образом:

      result = await this._database.simpleExecute(
        `INSERT INTO TABLE1 ${sql}
        VALUES (AUDIT_LOG_ID_SEQ.NEXTVAL, :AC, :TRANSACTION_SEQUENCE, :USER_ID)`,
        bindVars
      );

Обратите внимание, что в приведенном выше утверждении есть три переменные связывания: AC, TRANSACTION_SEQUENCE и USER_ID.Я не сделал AUDIT_LOG_ID_SEQ.NEXTVAL переменной связывания, потому что значение, которое вы вводите, должно быть получено из последовательности.

Я предполагаю, что вы хотите, чтобы значение было вставлено в столбец AUDIT_LOG_ID.Для этого вам нужно определить переменную связывания "out" (по умолчанию - in), а затем использовать предложение RETURNING для получения значения.

Определение вашей переменной связывания будет выглядеть так:

    const bindVars = {
      AUDIT_LOG_ID: {
        dir: oracledb.BIND_OUT,
        type: oracledb.NUMBER
      },
      AC: action,
      TRANSACTION_SEQUENCE: transaction_sequence,
      USER_ID: user
    };

Тогда вам нужно обновить ваш SQL-код до следующего:

      result = await this._database.simpleExecute(
        `INSERT INTO TABLE1 ${sql}
        VALUES (AUDIT_LOG_ID_SEQ.NEXTVAL, :AC, :TRANSACTION_SEQUENCE, :USER_ID)
        RETURNING AUDIT_LOG_ID into :AUDIT_LOG_ID`,
        bindVars 
      );

Попробуйте внести эти изменения и сообщите нам, что вы получаете.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...