Как установить Autocommit gobal в экземпляре перед запуском процедуры в Oracledb с использованием Node.js - PullRequest
0 голосов
/ 27 ноября 2018

Я искал и, похоже, не нашел ответа на этот вопрос, который бы работал

Мне нужно запустить процедуру, которая уже сохранена после завершения функции вставки

нормально работающейс SQLDeveloper или Dbeaver вы просто сделали бы

set autocommit on
execute procedure
set autocommit off

, используя узел, я могу вызвать процедуру с CALL PROCEDURE(), но когда я пытаюсь передать оператор SQL set autocommit on, я получаю ORA-00922 - missing or invalid option ошибку

Кажется, я не могу найти какой-то способ сделать это, и мне нужно включить автокоммит, иначе файл журнала вылетит с этой процедурой

Вот примеры функций, которые я использую

oracledb.getConnection(oracleConn, function (err, conn) {
if (err) {
    console.error(err.message);
} else {
    setAutoCommit(conn, "on").then(function (result) {
        if (result == "Success") {
            callProcedure(conn).then(function (result) {
                if (result == "Success") {
                    setAutoCommit(conn, "off").then(function (result) {
                        if (result === "Success") {
                            setTimeout(function () {
                                conn.close();
                            }, 60000);
                        }
                    });
                }
            });
        }
    });
  }    
});
function setAutoCommit(conn, status) {
    return new Promise(function (fulfill, reject) {

        var sql

        if (status === "on") {
            sql = 'set autocommit on';
        } else if (status === "off") {
            sql = "set autocommit off";
        }

        try {

            conn.execute(sql, function (err, result) {
                if (err) {
                    console.log(err, sql)
                } else {
                    console.log(result);
                    return fulfill("Success");
                }
            })
        } catch (e) {
            console.error(e);
            reject(e)
        }
    })
}

function callProcedure(conn) {
    return new Promise(function (fulfill, reject) {
        var sql = "call PROCEDURE()";

        try {
            conn.execute(sql, function (err, result) {
                if (err) {
                    console.log(err, sql)
                    reject(err)
                } else {
                    console.log(result);
                    return fulfill("Success");
                }
            })
        } catch (e) {
            console.log(e);
            reject(e);
        }
    })
}

если кто-нибудь знает, как это сделать, я не смог бы найти ничего достаточно ясного в документах API oracledb

1 Ответ

0 голосов
/ 28 ноября 2018

Pass autoCommit в качестве опции execute() (или executeMany()).Смотрите этот пример .

Вы также можете установить этот параметр глобально, если это соответствует требованиям вашего бизнеса: oracledb.autoCommit = true.

Оба будут делать то же, что и ваш пример SQL * Plus.

См.документация:

https://oracle.github.io/node-oracledb/doc/api.html#propexecautocommit

и

https://oracle.github.io/node-oracledb/doc/api.html#propdbisautocommit

Наконец, я бы рекомендовал использовать стиль async / await программирования, которое можно использовать с Node.js 7.6 и более поздних версий.

...