查询导致DB使用ORA-0113失败

时间:2012-06-18 13:15:33

标签: oracle oracle11gr2

我需要在内联视图中创建集合中元素的集合。我尝试使用collect和table函数对集合进行解聚并再次聚合,但是ORA-03113失败了。

以下是导致问题的查询的简化版本。

在我的实现中,我将在单个查询中将多个级别的嵌套查询与联合连接,这些查询应将所有集合聚合为一个集合。出于性能原因(昂贵的上下文切换),实现PL / SQL代码来聚合集合不是一种选择。

非常感谢您的反馈/建议。

脚本


SELECT BANNER FROM V$VERSION
/

CREATE OR REPLACE TYPE OBJECT_ID_TAB_T IS TABLE OF NUMBER(11);
/

SELECT OWNER, CAST(COLLECT( MULTISET(SELECT COLUMN_VALUE FROM TABLE((OBJECT_ID_LIST) ))) AS OBJECT_ID_TAB_T) AS OBJECT_ID_LIST
FROM  (SELECT OWNER, OBJECT_NAME, CAST(COLLECT(OBJECT_ID) AS OBJECT_ID_TAB_T)  AS OBJECT_ID_LIST
       FROM ALL_OBJECTS
       GROUP BY OWNER, OBJECT_NAME
      )
GROUP BY OWNER
/

结果


BANNER                                                                          
--------------------------------------------------------------------------------
Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production    
PL/SQL Release 11.2.0.1.0 - Production                                          
CORE    11.2.0.1.0  Production                                                      
TNS for 64-bit Windows: Version 11.2.0.1.0 - Production                         
NLSRTL Version 11.2.0.1.0 - Production                                          

5 rows selected.
Type created.
SELECT OWNER, CAST(COLLECT( MULTISET(SELECT COLUMN_VALUE FROM TABLE((OBJECT_ID_LIST) ))) AS OBJECT_ID_TAB_T) AS OBJECT_ID_LIST
FROM  (SELECT OWNER, OBJECT_NAME, CAST(COLLECT(OBJECT_ID) AS OBJECT_ID_TAB_T)  AS OBJECT_ID_LIST
       FROM ALL_OBJECTS
       GROUP BY OWNER, OBJECT_NAME
      )
GROUP BY OWNER
*
Error at line 0
ORA-03113: end-of-file on communication channel
Process ID: 8000
Session ID: 154 Serial number: 164

Script Terminated on line 25.

1 个答案:

答案 0 :(得分:1)

ORA-03113 :通讯渠道错误的文件结尾是一般错误,因为您可能知道如果您在此处发布了此问题。因此,这里有一系列可以帮助您解决问题的内容,而不是让您了解可能的原因。此错误非常常见,以至于不太可能找到确切的原因,因此您需要了解如何通过挖掘日志和/或跟踪文件来调试此特定错误。

建议:我首先想建议减少查询所需的内存,并降低复杂性。创建中间表并在单独的步骤中执行查询。 Oracle可能会遇到内存问题(特别是在Windows上)并且可能导致侦听器内存不足和连接终止问题。您可以使用直接SQL执行此操作,因为您说您不想使用PL * SQL。

解决问题的想法:检查服务器上的alert_sid.log。 alert_sid.log的位置由BACKGROUND_DUMP_DEST初始化参数指定。它可能表示服务器已关闭。您可能需要修改重新传输计数。接下来检查其他Oracle跟踪文件。

使用 Oracle配置文件设置跟踪选项。


1。 SQLNET.ORA

  • 使用Oracle Net Manager

  • 进行设置
  • TRACE_DIRECTORY_CLIENT建立目标目录 客户端跟踪输出。默认情况下,客户端目录是 UNIX上的$ ORACLE_HOME / network / trace和ORACLE_HOME \ network \ trace on 视窗。

  • TRACE_DIRECTORY_SERVER - 为其建立目标目录 数据库服务器跟踪输出。默认情况下,服务器目录是 UNIX上的$ ORACLE_HOME / network / trace和ORACLE_HOME \ network \ trace on 视窗。

2。 LISTENER.ORA

  • 使用Oracle Enterprise ManagerOracle Net Manager

  • 进行设置
  • TRACE_LEVEL_listener_name - 指定跟踪的详细程度 听众的设施记录。      - off(相当于0)不提供跟踪      - 用户(相当于4个)跟踪以识别用户引发的错误情况      - admin(相当于6个)跟踪以识别特定于安装的问题      - 支持(相当于16)为Oracle支持服务的故障排除信息提供跟踪信息

  • TRACE_DIRECTORY_listener_name - 建立目标目录 和跟踪文件的文件。默认情况下,目录是 UNIX上的$ ORACLE_HOME / network / trace和ORACLE_HOME \ network \ trace on Windows,文件名是listener.trc。


第3。 CMAN.ORA

  • 使用Oracle Net Manager

  • 进行设置
  • TRACE_DIRECTORY - 默认情况下,目录为$ ORACLE_HOME / network / trace on Windows上的UNIX和ORACLE_HOME \ network \ trace。


使用在各种Oracle配置文件中创建的跟踪文件,应该为您提供识别错误根本原因所需的信息。我会关注围绕听众的问题或由于内存不足而导致的问题。