【问题标题】:ORA-12805:parallel query server died unexpectedlyORA-12805: 并行查询服务器意外死亡
【发布时间】:2012-09-05 04:43:50
【问题描述】:

我有一个这样的 PL/SQL 脚本...

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 错误。我不确定为什么会这样。当我遇到这个错误时,游标中的选择查询返回了大约 415 条记录。

有人知道为什么会出现这个错误吗?

【问题讨论】:

  • 太模糊和投机,无法将其作为答案,但无论如何:在游标循环中提交可能会使游标无效。尝试取出内循环的COMMIT,看看是否改善了结果。

标签: oracle plsql cursor


【解决方案1】:

这是一个需要您的 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);  

【讨论】:

  • 同意。这(简单的 SQL)是我现在使用的。我担心光标出现的错误,也将与 DBA 一起检查。
猜你喜欢
  • 2018-03-10
  • 1970-01-01
  • 2017-10-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-22
  • 1970-01-01
  • 2021-08-21
相关资源
最近更新 更多