如何使用 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 及更高版本。
我正在搜索,但似乎没有找到可行的答案
我需要运行一个在完成插入函数后已经存储的过程
通常 运行 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 及更高版本。