4 永続LOBに固有の操作と一時LOBに固有の操作
永続LOBインスタンスと一時LOBインスタンスではLOB操作が異なる場合があります。
内容は次のとおりです。
関連項目:
-
「LOB APIの使用」では、一時LOBまたは永続LOBで使用できるLOB APIの詳細と使用例を示します。
-
「BFILE操作用のLOB API」では、BFILEを操作するLOB APIの詳細と使用例を示します。
4.1 永続LOBの操作
この項では、永続LOBにのみ適用される操作について説明します。
4.1.1 表へのLOBの挿入
LOBインスタンスは、複数の方法で永続LOB列に挿入できます。
関連項目:
LOBインスタンスを永続LOB列に挿入する際に使用できる様々な方法の詳細は、「LOBに対するDDL文とDML文」を参照してください
4.1.2 表からの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;
4.2 一時LOBの操作
この項では、一時LOBインスタンスにのみ適用される操作について説明します。
4.2.1 一時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;
4.3 PL/SQLにおける永続LOBと一時LOBの作成
次のコード例に、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;
4.4 OCIでの一時LOBの解放
OCIプログラムがSQLまたはPL/SQLからLOBロケータを取得するたびに、ロケータが一時的なものであることを確認します。一時的なものである場合は、アプリケーションがロケータの使用を完了したら、そのロケータを解放します。ロケータは、SELECTまたはOUT BIND中にDEFINEから取得できます。一時LOB期間は、クライアント側に送信されると常にセッションにアップグレードされます。アプリケーションでは、ロケータが次行のロケータで上書きされる前に次の関数を実行する必要があります。
OCILobIsTemporary(env, err, locator, is_temporary); if(is_temporary) OCILobFreeTemporary(svc, err, locator);
関連項目:
『Oracle Call Interfaceプログラマーズ・ガイド』の第16章のLOB関数に関する項