Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Tabellenfunktion mit Massenerfassung löst ungültigen Datentyp aus

Sie versuchen, Typen auf Paketebene in einfachem SQL zu verwenden, was nicht zulässig ist. Die im Paket deklarierten Typen sind außerhalb von PL/SQL nicht sichtbar oder gültig (oder sogar in einfachen SQL-Anweisungen innerhalb von PL/SQL). Eine gekürzte Version dessen, was Sie tun:

create or replace package types as
    type my_rec_type is record (dummy dual.dummy%type);
    type my_table_type is table of my_rec_type index by binary_integer;
end types;
/

create or replace package p42 as
    function get_table return types.my_table_type;
end p42;
/

create or replace package body p42 as
    function get_table return types.my_table_type is
        my_table types.my_table_type;
    begin
        select * bulk collect into my_table from dual;
        return my_table;
    end get_table;
end p42;
/

select * from table(p42.get_table);

SQL Error: ORA-00902: invalid datatype

Selbst innerhalb des Pakets würde eine Prozedur, die versucht, die Tabellenfunktion zu verwenden, einen Fehler verursachen. Wenn Sie Folgendes hinzugefügt haben:

    procedure test_proc is
    begin
        for r in (select * from table(get_table)) loop
            null;
        end loop;
    end test_proc;

... die Kompilierung des Paketkörpers mit ORA-22905: cannot access rows from a non-nested table item fehlschlagen .

Sie müssen die Typen auf Schemaebene deklarieren, nicht in einem Paket, also mit dem SQL create type Befehl :

create type my_obj_type is object (dummy varchar2(1));
/

create type my_table_type is table of my_obj_type;
/

create or replace package p42 as
    function get_table return my_table_type;
end p42;
/

create or replace package body p42 as
    function get_table return my_table_type is
        my_table my_table_type;
    begin
        select my_obj_type(dummy) bulk collect into my_table from dual;
        return my_table;
    end get_table;
end p42;
/

select * from table(p42.get_table);

DUMMY
-----
X