VB 6程序正在处理记录并插入临时表,然后将这些记录从这个临时表移到实际的表中。
connection.Execute "INSERT INTO MAIN_TABLE SELECT * FROM TEMP_TABLE"然后,在移动记录时截断临时表。
connection.Execute "TRUNCATE TABLE TEMP_TABLE"这是很好的工作,直到我使用并行提示插入查询。我在截断时收到这个错误。
ORA-00054:资源繁忙,并使用指定的NOWAIT或超时获取
在我看来,并行查询在完成作业之前返回,并发出截断命令导致锁定。
我检查了插入的记录数量如下,发现它远远少于临时表中的记录数量。
connection.Execute "INSERT /*+ PARALLEL */ INTO MAIN_TABLE SELECT * FROM TEMP_TABLE", recordsAffected是否有任何方法等待插入完成?
发布于 2016-08-03 05:22:05
这假设您正在使用ADO --尽管我现在注意到您的问题中没有这个标记。
您能用等待执行完成的循环监视连接状态吗?
有点像
编辑-修正布尔加法使用+代替“和”
While Conn.State = (adStateOpen + adStateExecuting)
DoEvents
Sleep 500 ' uses Sleep API command to delay 1/2 second
Wend编辑-添加同步提示/选项
此外,它还可以通过将adAsyncExecute添加到执行命令的末尾,帮助ADO连接向它提供异步运行的提示。
即。将执行sql命令更改为
conn.execute sqlString, recordsaffected, adAsyncExecute发布于 2016-08-03 12:40:36
Delete可能比较慢,但是Truncate是DDL,您不能与DML同时运行它。实际上,Truncate需要对表的独占访问。表上的DML将请求表上的共享模式锁,这意味着不能同时对表执行DDL。
另一种可能的解决办法是使用同义词。你的表A和同义词S指向A
create table B as select * from A where 1=0;
create or replace synonym S for B你的应用现在用B代替A,这样你就可以用A做你想做的事了。
每次你想“截断”的时候都要这样做
https://stackoverflow.com/questions/38720009
复制相似问题