通过Access VBA在Oracle中执行COMMIT / EXECUTE的频率

时间:2017-09-05 10:55:16

标签: sql oracle access-vba

我在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,我的问题是 - 我是否正在执行并提交不必要的次数?如果是这样,我的代码怎么能被剥离?

3 个答案:

答案 0 :(得分:1)

虽然@StephaneM有一个观点,但这是我的观点:

是的,当你基本上只做一个链接操作时,你只能提交一次,通常,这比提交多次更好。

提交只是意味着:确保我刚才所做的一切都永久写入数据库。如果您在上面发布的子项中途失败,并且您已经提交了一些插入内容,则无法重新运行您将提交两次的其他子项。

如果你在sub的末尾提交,你可以在运行它时发生错误再次运行它。

删除你的第一个提交就是我要改变的。

答案 1 :(得分:1)

通常,您应该在每次交易后提交。从您的示例中看,两个插入到一个表中的应该不是两个事务,因此您最后应该只有一个提交。

应该定义交易的简单类比是ATM取款。每次按下按钮,直到现金提取点,构成一次交易。一旦收到现金,你就会有一个COMMIT。如果您没有收到现金,那就是ROLLBACK。按下每个按钮不能成为交易,否则您可以在要钱时提交,然后不再收到现金。

过度提交可能会导致问题,因为Oracle必须在后台完成大量工作才能将事务写入磁盘。如果连续存在大量插入,例如数据加载,我们通常会在大约5000到10000之后提交。对于大量删除也是如此。

您还可以研究如何使用BULK COLLECT和FORALL / INSERT,以最大限度地减少服务器和客户端之间的往返。仅当您计划进行大量DML(插入/更新/删除)时才会这样做。

答案 2 :(得分:0)

这实际上不是Oracle相关的问题。这一切都与您的数据有关。您应该问自己的问题是,如果任何插入失败,我该怎么办?我应该执行另一个插入吗?我应该回滚/不执行其他插入吗?

选择能使数据库保持一致状态的解决方案。