関数がdata_type_1
を返しています 、そしてテーブルコレクションもそれを消費しようとしています。ただし、単一の値のみを返すことを期待している場合でも、どちらにもコレクションタイプが必要です(この場合、ポイントパイプラインはあまりありません)。コレクションタイプを直接パイプすることはできません。コレクションのメンバーをパイプします。したがって、data_type_1
スカラーまたはオブジェクト/レコードタイプである必要があり、それらのコレクションである別のタイプが必要です。
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;
/
そこで、既存のdata_type_1
のテーブルタイプを追加しました 、および代わりにそのテーブルタイプを返すように関数定義を変更しました。 pipe row
引き続きdata_type_1
を使用します -それぞれがテーブルタイプの行です。ループには、table()
を直接呼び出すのではなく、カーソルのクエリが必要です。 、だから私もそれを変更しました。そして、pipe row(sub_func);
また、クエリに対する同様のループである必要があります。
これをPL/SQLとしてタグ付けしただけですが、main_xyz
を呼び出す予定があるためです。 プレーンSQLから、およびこれらのループ内のSQLコンテキストからサブ関数を呼び出しているため、data_type_1
およびtable_type_1
PL/SQLではなくスキーマレベルで作成する必要があります。 (これにより、12cで少し変更されました
しかし、ここで助けるには十分ではありません。
パッケージ仕様で宣言されているPL/SQL型としてそれらを使用したい場合は、PL / SQL以外のコンテキストから関数を呼び出すことができず、ループを関数の呼び出しに置き換える必要があります。その後、返されたコレクションを繰り返し処理します。