Oracle ORA-03113的解决方法:使用CAST MULTISET在通信通道上结束文件

Oracle ORA-03113的解决方法:使用CAST MULTISET在通信通道上结束文件,oracle,function,exception,plsql,multiset,Oracle,Function,Exception,Plsql,Multiset,下面的TEST_函数调用失败,ORA-03113:通信通道上的文件结束。测试功能2中介绍了一种变通方法。我简化了代码,因为我的实际函数要复杂得多。在Oracle11g上测试。有人知道为什么第一个函数会失败吗 CREATE OR REPLACE TYPE "EMPLOYEE" AS OBJECT ( employee_id NUMBER(38), hire_date DATE ); CREATE OR REPLACE TYPE "EMPLOYEE_TABLE" AS TA

下面的TEST_函数调用失败,ORA-03113:通信通道上的文件结束。测试功能2中介绍了一种变通方法。我简化了代码,因为我的实际函数要复杂得多。在Oracle11g上测试。有人知道为什么第一个函数会失败吗

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

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


您使用CAST MULTISET语法并从dual中选择,而不是执行看似更简单的批量收集操作,这有什么原因吗?然后在PL/SQL中执行多集联合,而不是将集合传递回SQL引擎,只是为了将数据返回PL/SQL?@jonearles:我检查了DBA_ALERT_历史记录,没有看到任何消息。将与Oracle进行检查。@Justin:我尝试在不使用强制转换的情况下批量收集到表1和表2中,然后用多集联合替换联合,但仍然得到相同的异常。这就是您的建议吗?+1用于在您的解决方案不合适时联系支持人员。您的bug似乎与注册的bug bug 14173524:CASTMULTISET CRASHE中的UNION查询与ORA-07445[QCSTDA]/bug 8560880:PL/SQL代码块匹配,导致ORA-07445 QCSFSQACN