Hat Oracle 12 Probleme mit lokalen Auflistungstypen in SQL?
Um es kurz zu machen, ich schlage vor, den Code zu diskutieren, den Sie unten sehen.
Wenn es läuft:
Oracle 11 Compiler löst
"PLS-00306: falsche Anzahl oder falsche Arten von Argumenten beim Aufruf von 'PIPE_TABLE'"
"PLS-00642: Lokale Auflistungstypen in SQL-Anweisung nicht zulässig"
Oracle 12 kompiliert das folgende Paket ohne solche Warnungen, aber wir haben eine Überraschung in der Laufzeit
wenn der anonyme Block so ausgeführt wird, wie er ist - alles ist in Ordnung (wir können einige Zeilen impipe_table
Funktion - es hat keinen Einfluss)
nun wollen wir die Zeile mit @ auskommentierhello;
oder rufen Sie dort eine Prozedur auf und führen Sie den geänderten anonomen Block erneut aus. Es wird "ORA-22163: Sammlungen auf der linken und rechten Seite sind nicht vom gleichen Typ" angezeigt.
Und die Frage ist: Lässt Oracle 12 lokale Auflistungstypen in SQL zu? Wenn ja, was ist los mit dem Code vonPACKAGE buggy_report
?
CREATE OR REPLACE PACKAGE buggy_report IS
SUBTYPE t_id IS NUMBER(10);
TYPE t_id_table IS TABLE OF t_id;
TYPE t_info_rec IS RECORD ( first NUMBER );
TYPE t_info_table IS TABLE OF t_info_rec;
TYPE t_info_cur IS REF CURSOR RETURN t_info_rec;
FUNCTION pipe_table(p t_id_table) RETURN t_info_table PIPELINED;
FUNCTION get_cursor RETURN t_info_cur;
END buggy_report;
/
CREATE OR REPLACE PACKAGE BODY buggy_report IS
FUNCTION pipe_table(p t_id_table) RETURN t_info_table PIPELINED IS
l_table t_id_table;
BEGIN
l_table := p;
END;
FUNCTION get_cursor RETURN t_info_cur IS
l_table t_id_table;
l_result t_info_cur;
BEGIN
OPEN l_result FOR SELECT * FROM TABLE (buggy_report.pipe_table(l_table));
RETURN l_result;
END;
END;
/
DECLARE
l_cur buggy_report.t_info_cur;
l_rec l_cur%ROWTYPE;
PROCEDURE hello IS BEGIN NULL; END;
BEGIN
l_cur := buggy_report.get_cursor();
-- hello;
LOOP
FETCH l_cur INTO l_rec;
EXIT WHEN l_cur%NOTFOUND;
END LOOP;
CLOSE l_cur;
dbms_output.put_line('success');
END;
/