2016-08-02 63 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

相關問題