如何使用 Node.js 在 Oracle Db 中的过程 运行 之前的实例中设置全局自动提交

How set Autocommit gobal in the instance before running a procedure in Oracledb using Node.js

我正在搜索,但似乎没有找到可行的答案

我需要运行一个在完成插入函数后已经存储的过程

通常 运行 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);
        }
    })
}

如果有人知道如何做到这一点,我在 oracledb API 文档中找不到足够清楚的内容

autoCommit 作为选项传递给 execute()(或 executeMany())。看到这个 example

如果适合您的业务需求,您还可以全局设置该选项: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 style 编程,它可用于 Node.js 7.6 及更高版本。