様々な基本になるサンプルを記録しています。

不定期更新です。

記事のサイドに使用している商品の紹介も掲載しているので、良ければご覧ください。

【Oracle】バルクバインドでパイプライン関数を作る

TYPEとかの最初の設定は以下の記事を参照にしてください。
fubukin.hatenablog.com


フェッチしてバルクバインドするときにリミット値を指定して、
数件ずつデータを出力する方法をとったら、分散処理されて早くなるのだろうか?

ただ、実績としては何万というデータを出力するときに早くなった記憶がある。

FUNC_STD_VALUE30_TABLEをちょっと改変して、
フェッチでデータを取得、およびバルクバインドで10件ずつとって代入するようにしてみた。

CREATE OR REPLACE FUNCTION FUNC_STD_VALUE30_TABLE_BULK 
RETURN STD_VALUE30_TABLE
PIPELINED
AS
    
    /*レコード型定義*/
    STD_REC   STD_VALUE30;
    
    /*物理テーブル型定義*/
    TYPE TBL_REC_TYPE IS
        TABLE OF TABLE1%ROWTYPE;
    TBL_REC   TBL_REC_TYPE;
        
    /*カーソル定義*/
    CURSOR CUR_TABLE1 IS SELECT
        *
        FROM   TABLE1;

BEGIN

  
    /*カーソルオープン*/
    OPEN CUR_TABLE1;   
    
    /*カーソルをループで回す*/
    LOOP     
        /*バルクバインドして、リミット値を指定*/
        FETCH CUR_TABLE1 BULK COLLECT INTO TBL_REC LIMIT 10;   
        FOR INDX IN 1..TBL_REC.COUNT LOOP
        
           /*配列初期化 30項目に半角スペースを初期値として入れておく*/
            STD_REC := STD_VALUE30(' ',' ',' ',' ',' '
                                  ,' ',' ',' ',' ',' '
                                  ,' ',' ',' ',' ',' '
                                  ,' ',' ',' ',' ',' '
                                  ,' ',' ',' ',' ',' '
                                  ,' ',' ',' ',' ',' ');        
            /*値の代入*/
            STD_REC.STR_VALUE001 := TBL_REC(INDX).A1;
            STD_REC.STR_VALUE002 := TBL_REC(INDX).A2;
            STD_REC.STR_VALUE003 := TBL_REC(INDX).A3;
            STD_REC.STR_VALUE004 := TBL_REC(INDX).A4;
            STD_REC.STR_VALUE005 := TBL_REC(INDX).A5;
            STD_REC.STR_VALUE006 := TBL_REC(INDX).A6;
            STD_REC.STR_VALUE007 := TBL_REC(INDX).A7;
            STD_REC.STR_VALUE008 := TBL_REC(INDX).A8;
            STD_REC.STR_VALUE009 := TBL_REC(INDX).A9;
            STD_REC.STR_VALUE010 := TBL_REC(INDX).A10;
            STD_REC.STR_VALUE011 := TBL_REC(INDX).A11;
            STD_REC.STR_VALUE012 := TBL_REC(INDX).A12;

        
            /*レコード代入*/
            PIPE ROW ( STD_REC );
        END LOOP;

        EXIT WHEN CUR_TABLE1%NOTFOUND;
    END LOOP;

    /*カーソルクローズ*/
    CLOSE CUR_TABLE1;    
    
    /*終了*/
    RETURN;
END FUNC_STD_VALUE30_TABLE_BULK;

ちなみにFETCHでループ処理をしている部分に、ループ処理などを入れて複雑にしてしまうと、
カーソルの動きがおかしくなるので、基本は何も入れないほうが良いと思われる。

そのうち、使う機会があれば比較をしてみたいと思う。