【问题标题】:workaround for ORA-03113: end-of-file on communication channel with CAST MULTISETORA-03113 的解决方法:使用 CAST MULTISET 的通信通道上的文件结尾
【发布时间】:2012-11-28 10:44:58
【问题描述】:

下面对 TEST_FUNCTION 的调用失败,并显示“ORA-03113:通信通道上的文件结尾”。 TEST_FUNCTION2 中提供了一种解决方法。我将代码归结为我的实际功能要复杂得多。在 Oracle 11G 上测试。任何人都知道为什么第一个功能会失败?

CREATE OR REPLACE TYPE "EMPLOYEE" AS OBJECT
(
    employee_id  NUMBER(38),
    hire_date    DATE
);

CREATE OR REPLACE TYPE "EMPLOYEE_TABLE" AS TABLE OF EMPLOYEE;

CREATE OR REPLACE FUNCTION TEST_FUNCTION RETURN EMPLOYEE_TABLE IS

table1        EMPLOYEE_TABLE;
table2        EMPLOYEE_TABLE;
return_table  EMPLOYEE_TABLE;
BEGIN

SELECT CAST(MULTISET
(
    SELECT user_id, created FROM all_users
    WHERE LOWER(username) < 'm'
) AS EMPLOYEE_TABLE)
INTO table1 FROM dual;

SELECT CAST(MULTISET
(
    SELECT user_id, created FROM all_users
    WHERE LOWER(username) >= 'm'
) AS EMPLOYEE_TABLE)
INTO table2 FROM dual;

SELECT CAST(MULTISET
(    
    SELECT employee_id, hire_date
      FROM TABLE(table1)
    UNION
    SELECT employee_id, hire_date
      FROM TABLE(table2)
) AS EMPLOYEE_TABLE)
INTO return_table FROM dual;

RETURN return_table;

END TEST_FUNCTION;



CREATE OR REPLACE FUNCTION TEST_FUNCTION2 RETURN EMPLOYEE_TABLE IS

table1        EMPLOYEE_TABLE;
table2        EMPLOYEE_TABLE;
return_table  EMPLOYEE_TABLE;
BEGIN

SELECT CAST(MULTISET
(
    SELECT user_id, created FROM all_users
    WHERE LOWER(username) < 'm'
) AS EMPLOYEE_TABLE)
INTO table1 FROM dual;

SELECT CAST(MULTISET
(
    SELECT user_id, created FROM all_users
    WHERE LOWER(username) >= 'm'
) AS EMPLOYEE_TABLE)
INTO table2 FROM dual;

WITH combined AS
(
    SELECT employee_id, hire_date
      FROM TABLE(table1)
    UNION
    SELECT employee_id, hire_date
      FROM TABLE(table2)
)
SELECT CAST(MULTISET
(
    SELECT * FROM combined
) AS EMPLOYEE_TABLE)
INTO return_table FROM dual;

RETURN return_table;

END TEST_FUNCTION2;





SELECT * FROM TABLE (TEST_FUNCTION()); -- Throws exception ORA-03113.

SELECT * FROM TABLE (TEST_FUNCTION2()); -- Works

【问题讨论】:

  • 您是否有理由使用CAST( MULTISET 语法并从对偶中进行选择,而不是执行(似乎更直接)BULK COLLECT 操作?然后在 PL/SQL 中执行MULTISET UNION,而不是将集合传递回 SQL 引擎只是为了将数据返回到 PL/SQL?
  • @jonearles:我检查了 DBA_ALERT_HISTORY 并没有看到任何消息。将与 Oracle 核实。
  • @Justin:我尝试将 Bulk Collect 放入 table1 和 table2(没有强制转换),然后用 MULTISET UNION 替换 UNION,仍然得到相同的异常。这就是你的建议吗?
  • +1 如果您的解决方法不合适,请联系支持人员。您的错误似乎与已注册的错误“错误 14173524:QUERY WITH UNION INSIDE THE CAST(MULTISET()) Crash WITH ORA-07445[QCSTDA()]”/“错误 8560880:PL/SQL 代码块导致 ORA-07445 QCSFSQACN”相匹配

标签: oracle function exception plsql multiset


【解决方案1】:

不确定您的特定示例,但这是 Oracle 版本 11.2.0.1.0 中的一个已知错误 它与表达式中嵌套查询的级别有关。我遇到了类似的错误,并且相同的查询在 11.2.0.2.0 中运行良好(我相信是 11gR2 补丁集 2)。

https://forums.oracle.com/forums/thread.jspa?messageID=9996243

【讨论】:

    猜你喜欢
    • 2012-11-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-07
    • 1970-01-01
    相关资源
    最近更新 更多