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;
/

Antworten auf die Frage(6)

Ihre Antwort auf die Frage