2017-09-05 17 views
0

我跑在Access/VBA下面的代码插入到一个Oracle表(SQL修剪的效果,但需要2条独立的语句)多久COMMIT /通过访问VBA执行。在甲骨文

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

无论您是否正确提交归结为您的应用程序的设计。关于数据库事务/逻辑工作单元的一些阅读将给你可应用于任何应用程序的原则。 – BriteSponge

回答

1

虽然@StephaneM有一点,这是我的看法:

是的,当你基本上只是在做一个链接操作,你可以提交一次,通常,这比犯下多次更好。

提交只是意味着:确保我刚才所做的每件事都永久写入数据库。如果你在上面发布的子程序中途失败,并且你已经提交了一些插入,你不能重新运行子程序,否则你会犯它两次。

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

删除您的第一次提交是我会改变的。

0

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

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

1

一般而言,您应该在每次交易之后提交。从你的例子看来,在一个表中插入两个应该是两个事务,所以你最终应该只有一个提交。

一个简单的比喻是什么应该定义一个交易是一个ATM灰取消。每按一下按钮,直至取现点,构成一笔交易。一旦你收到你的现金,你会有一个COMMIT。如果你没有收到你的现金,那是一个ROLLBACK。每按一次按钮都不能成为交易,否则你可能会在要钱的时候犯下错误,然后不能收到现金。

过度提交可能会导致问题,因为Oracle必须在后台执行大量工作才能将事务写入磁盘。如果一行中有大量的插入,比如数据加载,我们通常会在大约5000到10000之后提交。对于大量的删除,这是相同的。

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