Oracle
 sql >> Baza danych >  >> RDS >> Oracle

Funkcja tabeli z gromadzeniem zbiorczym wyrzuca nieprawidłowy typ danych

Próbujesz użyć typów na poziomie pakietu w zwykłym języku SQL, co jest niedozwolone. Typy zadeklarowane w pakiecie nie są widoczne ani ważne poza PL/SQL (lub nawet w zwykłych instrukcjach SQL w PL/SQL). Okrojona wersja tego, co robisz:

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

Nawet w pakiecie, jeśli masz procedurę, która próbowała użyć funkcji tabeli, wystąpiłby błąd. Jeśli dodałeś:

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

... kompilacja treści pakietu nie powiedzie się z ORA-22905: cannot access rows from a non-nested table item .

Musisz zadeklarować typy na poziomie schematu, a nie w pakiecie, więc używając SQL create type polecenie :

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. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Hibernate 5 HQL translator dla Oracle Spatial

  2. Jak używać %ROWTYPE podczas wstawiania do tabeli Oracle z kolumną tożsamości?

  3. Połącz wiersze w CLOB

  4. Polecenia kopii zapasowej RMAN

  5. Używanie funkcji agregacji do filtrowania rekordu na podstawie znacznika czasu MIN