手始めに、LOBとは何かを理解する必要があります。これらは「大きなデータ」であり、Oracleの他のどのデータ型よりも大きい可能性があります。それらはファイルシステム上の通常のファイルのようなものです。ファイルシステム上のファイルに書き込むには、次のことを行う必要があります
- 書き込み用にファイルを開く
- 最初からファイルの入力を開始する場合は、ファイルを切り捨てます
- ソースデータをループ内のチャンクで読み取ります
- 同じループ内のファイルにデータチャンクを1つずつ追加します
- ファイルを閉じる
多かれ少なかれ同じことがLOBにも当てはまります。テーブルでは、LOB(CLOB / BLOB / NCLOB)列は、実際のデータを保持するディスクストレージ上の別の場所への単なるポインター/参照です。 Oracleの標準用語では、ポインタは「LOBロケータ」と呼ばれます。する必要があります
- LOBロケーターを開く/初期化する
- 最初から入力を開始する場合は、LOBの内容を切り捨てます
- データチャンクをループ内のLOBコンテンツに1つずつ追加します
- LOBロケーターを閉じる
PL / SQLでは、次のようになります。
-- create table blob_test(id number, b blob);
declare
v_b blob;
aaa raw(32767);
longLine varchar2(32767);
begin
longLine := LPAD('aaaa', 32767,'x');
aaa := UTL_RAW.CAST_TO_RAW(longLine);
insert into blob_test values(1,empty_blob()) returning b into v_b;
dbms_lob.open(v_b,dbms_lob.lob_readwrite);
dbms_lob.writeappend(v_b,UTL_RAW.LENGTH (aaa) ,aaa);
dbms_lob.close(LOB_LOC=>v_b);
commit;
end;
説明:
- LOBロケーターを初期化する=
insert into blob_test values(1,empty_blob()) returning b into v_b;
- 書き込み用にLOBロケーターを開く=
dbms_lob.open(v_b,dbms_lob.lob_readwrite);
- LOBの内容を最初から入力したい場合は、LOBの内容を切り捨てます...これは
empty_blob()
によって実行されます。insert
を呼び出します 。 - データチャンクをループ内のLOBコンテンツに1つずつ追加します=ここでは
dbms_lob.writeappend()
を1回だけ繰り返します 、単一のチャンクのみを追加するaaa
長さutl_raw.length(aaa)
(最大32767)LOBv_b
に - LOBロケーターを閉じる=
dbms_lob.close(LOB_LOC=>v_b);