sql >> Databáze >  >> RDS >> Oracle

Tabulková funkce s hromadným sběrem vyvolá neplatný datový typ

Pokoušíte se použít typy na úrovni balíčku v prostém SQL, což není povoleno. Typy deklarované v balíčku nejsou viditelné nebo platné mimo PL/SQL (ani v jednoduchých příkazech SQL v PL/SQL). Zkrácená verze toho, co děláte:

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

I v rámci balíčku, pokud byste měli proceduru, která se pokusila použít funkci tabulky, došlo by k chybě. Pokud jste přidali:

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

... kompilace těla balíčku by selhala s ORA-22905: cannot access rows from a non-nested table item .

Typy musíte deklarovat na úrovni schématu, nikoli v balíčku, takže pomocí SQL create type příkaz :

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


  1. Převeďte bod MySQL na text v PHP

  2. Regex zachycuje první slova před znakem následně - oracle

  3. Jak importovat sadu záloh Oracle 11g RMAN na nový databázový server?

  4. Jak předat název vstupu prostřednictvím požadavku GET v PHP