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.