sql >> データベース >  >> RDS >> Oracle

ネストされたパイプライン関数

    関数が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以外のコンテキストから関数を呼び出すことができず、ループを関数の呼び出しに置き換える必要があります。その後、返されたコレクションを繰り返し処理します。




    1. C#のTry/Catchは例外をキャッチしません

    2. SQL/Oracleの一連の数値から範囲を検索します

    3. プロシージャ/関数を使用せずにMySQLでループを実行できますか?

    4. PHP-ログインシステムでメンバー専用ページを保護する