連載
» 2005年08月26日 00時00分 公開

PL/SQLでBLOBデータを自由自在に入出力SQLクリニック(7)(2/3 ページ)

[林優,株式会社インサイトテクノロジー]

BLOBデータを格納するサンプルの解説

3行目

 BLOBデータ型を扱う際には、ロケータと呼ばれるポインタのようなものを使用します。データの格納などを行う際には、このロケータを基に書き込みを行います。

4行目

 BFILEというLOBデータ型です。BLOBとの違いは、データをOracle内に格納するのではなく、OS上のファイルとしてポインタだけOracleに格納するようなイメージになります。今回は、BFILENAME関数を使用して、v_handleにBFILEロケータをセットしています。BFILENAME関数の引数は以下のとおりです。

BFILENAME('Directory','Filename');

 Directoryと記載していますが、OS上のフルパスではなく、Create Directory文で作成したDirectoryオブジェクト(注1)になります。あるいは、初期化パラメータファイルのutl_file_dirで指定したパスを指定してください。

(注1)Directoryオブジェクト
ダウンロード用のサンプルコード、create_ddl.sqlに作成用のSQLが記載されています。

11行目

 DBMS_LOBパッケージのFileOpenサブプログラムを使用し、対象のファイルをオープンします。引数には、BFILENAME関数でセットしたBFILEロケータと読み取りモードを指定します。読み取りモードはDBMS_LOBで以下の定数として宣言されています。BFILEの場合は書き込みができないので、dbms_lob.file_readonlyを使用します。

file_readonly   binary_integer = 0
lob_readonly    binary_integer = 0
lob_readwrite   binary_integer = 1

16行目

 26行目のDBMS_LOB.LoadBLOBFromFileサブプログラムで実際にLOBデータを書き込む際に指定するデータサイズをGETLENGTHサブプログラムで取得します。もし、amountで指定したサイズが、実際のデータよりも大きい場合はエラーが発生します。

発生するエラー
  ORA-22993: 指定された入力量は実際のソース量を超えています。

 逆に、amountで指定したサイズが、実際のデータよりも小さい場合は、amountで指定されたサイズ分だけが書き込まれます。

18行目

 データをテーブルに挿入しますが、その際に、returning句を使用してdata列のBLOBロケータを取得しています。また、data列に使用しているempty_blob()関数は列の属性を空にする関数です。この関数を使用することにより、LOB領域の初期化が行われ、データが存在しない状態になります。

26行目

 DBMS_LOB.LoadBLOBFromFileサブプログラムでは、実際にデータを格納していきます。引数を順に見ていきます。

dest_lob IN OUT NOCOPY BLOB(v_blob_locater)
 格納先のBLOBロケータを指定します。

src_bfile IN BFILE(v_handle)
 対象ファイルのBFILEロケータを指定します。

amount IN INTEGER(v_amount)
 DBMS_LOB.GETLENGTHで取得した書き込みサイズを指定します。今回は、DBMS_LOB.GETLENGTHを使用し、データサイズをあらかじめ取得しておきましたが、DBMS_LOB.LOBMAXSIZE定数(4294967295=4Gbytes)を指定することもできます。この定数を使えば、事前にamountを求める必要はありません。

dest_offset IN OUT INTEGER(v_doffset)
  書込みを開始する位置を指定します。例えば、一度RAWデータ型(最大32767bytes)にデータを入れてからWRITEするような場合、32767bytesを書き込んで、次は32768bytes目から……というときに使用します。また、DBMS_LOB.LoadBLOBFromFile実行後のこの値は、書き込まれたサイズが格納されます。33行目では、書き込まれたサイズをDBMS_OUTPUTパッケージを使用して出力しています。

src_offset IN OUT INTEGER (v_soffset)
 対象ファイルの読み込み開始位置を指定します。こちらも実行後に読み取り終了後の位置が格納されていて、次の読み取り開始位置として利用できます。

34〜35行目

 後は、データをコミットして、BFILEロケータをCloseするだけです。

 以上でOS上のファイルをOracleに格納する方法が分かりました。次ページでは、Oracleに格納されたバイナリデータをOS上のファイルに書き出す方法を解説します。(次ページに続く)

Copyright © ITmedia, Inc. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。