【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でループ処理をしている部分に、ループ処理などを入れて複雑にしてしまうと、
カーソルの動きがおかしくなるので、基本は何も入れないほうが良いと思われる。
そのうち、使う機会があれば比較をしてみたいと思う。