workaround für ORA-03113: end-of-file on communication channel mit CAST MULTISET
Den Aufruf TEST_FUNCTION unter dem Fehler "ORA-03113: end-of-file on communication channel". Ein workaround vorgestellt, in TEST_FUNCTION2. Ich lief dann den code als meine eigentliche Funktion ist wesentlich komplexer. Getestet auf Oracle 11G. Jemand eine Idee, warum die erste Funktion fehlschlägt?
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
Gibt es einen Grund, dass Sie über die
Ich überprüfte DBA_ALERT_HISTORY und nicht sehen, keine Nachrichten. Prüfen mit Oracle.
Ich habe versucht, Bulk Collect into Tabelle1 und Tabelle2 (ohne cast), und dann wieder UNION mit MULTISET UNION, und bekomme immer noch dieselbe Ausnahme. Ist es das, was Sie waren, was darauf hindeutet?
+1 für die Kontaktaufnahme mit dem support, wenn dein workaround ist nicht geeignet. dein Fehler scheint zu passen eine eingetragene bug "Bug 14173524 : ABFRAGE MIT UNION in DER CAST(MULTISET()) CRASHE MIT ORA-07445[QCSTDA()]" / "Bug 8560880 : PL/SQL-Codeblock VERURSACHT ORA-07445 QCSFSQACN"
CAST( MULTISET
syntax und der Auswahl von dual, anstatt die (scheinbar einfacher) BULK COLLECT
Betrieb? Und dann tut ein MULTISET UNION
in PL/SQL anstatt der Sammlungen zurück, um die SQL-engine nur, um die Daten wieder in PL/SQL?Ich überprüfte DBA_ALERT_HISTORY und nicht sehen, keine Nachrichten. Prüfen mit Oracle.
Ich habe versucht, Bulk Collect into Tabelle1 und Tabelle2 (ohne cast), und dann wieder UNION mit MULTISET UNION, und bekomme immer noch dieselbe Ausnahme. Ist es das, was Sie waren, was darauf hindeutet?
+1 für die Kontaktaufnahme mit dem support, wenn dein workaround ist nicht geeignet. dein Fehler scheint zu passen eine eingetragene bug "Bug 14173524 : ABFRAGE MIT UNION in DER CAST(MULTISET()) CRASHE MIT ORA-07445[QCSTDA()]" / "Bug 8560880 : PL/SQL-Codeblock VERURSACHT ORA-07445 QCSFSQACN"
InformationsquelleAutor Jefferstone | 2012-12-10
Du musst angemeldet sein, um einen Kommentar abzugeben.
Nicht sicher über Ihre besonderen Beispiel, aber dies ist ein bekannter Fehler in Oracle-version 11.2.0.1.0
Es hat etwas zu tun mit der Ebene von verschachtelten Abfragen in einem Ausdruck. Ich habe vor ähnlichen Fehler und die gleiche Abfrage läuft wunderbar in 11.2.0.2.0 (11gR2 patchset 2 glaube ich).
https://forums.oracle.com/forums/thread.jspa?messageID=9996243
InformationsquelleAutor user2011104