X

オラクルエンジニア通信では、オンプレミスからクラウドまで、オラクルテクノロジーの最新情報をお届けします

LOB(内部LOB)の使い方~BLOB/CLOB、SecureFiles

LOBとは

LOBは、Oracle Databaseではバージョン8より利用可能な機能です。

LOBは、SQL99で標準のデータ型として定義されており、Oracleの場合、以下のような特徴があります。

  • 大量のデータを保持するように設計されたデータ型
  • 最大サイズは128TB (事実上、サイズ上限を気にしなくとも良い)
  • LONG、LONG RAWに比べると柔軟
  • 1つの表は複数のLOBを利用可能
  • LOBはランダム・アクセス可能
  • LOBオブジェクトの属性になれる

LOBを利用することで、データベース外に別管理されているバイナリデータなどと、データベース内に管理されているリレーショナルデータの両方を一元管理することができます。

このことにより、以下のようなメリットがあります(内部LOBの場合)。
  • アプリケーション・ロジックが単純化できる
  • 一つのトランザクションで操作が可能に
  • バックアップなどの運用を一元化できる


ここでは、LOBの機能・操作方法のポイントをご紹介します。

より詳しい内容は、以下のセミナー資料をご覧ください。
【セミナー動画/資料】LOB(BLOB)取り扱い説明書 ~画像・ドキュメントもDBで管理する~

 

内部LOB/外部LOB

OracleのLOBには、以下のようにデータベースの中にデータ自体を格納する「内部LOB」と、データは外部に置いたままの「外部LOB」のデータ型があります。

<内部LOB ( Oracle Database内部に格納するLOB )>

  • BLOB : バイナリデータを格納
  • CLOB : 文字データを格納
  • NCLOB : 各国語キャラクタ・セットの文字データを格納
<外部LOB ( Oracle Database 表領域の外にあるOSファイルに格納 )>
  • BFILE : 読み取り専用(アプリケーション内で書込みできない)

 

SecureFiles

Oracle Database 11g Release 1 の新機能として、SecureFilesが導入されました。
SecureFiles は、次の要件を満たすために導入された新世代の LOB データ型です

  • 機能拡張
  • 高パフォーマンス
  • 使いやすさ
  • 新しい LOB と 従来の LOB は選択可能


新しい LOB データ型を「SECUREFILE」、従来からの LOB データ型を「BASICFILE」と呼びます。

SecureFilesに関しては、以下の技術資料が詳しいです。
【技術資料】Oracle SecureFiles 機能解説:Oracle Database 11g
 

LOBを含んだ表の作成方法 (SECUREFILE)

SecureFilesを利用すると、圧縮、暗号化、非重複機能といった新機能を利用することができます。
(圧縮、暗号化は Enterprise Editionの Option機能)

CREATE TABLE lob_tab (
      id NUMBER(8) PRIMARY KEY,
      blob_col BLOB)
   TABLESPACE USERS
   LOB(blob_col) STORE AS SECUREFILE(
      TABLESPACE LOBTBS
      COMPRESS MEDIUM
      ENCRYPT USING 'AES128'
      DEDUPLICATE
      NOCACHE
      FILESYSTEM_LIKE_LOGGING
      DISABLE STORAGE IN ROW
STORAGE (
   INITIAL 1M
   NEXT 1M
)
);

 

LOBロケータ

LOBデータへのアクセスは、LOBが物理的に格納されている場所への参照を示す「LOBロケータ」を利用します。
OS上のファイルをアクセスするアプリケーションで利用するファイルポインタに相当します。
表セグメントに格納されるのはLOBロケータのみです。
(4000Bytes以下のデータ量の場合には、表セグメントに格納することが可能)

 

(例)LOBの操作 (LOBロケータを利用したLOB値へのアクセスと変更)

DECLARE
   CURSOR c1 IS SELECT id, blob_col FROM lob_tab;
   rec c1%ROWTYPE;
   buffer RAW(256);
   amount INTEGER;
BEGIN
   OPEN c1;
LOOP
   FETCH c1 INTO rec;
   EXIT WHEN c1%NOTFOUND;
BEGIN
   DBMS_LOB.OPEN(rec.blob_col, DBMS_LOB.LOB_READONLY);
   amount := DBMS_LOB.GETLENGTH(rec.blob_col);
   DBMS_LOB.READ(rec.blob_col, amount, 1, buffer);
   DBMS_OUTPUT.PUT_LINE(RAWTOHEX(buffer));
   DBMS_LOB.CLOSE(rec.blob_col);
END;
END LOOP;
CLOSE c1;
END;
/

LOBの初期化します。 空のLOBを作成(LOBの実体は無し)

SQL> INSERT INTO lob_tab (id, blob_col) VALUES (2, EMPTY_BLOB());
 
SQL> INSERT INTO lob_tab (id, blob_col) VALUES (2, NULL);
SQL> UPDATE lob_tab SET blob_col = EMPTY_BLOB() WHERE id = 2;
 

DECLARE
   lob BLOB;
   buffer RAW(256);
BEGIN
   INSERT INTO lob_tab (id, blob_col) VALUES (3,empty_blob())
   RETURNING blob_col INTO lob;
   DBMS_LOB.OPEN(lob, DBMS_LOB.LOB_READWRITE);
   buffer := HEXTORAW('0123456789ABCDEF');
   DBMS_LOB.WRITE(lob, 8, 1, buffer);
   DBMS_LOB.CLOSE(lob);
END;
/


ここでは、PL/SQLからのLOBロケータを利用した操作方法を説明しました。

SQL Loaderを利用した大量のLOBデータのローディング方法などの、より詳しい操作方法に関しては、以下のセミナーをご覧ください。


【セミナー動画/資料】LOB(BLOB)取り扱い説明書 ~画像・ドキュメントもDBで管理する~

Be the first to comment

Comments ( 0 )
Please enter your name.Please provide a valid email address.Please enter a comment.CAPTCHA challenge response provided was incorrect. Please try again.