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で指定したパスを指定してください。
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.