我在Access / VBA中运行以下代码以INSERT INTO到Oracle表(为了效果而修剪SQL,但需要2个单独的语句)
Dim mydb As DAO.Database
Dim myq As DAO.QueryDef
Set mydb = DBEngine.Workspaces(0).Databases(0)
Set myq = mydb.CreateQueryDef("")
With myq
.SQL = "INSERT INTO tbltrailnew..."
.Execute 'Execute SQL
.SQL = "Commit" 'Commit changes to database
.Execute 'Execute SQL
.SQL = "INSERT INTO tbltrailnew..."
.Execute 'Execute SQL
.SQL = "Commit" 'Commit changes to database
.Execute 'Execute SQL
.Close 'Close connection
End With
由于我不熟悉Oracle,我的问题是 - 我是否正在执行并提交不必要的次数?如果是这样,我的代码怎么能被剥离?
答案 0 :(得分:1)
虽然@StephaneM有一个观点,但这是我的观点:
是的,当你基本上只做一个链接操作时,你只能提交一次,通常,这比提交多次更好。
提交只是意味着:确保我刚才所做的一切都永久写入数据库。如果您在上面发布的子项中途失败,并且您已经提交了一些插入内容,则无法重新运行您将提交两次的其他子项。
如果你在sub的末尾提交,你可以在运行它时发生错误再次运行它。
删除你的第一个提交就是我要改变的。
答案 1 :(得分:1)
通常,您应该在每次交易后提交。从您的示例中看,两个插入到一个表中的应该不是两个事务,因此您最后应该只有一个提交。
应该定义交易的简单类比是ATM取款。每次按下按钮,直到现金提取点,构成一次交易。一旦收到现金,你就会有一个COMMIT。如果您没有收到现金,那就是ROLLBACK。按下每个按钮不能成为交易,否则您可以在要钱时提交,然后不再收到现金。
过度提交可能会导致问题,因为Oracle必须在后台完成大量工作才能将事务写入磁盘。如果连续存在大量插入,例如数据加载,我们通常会在大约5000到10000之后提交。对于大量删除也是如此。
您还可以研究如何使用BULK COLLECT和FORALL / INSERT,以最大限度地减少服务器和客户端之间的往返。仅当您计划进行大量DML(插入/更新/删除)时才会这样做。
答案 2 :(得分:0)
这实际上不是Oracle相关的问题。这一切都与您的数据有关。您应该问自己的问题是,如果任何插入失败,我该怎么办?我应该执行另一个插入吗?我应该回滚/不执行其他插入吗?
选择能使数据库保持一致状态的解决方案。