Oracle
 sql >> база данни >  >> RDS >> Oracle

Функцията за таблица с групово събиране извежда невалиден тип данни

Опитвате се да използвате типове на ниво пакет в обикновен SQL, което не е позволено. Типовете, декларирани в пакета, не са видими или валидни извън PL/SQL (или дори в обикновени SQL изрази в PL/SQL). Съкратена версия на това, което правите:

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

Дори в рамките на пакета, ако сте имали процедура, която се е опитала да използва функцията за таблица, ще се появи грешка. Ако сте добавили:

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

... компилацията на тялото на пакета би се провалила с ORA-22905: cannot access rows from a non-nested table item .

Трябва да декларирате типовете на ниво схема, а не в пакет, така че да използвате SQL create type команда :

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. Oracle създава таблица като нулева стойност

  2. Свързване с Oracle 12c база данни от Pentaho Data Integration (Kettle) Community Edition

  3. Запитването многократно в Oracle с помощта на perl връща само първата заявка

  4. Как да преброя броя на колоните в таблица с помощта на SQL?

  5. Актуализирайте множество колони въз основа на процентно изчисление в Oracle