![]()
SQLクリニック(7) Page
3/3PL/SQLでBLOBデータを自由自在に入出力
株式会社インサイトテクノロジー
林 優
2005/8/26
次に、Oracleに格納されているデータファイルをPL/SQLでOS上のファイルに書き出すサンプルを作ってみます。
1 set serveroutput on |
| リスト2 BLOBデータを出力するPL/SQLサンプル (表示の都合で改行している個所があります。コードはlist7_2から参照できます) |
前ページのデータ格納で使用したテーブルとデータを使用しています。では、こちらも順を追って解説します。
5行目
バッファデータをLONG RAW型で宣言しています。バイナリデータですので、RAWデータが使用されています。
7行目
UTL_FILE.PUT_RAWサブプログラムのバッファサイズの上限は32767bytesです。そのため、今回は32000bytesを上限として、書き出しを行います。
11行目
utl_file.file_type型の変数を定義します。これが出力するファイルのファイルIDとなります。
13行目
openmodeには、バイナリデータを書き込むwbを指定します。
16行目
SELECT文で、ID=1のレコードのBLOBデータを抽出しています。検索されたBLOBロケータをv_blob_locaterに代入し、この後のDBMS_LOB.READで使用します。
17行目
UTL_FILE.PUT_RAWの制限(32767bytesまでのバッファ)をクリアするために、ループしながらLOBの読み込みとファイルへの書き出しを行います。そのため、Max値としてDBMS_LOB.GETLENGTHで、対象LOBデータのMAXサイズを取得します。
18行目
UTL_FILE.FOPENでファイルをオープンします。UTL_FILE.FOPENの引数は以下のとおりです。
location IN VARCHAR2
VARCHAR2となっていますが、Create Directoryで作成したDirectoryオブジェクトを指定することも可能です。ここに指定するPATHは、今回のようにCreate
Directoryで作成したDirectoryオブジェクトか、初期化パラメータファイルのutl_file_dirで指定されたPATHのみが使用できます。
filename IN VARCHAR2
出力するファイル名を指定します。
open_mode IN VARCHAR2
オープンするモードを指定します。
r … テキストの読込み w … テキストの書込み a … テキストの追加 rb … バイト(バイナリ)の読込み wb … バイト(バイナリ)の書込み ab … バイト(バイナリ)の追加
max_linesize IN BINARY_INTEGER
BLOBデータの場合は、バイナリデータであるため最大バッファの値ということになります。最大は32767bytesで、デフォルトでは1000bytesになります。
20行目
v_amountで指定したbytes分ずつLOBの読み取りとファイルへの書き出しをv_totalsizeまで繰り返し行います。21〜23行目では、v_totalsizeを上回ってしまった場合(データのEOF)に、全体から書き込みを行ったサイズを引いて、残りのamountを算出します。また、offsetは1からスタートしているので、最後の1byteを取得するために1を加算しています。
24行目
SELECT文で取得したBLOBロケータから実データを読み込みます。DBMS_LOB.READの引数は以下のとおりです。
lob_loc IN BLOB
読み込み対象のBLOBロケータを指定します。
amount IN OUT NOCOPY BINARY_INTEGER
読み取りサイズを指定します。offsetで指定した開始位置からamount分のデータを読み込みます。
offset IN INTEGER
読み取り開始位置を指定します。
buffer OUT RAW
読み取ったデータを格納するバッファを指定します。
サンプルの例では、BLOBロケータで示されるBLOBデータをv_offset目からv_amount分読み込んで、v_buffer変数に格納という指定になります。
31行目
24行目で取得したBLOBデータをUTL_FILE.PUT_RAWサブプログラムでファイルに書き出しています。3番目の引数(autoflash)をtrueに設定することで、書き込みバッファを自動的にフラッシュし物理ディスクに記録してくれます。
◇
以上でBLOBデータの格納と出力を行うことができます。実際の現場ではPL/SQLのみで行うケースは、あまりないかもしれませんが開発機などでBLOBの動作を確認したいときなどにすぐ使えると思いますので、ぜひマスターしてくださいね。(次回に続く)
| 筆者プロフィール |
| 株式会社インサイトテクノロジー Oracleに特化した製品開発、コンサルティングを手掛けるエンジニア集団。林 優は殺伐とした対策現場でも柔らかな言動で問題点を切り分ける誠実な目の中に闘志を持つシステムコンサルタント。 |
| 3/3 |
| Index | |
| 連載 SQLクリニック(7) PL/SQLでBLOBデータを自由自在に入出力 |
|
| Page
1 ・Oracleに格納できるLOBの種類 ・BLOBデータを格納するサンプル |
|
| Page 2 ・BLOBデータを格納するサンプルの解説 |
|
| Page 3 ・BLOBデータを出力するサンプル ・BLOBデータを出力するサンプルの解説 |
|
| SQLクリニック |
TechTargetジャパン
- IBMが歴史を変える!? 新カテゴリの製品を発表 (2012/5/25)
IBMは新たな製品カテゴリとなる「PureSystems」を発表。DB2 10とビッグデータの関係、PureSytemsの斬新さはどこかに迫ります - クラウド時代のデータ処理を支える分散KVSの可能性 (2012/5/23)
現在、高速データ処理の主流はインメモリ型データ処理だが、別の方法として分散KVSが注目を集めている。今回は分散KVSについて話を聞いた - 複数の表からデータを取り出して表示させる(2) (2012/4/23)
前回はSQLの基本的な結合構文について説明しました。今回は、より複雑な自己結合や外部結合について説明します - SQL Server、OOWにIQ、盛りだくさんの4月 (2012/4/20)
オラクルオープンワールドが3年ぶりに東京で開催されたほか、SQL Server 2012が提供開始されるなど、今月は話題が盛りだくさんです
|
|
キャリアアップ
スポンサーからのお知らせ
- - PR -
イベントカレンダー
- - PR -
