6

我需要从内联视图中的集合中的元素创建一个集合。我尝试使用 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.
4

1 回答 1

1

ORA-03113 : end-of-file on communication channel 错误是一个通用错误,如果您在此处发布问题,您可能已经知道。因此,与其让您对可能的原因感到厌烦,这里列出了一些可以帮助您解决问题的事项。此错误非常常见,以至于有人不太可能找到确切原因,因此您需要学习如何通过深入了解日志和/或跟踪文件来调试此特定错误。

建议:我首先想提出一些建议,以减少查询所需的内存,并降低复杂性。创建中间表并分步执行查询。Oracle 可能会遇到内存问题(尤其是在 Windows 上),这可能会导致侦听器内存不足和连接被终止的问题。正如你所说的你不想使用 PL*SQL,你可以用直接的 SQL 来做到这一点。

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

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


1.SQLNET.ORA

  • 使用Oracle 网络管理器设置

  • TRACE_DIRECTORY_CLIENT 为客户端跟踪输出建立目标目录。默认情况下,客户端目录在 UNIX 上为 $ORACLE_HOME/network/trace,在 Windows 上为 ORACLE_HOME\network\trace。

  • TRACE_DIRECTORY_SERVER - 为数据库服务器跟踪输出建立目标目录。默认情况下,服务器目录在 UNIX 上为 $ORACLE_HOME/network/trace,在 Windows 上为 ORACLE_HOME\network\trace。

2. 听众.ORA

  • 使用Oracle Enterprise ManagerOracle Net Manager设置

  • TRACE_LEVEL_listener_name - 指定侦听器的跟踪工具记录的详细级别。- off(等同于 0)不提供跟踪 - user(等同于 4)跟踪以识别用户引起的错误情况 - admin(等同于 6)跟踪以识别特定于安装的问题 - support(等同于 16)提供跟踪信息Oracle 支持服务的故障排除信息

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


3. CMAN.ORA

  • 使用Oracle 网络管理器设置

  • TRACE_DIRECTORY - 默认情况下,该目录在 UNIX 上为 $ORACLE_HOME/network/trace,在 Windows 上为 ORACLE_HOME\network\trace。


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

于 2012-10-27T00:27:50.047 回答