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