2012-09-05 33 views
2

我有一個PL/SQL腳本,像這樣...ORA-12805:並行查詢服務器死於意外

DECLARE 
     CURSOR curs_delete 
     IS  
     SELECT cus_num 
      FROM dob.cust_table GROUP BY cust_num HAVING COUNT(*)>1;     
     TYPE row_cust_num IS TABLE OF dob.cust_table.cust_num%TYPE;  
     col_cust_num row_cust_num; 
    BEGIN 
     OPEN curs_delete; 
     LOOP 
     FETCH curs_delete 
     BULK COLLECT INTO col_cust_num LIMIT 10000; 
     EXIT WHEN col_cust_num.EXISTS (1) = FALSE; 
     FORALL i IN 1 .. col_cust_num.LAST 
      DELETE FROM cust_table 
      WHERE cust_num = col_cust_num (i); 
      COMMIT; 
     END LOOP; 
     CLOSE curs_delete; 
END; 

該查詢返回ORA-12805:parallel query server died unexpectedly錯誤。我不確定它爲什麼會發生。當我得到這個錯誤時,遊標中的select查詢在415條記錄中返回。

任何人都明白爲什麼會出現這個錯誤?

+2

過於含糊,投機性的把它作爲一個答案,但無論如何:遊標循環中Commiting可能無效光標。嘗試去掉內部循環的COMMIT,看看它是否改善了結果。 –

回答

4

這是DBA需要解決的問題,因爲存在大量可能的原因。有人需要查看警報日誌並檢查bdump目錄中的跟蹤文件以獲取診斷信息。

在此期間,如果你只有415條記錄刪除你應該直接使用SQL:

DELETE FROM cust_table 
WHERE cust_num in (SELECT cus_num   
        FROM dob.cust_table 
        GROUP BY cust_num HAVING COUNT(*)>1); 
+2

同意。這(簡單的SQL)是我現在使用的。我很擔心我用光標得到的錯誤,也會與DBA一起檢查。 – Vivek