プライマリ・コンテンツに移動
Oracle® Database SecureFilesおよびラージ・オブジェクト開発者ガイド
12cリリース1 (12.1)
B71284-05
目次へ移動
目次
索引へ移動
索引

前
次

19 永続LOBに固有の操作と一時LOBに固有の操作

永続LOBインスタンスと一時LOBインスタンスではLOB操作が異なる場合があります。

ここでは、次の項目について説明します。

関連項目:

永続LOBの操作

この項では、永続LOBにのみ適用される操作について説明します。

表へのLOBの挿入

「LOBに対するDDL文とDML文」で説明した任意のメソッドを使用して、永続LOB列にLOBインスタンスを挿入できます。

表からの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の作成と解放

一時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の作成

次のコード例に、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での一時LOBの解放

OCIプログラムがSQLまたはPL/SQLからLOBロケータを取得するたびに、ロケータが一時的なものであることを確認します。一時的なものである場合は、アプリケーションがロケータの使用を完了したら、そのロケータを解放します。ロケータは、アウトバインドまたは選択中の定義から取得されます。一時LOB期間は、クライアント側に送信されると常にセッションにアップグレードされます。アプリケーションでは、そのロケータが次の行のロケータによって上書きされる前に、次の処理が必要です。

OCILobIsTemporary(env, err, locator, is_temporary);
if(is_temporary)
    OCILobFreeTemporary(svc, err, locator);

関連項目:

『Oracle Call Interfaceプログラマーズ・ガイド』の第16章のLOB関数に関する項