首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Oracle并行查询在实际作业完成前返回

Oracle并行查询在实际作业完成前返回
EN

Stack Overflow用户
提问于 2016-08-02 12:07:26
回答 2查看 100关注 0票数 1

VB 6程序正在处理记录并插入临时表,然后将这些记录从这个临时表移到实际的表中。

代码语言:javascript
复制
connection.Execute "INSERT INTO MAIN_TABLE SELECT * FROM TEMP_TABLE"

然后,在移动记录时截断临时表。

代码语言:javascript
复制
connection.Execute "TRUNCATE TABLE TEMP_TABLE"

这是很好的工作,直到我使用并行提示插入查询。我在截断时收到这个错误。

ORA-00054:资源繁忙,并使用指定的NOWAIT或超时获取

在我看来,并行查询在完成作业之前返回,并发出截断命令导致锁定。

我检查了插入的记录数量如下,发现它远远少于临时表中的记录数量。

代码语言:javascript
复制
connection.Execute "INSERT /*+ PARALLEL */ INTO MAIN_TABLE SELECT * FROM TEMP_TABLE", recordsAffected

是否有任何方法等待插入完成?

EN

回答 2

Stack Overflow用户

发布于 2016-08-03 05:22:05

这假设您正在使用ADO --尽管我现在注意到您的问题中没有这个标记。

您能用等待执行完成的循环监视连接状态吗?

有点像

编辑-修正布尔加法使用+代替“和”

代码语言:javascript
复制
While Conn.State = (adStateOpen + adStateExecuting)
   DoEvents
   Sleep 500 ' uses Sleep API command to delay 1/2 second
Wend

Sleep API declare

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

此外,它还可以通过将adAsyncExecute添加到执行命令的末尾,帮助ADO连接向它提供异步运行的提示。

即。将执行sql命令更改为

代码语言:javascript
复制
conn.execute sqlString, recordsaffected, adAsyncExecute
票数 0
EN

Stack Overflow用户

发布于 2016-08-03 12:40:36

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

另一种可能的解决办法是使用同义词。你的表A和同义词S指向A

代码语言:javascript
复制
create table B as select * from A where 1=0; 
create or replace synonym S for B

你的应用现在用B代替A,这样你就可以用A做你想做的事了。

每次你想“截断”的时候都要这样做

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38720009

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档