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

Fungsi PIPELINED bersarang

Fungsi Anda mengembalikan data_type_1 , dan koleksi tabel mencoba mengkonsumsinya juga. Tetapi keduanya membutuhkan tipe koleksi, bahkan jika Anda mengharapkan mereka hanya mengembalikan satu nilai (dalam hal ini tidak ada banyak titik pipelining). Anda tidak dapat menyalurkan jenis koleksi secara langsung, Anda menyalurkan anggota koleksi. Jadi data_type_1 harus berupa skalar atau tipe objek/rekam, dan Anda memerlukan tipe lain yang merupakan kumpulan dari tipe tersebut.

create type data_type_1 as object (x number, y number)
/

create type table_type_1 as table of data_type_1
/

create or replace package xyz AS
  function main_xyz return table_type_1 pipelined;
  function sub_func return table_type_1 pipelined;
  function sub_func1 return table_type_1 pipelined;
end xyz;
/

create or replace package body xyz as
  function main_xyz return table_type_1 pipelined is
  begin 
    --code
    for rec in (select * from table(sub_func)) loop
      pipe row(data_type_1(rec.x, rec.y));
    end loop;
    for rec in (select * from table(sub_func1)) loop
      pipe row(data_type_1(rec.x, rec.y));
    end loop;
  end;

  function sub_func return table_type_1 pipelined is
    def data_type_1;
  begin 
    --code
    pipe row(def); --def is data_type_1
  end sub_func;

  function sub_func1 return table_type_1 pipelined is
    abc data_type_1;
  begin 
    --code
    loop
      pipe row (abc); --abc is data_type_1
    end loop;
  end sub_func1;
end xyz;
/

Jadi saya telah menambahkan tipe tabel dari data_type_1 Anda yang sudah ada , dan mengubah definisi fungsi untuk mengembalikan tipe tabel tersebut. pipe row masih menggunakan data_type_1 - masing-masing adalah baris dalam tipe tabel. Loop Anda memerlukan kueri untuk kursornya, bukan panggilan langsung ke table() , jadi saya juga mengubahnya. Dan pipe row(sub_func); juga harus berupa pengulangan serupa pada kueri.

Anda hanya menandai ini sebagai PL/SQL tetapi karena Anda mungkin bermaksud memanggil main_xyz dari SQL biasa, dan karena Anda memanggil sub-fungsi dari konteks SQL dalam loop tersebut, data_type_1 dan table_type_1 perlu dibuat di tingkat skema daripada di PL/SQL. (Ini berubah sedikit dalam 12c tetapi tidak cukup untuk membantu di sini).

Jika Anda ingin memilikinya sebagai tipe PL/SQL, dideklarasikan dalam spesifikasi paket, maka Anda tidak dapat memanggil fungsi dari konteks non-PL/SQL, dan Anda harus mengganti loop dengan panggilan ke fungsi diikuti dengan iterasi pada koleksi yang dikembalikan.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Dapatkan rentang Alamat IP dari xxx.xxx.xx.0/16

  2. Memilih karyawan dengan ulang tahun dalam rentang tertentu menggunakan Oracle SQL

  3. Oracle Date - Cara menambahkan tahun hingga saat ini

  4. Bagaimana cara menentukan bahasa (Inggris, Cina ...) dari string yang diberikan di Oracle?

  5. Bagaimana Mengkompilasi Semua Paket Tidak Valid dalam Skema?