Oracle
 sql >> Teknologi Basis Data >  >> RDS >> Oracle

Fungsi tabel dengan pengumpulan massal membuang tipe data yang tidak valid

Anda mencoba menggunakan tipe tingkat paket dalam SQL biasa, yang tidak diizinkan. Jenis yang dideklarasikan dalam paket tidak terlihat atau valid di luar PL/SQL (atau bahkan dalam pernyataan SQL biasa di dalam PL/SQL). Versi singkat dari apa yang Anda lakukan:

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

Bahkan di dalam paket, jika Anda memiliki prosedur yang mencoba menggunakan fungsi tabel, itu akan error. Jika Anda menambahkan:

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

... kompilasi isi paket akan gagal dengan ORA-22905: cannot access rows from a non-nested table item .

Anda perlu mendeklarasikan tipe pada level skema, bukan dalam paket, jadi gunakan SQL create type perintah :

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. JDBC CallableStatement dan Oracle SYS_REFCURSOR IN parameter?

  2. Oracle - Cara menegakkan aturan pada hubungan tergantung pada catatan atribut (contoh sederhana)

  3. Menemukan nilai terendah dalam tabel yang lebih besar dari nilai tertentu

  4. Bagaimana menemukan LEFT OUTER JOIN atau RIGHT OUTER JOIN dengan ORACLE JOIN (+)

  5. Membuat Indeks untuk Grup Berdasarkan Bidang?