3

根据 SQL 查询我有一个问题。我的插入查询返回元组插入成功但实际上表中没有元组的答案。所以由于某些原因它不起作用。询问:

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() **

4

2 回答 2

9

如果数据不可见,那是因为它没有被提交。有几种方法可以做到这一点。

如果您知道应该立即提交 INSERT 语句,最有效的方法是添加如下execute()选项 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()or之后立即提交,那么您可以在以后任何需要的时间executeMany()使用显式。commit()请注意,这需要“往返”到数据库服务器,autoCommit这与“捎带”到execute()orexecuteMany()调用的选项不同。不必要的往返会降低最终的可扩展性。

请参阅文档事务管理

如果要插入或更新多条记录,使用 效率更高executeMany(),可以大大提高一系列 INSERT 或 UPDATE 的性能。

于 2016-05-16T01:23:40.753 回答
4

我不知道 node.js 是如何工作的,但是 Oracle 通常需要在插入后提交。

于 2016-05-15T14:25:17.943 回答