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

Oracle并行查询在实际作业完成之前返回,oracle,oracle11g,vb6,ado,Oracle,Oracle11g,Vb6,Ado,一个VB6程序正在处理记录并插入一个临时表中,然后将这些记录从这个临时表移动到实际表中 connection.Execute "INSERT INTO MAIN_TABLE SELECT * FROM TEMP_TABLE" 移动记录时,临时表将被截断 connection.Execute "TRUNCATE TABLE TEMP_TABLE" 在我使用并行提示进行插入查询之前,这一切都很正常。我在截断时收到此错误 ORA-00054:资源繁忙,并在指定NOWAIT或超时的情况下获取 过期

一个VB6程序正在处理记录并插入一个临时表中,然后将这些记录从这个临时表移动到实际表中

connection.Execute "INSERT INTO MAIN_TABLE SELECT * FROM TEMP_TABLE"
移动记录时,临时表将被截断

connection.Execute "TRUNCATE TABLE TEMP_TABLE"
在我使用并行提示进行插入查询之前,这一切都很正常。我在截断时收到此错误

ORA-00054:资源繁忙,并在指定NOWAIT或超时的情况下获取 过期

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

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

connection.Execute "INSERT /*+ PARALLEL */ INTO MAIN_TABLE SELECT * FROM TEMP_TABLE", recordsAffected
有没有办法等待插入完成

这假设您使用的是ADO,但我现在注意到您没有 你问题中的标签

您是否可以使用等待执行完成的循环来监视连接状态

差不多

编辑-将布尔值添加到+而不是“AND”

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

另外,通过在execute命令的末尾添加
adAsyncExecute
,它可以帮助ADO连接提示它异步运行

将executesql命令更改为

conn.execute sqlString, recordsaffected, adAsyncExecute
这假设您使用的是ADO,但我现在注意到您没有 你问题中的标签

您是否可以使用等待执行完成的循环来监视连接状态

差不多

编辑-将布尔值添加到+而不是“AND”

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

另外,通过在execute命令的末尾添加
adAsyncExecute
,它可以帮助ADO连接提示它异步运行

将executesql命令更改为

conn.execute sqlString, recordsaffected, adAsyncExecute

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

另一种可能的解决办法是使用同义词。你有你的桌子吗 还有一个同义词S指向

create table B as select * from A where 1=0; 
create or replace synonym S for B
你的应用现在使用B而不是A,所以你可以用A做你想做的事情


每次要“截断”时都执行此操作

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

另一种可能的解决办法是使用同义词。你有你的桌子吗 还有一个同义词S指向

create table B as select * from A where 1=0; 
create or replace synonym S for B
你的应用现在使用B而不是A,所以你可以用A做你想做的事情



每次要“截断”时都要执行此操作。

连接字符串是什么?是否可以指定更长的超时时间?请执行
删除
而不是
截断
。但是,如果这只是一个临时表,为什么需要删除呢
在提交时{DELETE | PRESERVE}行
将在每次提交|会话后清空表。@dbmitch这不是关于超时,而是关于连接。Execute返回导致在第一个查询仍处于运行状态时执行下一个查询process@topshot删除将更慢,更具事务性,而截断则不会,临时表不是Oracle的临时表,它是一个实际的物理表,还有另一个过程检查记录的正确性,然后再次执行移动…您的连接字符串是什么?您的连接字符串是什么?是否可以指定更长的超时时间?请执行
删除
而不是
截断
。但是,如果这只是一个临时表,为什么需要删除呢
在提交时{DELETE | PRESERVE}行
将在每次提交|会话后清空表。@dbmitch这不是关于超时,而是关于连接。Execute返回导致在第一个查询仍处于运行状态时执行下一个查询process@topshot删除将更慢,更具事务性,而截断则不会,临时表不是Oracle的临时表,它是一个实际的物理表,还有另一个过程检查记录的正确性,然后再次执行移动…您的连接字符串是什么?这意味着什么?它有一个错误,它永远不会结束或者它立即退出循环?我修复了循环条件-显然使用了,并且没有正确地添加位-两个值都必须设置,因此,简单地将它们加在一起将产生适当的条件,这一次它正在等待,但我不知道它正在等待作业结束,因为我仍然收到相同的资源繁忙错误。这意味着什么?它有一个错误,它永远不会结束或者它立即退出循环?我修复了循环条件-显然使用了,并且没有正确地添加位-两个值都必须设置,因此,简单地将它们添加到一起将产生适当的条件。这次它正在等待,但我不知道它是否正在等待作业结束,因为我仍然收到相同的资源繁忙错误。我没有尝试过这一点,但如果INSERT和DELETE并行运行会怎么样?它不会删除尚未复制的行吗?如果您没有选择要删除的内容的条件,我相信它可以。如果它们来自其他会话,但尚未提交,则不会提交。如果允许您执行
截断
,它也会执行相同的操作。无论哪种方式,如果您试图通过并行运行语句来获得更快的速度,那么您必须找出如何处理冲突。所以您
INSERT-INTO-MAIN_TABLE SELECT*FROM-TEMP_TABLE,其中一些_键{我还没有尝试过,但是如果INSERT和DELETE并行运行呢?它不会删除尚未复制的行吗?如果