永続LOBインスタンスと一時LOBインスタンスではLOB操作が異なる場合があります。
ここでは、次の項目について説明します。
関連項目:
「LOB APIの使用」では、一時LOBまたは永続LOBで使用できるLOB APIの詳細と使用例を示します。
「BFILE操作用のLOB API」では、BFILEを操作するLOB APIの詳細と使用例を示します。
この項では、永続LOBにのみ適用される操作について説明します。
他のデータ型の場合と同様に、永続LOBを表から選択できます。次の例では、様々な型の永続LOBインスタンスがPL/SQL変数に選択されます。
declare blob1 BLOB; blob2 BLOB; clob1 CLOB; nclob1 NCLOB; BEGIN SELECT ad_photo INTO blob1 FROM print_media WHERE Product_id = 2268 FOR UPDATE; SELECT ad_photo INTO blob2 FROM print_media WHERE Product_id = 3106; SELECT ad_sourcetext INTO clob1 FROM Print_media WHERE product_id=3106 and ad_id=13001 FOR UPDATE; SELECT ad_fltextn INTO nclob1 FROM Print_media WHERE product_id=3060 and ad_id=11001 FOR UPDATE; END; / show errors;
この項では、一時LOBインスタンスにのみ適用される操作について説明します。
一時LOBインスタンスを作成するには、指定したLOBデータ型の変数を宣言し、その変数をCREATETEMPORARY
APIに渡す必要があります。
一時LOBインスタンスは、スコープ外になるか、セッションが終了するか、またはインスタンスを明示的に解放するまで、アプリケーションに存在します。システム・リソースを解放するために、一時LOBインスタンスを解放することをお薦めします。
次の例に、PL/SQL環境でDBMS_LOBパッケージを使用して一時LOBを作成し、解放する方法を示します。
declare blob1 BLOB; blob2 BLOB; clob1 CLOB; nclob1 NCLOB; BEGIN -- create temp LOBs DBMS_LOB.CREATETEMPORARY(blob1,TRUE, DBMS_LOB.SESSION); DBMS_LOB.CREATETEMPORARY(blob2,TRUE, DBMS_LOB.SESSION); DBMS_LOB.CREATETEMPORARY(clob1,TRUE, DBMS_LOB.SESSION); DBMS_LOB.CREATETEMPORARY(nclob1,TRUE, DBMS_LOB.SESSION); -- fill with data writeDataToLOB_proc(blob1); writeDataToLOB_proc(blob2); -- CHAR->LOB conversion clob1 := 'abcde'; nclob1 := TO_NCLOB(clob1); -- Other APIs call_lob_apis(blob1, blob2, clob1, nclob1); -- free temp LOBs DBMS_LOB.FREETEMPORARY(blob1); DBMS_LOB.FREETEMPORARY(blob2); DBMS_LOB.FREETEMPORARY(clob1); DBMS_LOB.FREETEMPORARY(nclob1); END; / show errors;
次のコード例に、PL/SQLで永続LOBと一時LOBを作成する方法を示します。このコードは次のデモ・ファイルに含まれています。
$ORACLE_HOME/rdbms/demo/lobs/plsql/lobdemo.sql
このデモ・ファイルは、他のLOB APIの使用方法を示す別のPL/SQLファイル内のプロシージャもコールします。これらのファイルのリストと関連LOB APIの詳細情報の参照先については、「PL/SQLのLOBデモ・ファイル」を参照してください。
----------------------------------------------------------------------------- ------------------------- Persistent LOB operations ------------------------ ----------------------------------------------------------------------------- declare blob1 BLOB; blob2 BLOB; clob1 CLOB; nclob1 NCLOB; BEGIN SELECT ad_photo INTO blob1 FROM print_media WHERE Product_id = 2268 FOR UPDATE; SELECT ad_photo INTO blob2 FROM print_media WHERE Product_id = 3106; SELECT ad_sourcetext INTO clob1 FROM Print_media WHERE product_id=3106 and ad_id=13001 FOR UPDATE; SELECT ad_fltextn INTO nclob1 FROM Print_media WHERE product_id=3060 and ad_id=11001 FOR UPDATE; call_lob_apis(blob1, blob2, clob1, nclob1); rollback; END; / show errors; ----------------------------------------------------------------------------- ------------------------- Temporary LOB operations ------------------------ ----------------------------------------------------------------------------- declare blob1 BLOB; blob2 BLOB; clob1 CLOB; nclob1 NCLOB; BEGIN -- create temp LOBs DBMS_LOB.CREATETEMPORARY(blob1,TRUE, DBMS_LOB.SESSION); DBMS_LOB.CREATETEMPORARY(blob2,TRUE, DBMS_LOB.SESSION); DBMS_LOB.CREATETEMPORARY(clob1,TRUE, DBMS_LOB.SESSION); DBMS_LOB.CREATETEMPORARY(nclob1,TRUE, DBMS_LOB.SESSION); -- fill with data writeDataToLOB_proc(blob1); writeDataToLOB_proc(blob2); -- CHAR->LOB conversion clob1 := 'abcde'; nclob1 := TO_NCLOB(clob1); -- Other APIs call_lob_apis(blob1, blob2, clob1, nclob1); -- free temp LOBs DBMS_LOB.FREETEMPORARY(blob1); DBMS_LOB.FREETEMPORARY(blob2); DBMS_LOB.FREETEMPORARY(clob1); DBMS_LOB.FREETEMPORARY(nclob1); END; / show errors;
OCIプログラムがSQLまたはPL/SQLからLOBロケータを取得するたびに、ロケータが一時的なものであることを確認します。一時的なものである場合は、アプリケーションがロケータの使用を完了したら、そのロケータを解放します。ロケータは、アウトバインドまたは選択中の定義から取得されます。一時LOB期間は、クライアント側に送信されると常にセッションにアップグレードされます。アプリケーションでは、そのロケータが次の行のロケータによって上書きされる前に、次の処理が必要です。
OCILobIsTemporary(env, err, locator, is_temporary); if(is_temporary) OCILobFreeTemporary(svc, err, locator);
関連項目:
『Oracle Call Interfaceプログラマーズ・ガイド』の第16章のLOB関数に関する項