Node.js 和 Oracle DB:插入语句不起作用
Node.js and Oracle DB: Insert statement doesn't work
根据SQL查询,我遇到了问题。我的插入查询 returns 回答元组已成功插入,但实际上 table 中没有元组。所以由于某些原因它不起作用。
查询:
connection.execute(
"INSERT INTO "+table+
" VALUES "+
"(:0, :1, :2, :3, :4, :5, :6, :7, :8, :9, :10, :11)",
[objIns.attr1, objIns.attr2, objIns.attr3, objIns.attr4, objIns.attr5, objIns.attr6, objIns.attr7, objIns.attr8, objIns.attr9, objIns.attr10, objIns.attr11, objIns.attr12],
function(err, result){
if (err) {
console.error("insert2",err.message);
callback(err.message)
} else{
console.log("Rows inserted " + result.rowsAffected);
}
});
谢谢。
**UPDATE_SOLUTION1: 添加到你的服务器脚本: oracledb.autoCommit = true; **
**UPDATE_SOLUTION2:将 { autoCommit: true } 添加到 execute() **
我不知道 node.js 是如何工作的,但 Oracle 通常需要在插入后提交。
如果数据不可见,那是因为它没有提交。有几种方法可以做到这一点。
如果您知道应该立即提交 INSERT 语句,最有效的方法是添加 execute()
option autoCommit
,例如:
const r = await connection.execute(
"INSERT INTO "+table+
" VALUES "+
"(:0, :1, :2, :3, :4, :5, :6, :7, :8, :9, :10, :11)",
[objIns.attr1, objIns.attr2, objIns.attr3, objIns.attr4, objIns.attr5, objIns.attr6, objIns.attr7, objIns.attr8, objIns.attr9, objIns.attr10, objIns.attr11, objIns.attr12],
{ autoCommit: true });
对于 INSERTS 序列的常见建议是仅在最后一个语句中使用 autoCommit
。
等效的全局 oracledb.autoCommit = true
会导致过度提交,这是一种资源浪费,并且可能意味着如果应用程序的某些部分出现故障,您将无法回滚到所需的数据状态。
如果您不想在 execute()
或 executeMany()
之后立即提交,那么您可以在以后任何需要的时间使用明确的 commit()
。请注意,这需要 'roundtrip' 到数据库服务器,这与 autoCommit
选项不同,'piggybacked' 到 execute()
或 executeMany()
调用。不必要的往返会降低最终的可扩展性。
请参阅文档 Transaction Management。
如果要插入或更新多条记录,使用executeMany()
效率更高,可以大大提高一系列INSERT或UPDATE的性能。
根据SQL查询,我遇到了问题。我的插入查询 returns 回答元组已成功插入,但实际上 table 中没有元组。所以由于某些原因它不起作用。 查询:
connection.execute(
"INSERT INTO "+table+
" VALUES "+
"(:0, :1, :2, :3, :4, :5, :6, :7, :8, :9, :10, :11)",
[objIns.attr1, objIns.attr2, objIns.attr3, objIns.attr4, objIns.attr5, objIns.attr6, objIns.attr7, objIns.attr8, objIns.attr9, objIns.attr10, objIns.attr11, objIns.attr12],
function(err, result){
if (err) {
console.error("insert2",err.message);
callback(err.message)
} else{
console.log("Rows inserted " + result.rowsAffected);
}
});
谢谢。
**UPDATE_SOLUTION1: 添加到你的服务器脚本: oracledb.autoCommit = true; **
**UPDATE_SOLUTION2:将 { autoCommit: true } 添加到 execute() **
我不知道 node.js 是如何工作的,但 Oracle 通常需要在插入后提交。
如果数据不可见,那是因为它没有提交。有几种方法可以做到这一点。
如果您知道应该立即提交 INSERT 语句,最有效的方法是添加 execute()
option autoCommit
,例如:
const r = await connection.execute(
"INSERT INTO "+table+
" VALUES "+
"(:0, :1, :2, :3, :4, :5, :6, :7, :8, :9, :10, :11)",
[objIns.attr1, objIns.attr2, objIns.attr3, objIns.attr4, objIns.attr5, objIns.attr6, objIns.attr7, objIns.attr8, objIns.attr9, objIns.attr10, objIns.attr11, objIns.attr12],
{ autoCommit: true });
对于 INSERTS 序列的常见建议是仅在最后一个语句中使用 autoCommit
。
等效的全局 oracledb.autoCommit = true
会导致过度提交,这是一种资源浪费,并且可能意味着如果应用程序的某些部分出现故障,您将无法回滚到所需的数据状态。
如果您不想在 execute()
或 executeMany()
之后立即提交,那么您可以在以后任何需要的时间使用明确的 commit()
。请注意,这需要 'roundtrip' 到数据库服务器,这与 autoCommit
选项不同,'piggybacked' 到 execute()
或 executeMany()
调用。不必要的往返会降低最终的可扩展性。
请参阅文档 Transaction Management。
如果要插入或更新多条记录,使用executeMany()
效率更高,可以大大提高一系列INSERT或UPDATE的性能。