Oracle
 sql >> Base de données >  >> RDS >> Oracle

La fonction de table avec une collecte en masse génère un type de données non valide

Vous essayez d'utiliser des types au niveau du package en SQL brut, ce qui n'est pas autorisé. Les types déclarés dans le package ne sont pas visibles ou valides en dehors de PL/SQL (ou même dans des instructions SQL simples au sein de PL/SQL). Une version réduite de ce que vous faites :

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

Même dans le package, si vous aviez une procédure qui essayait d'utiliser la fonction de table, une erreur se produirait. Si vous avez ajouté :

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

... la compilation du corps du package échouerait avec ORA-22905: cannot access rows from a non-nested table item .

Vous devez déclarer les types au niveau du schéma, pas dans un package, donc en utilisant le SQL create type commande :

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