2016-08-02 61 views
1

甲VB 6程序正在处理的记录和在临时表中插入,则这些记录是从该临时表来实际的表移动时实际作业之前的Oracle并行查询返回完成

connection.Execute "INSERT INTO MAIN_TABLE SELECT * FROM TEMP_TABLE" 

临时表随后当记录移动时截断

connection.Execute "TRUNCATE TABLE TEMP_TABLE" 

这是工作正常,直到我使用PARALLEL提示INSERT查询。我收到此错误的TRUNCATE

ORA-00054:资源忙,并与指定NOWAIT或超时 收购过期

它看起来对我说,在完成工作之前,并行查询返回和truncate命令发出造成锁定。

我检查了如下插入的记录数,发现它比记录临时表

connection.Execute "INSERT /*+ PARALLEL */ INTO MAIN_TABLE SELECT * FROM TEMP_TABLE", recordsAffected 

数量远不如有没有办法等待INSERT完成?

+0

什么是您的连接字符串?你能指定更长的超时时间吗? – dbmitch

+0

做一个'Delete'而不是'Truncate'。但如果这只是一个临时表,为什么你需要删除呢? '在提交{删除| PRESERVE} ROWS'将在每次提交|后清空表格会话。 – topshot

+0

@dbmitch它不是关于TIMEOUT,而是connection.Execute返回,这会导致下一个查询在第一个查询被执行时仍然处于执行状态 – bjan

回答

0

这里假定您使用的是ADO - 虽然我现在注意到您的问题中没有 标签。

你可以通过等待执行的循环来监视连接状态吗?

喜欢的东西

编辑 - 修正布尔添加使用+而不是 “与”

While Conn.State = (adStateOpen + adStateExecuting) 
    DoEvents 
    Sleep 500 ' uses Sleep API command to delay 1/2 second 
Wend 

Sleep API declare

编辑 - 添加非同步提示/选项

而且 - 它可以帮助ADO连接给它一个暗示,它的异步运行,通过添加adAsyncExecute结束你的执行命令

即。更改执行SQL命令看起来像

conn.execute sqlString, recordsaffected, adAsyncExecute 
+0

不,它不工作 – bjan

+0

这是什么意思?它有一个错误,它永远不会结束或立即退出循环? – dbmitch

+0

我修正了循环条件 - 显然使用AND不会正确添加位 - 两个值都必须设置,所以只需将它们加在一起会产生适当的条件 – dbmitch

0

Delete可能会比较慢,但Truncate是,你不能在同一时间运行DML DDL。实际上,Truncate需要独占访问表。表上的DML将请求表上的共享模式锁定,这意味着您无法同时对该表执行DDL。

可能的替代解决方案是使用同义词。你有你的表格中的 和代名词指点下至A

create table B as select * from A where 1=0; 
create or replace synonym S for B 

你的应用程序现在采用B而不是A,所以你可以做你想做的与A

你想每次都“截断“

+0

我还没有尝试过,但如果INSERT和DELETE并行运行呢?不会删除尚未复制的行吗? – bjan

+0

如果您没有标准来选择要删除的内容,我相信它可以。如果他们来自其他会议,但没有承诺,那么它不会。如果你被允许做'截断',它会做同样的事情。无论哪种方式,如果您试图通过并行运行语句来获得更高的速度,那么您将不得不弄清楚如何处理冲突。所以你'INSERT INTO MAIN_TABLE SELECT * FROM TEMP_TABLE WHERE some_key {<,between,...}'然后在删除时有相同的WHERE子句。 – topshot

相关问题