プライマリ・コンテンツに移動
Oracle® Databaseユーティリティ
12cリリース1 (12.1.0.2)
B71303-09
目次へ移動
目次
索引へ移動
索引

前
次

BFILEデータ型のアンロードおよびロード

BFILEデータ型には、ファイルのディレクトリ・オブジェクトとディレクトリ・オブジェクト内のファイル名という2つの情報が格納されます。

ORACLE_DATAPUMPアクセス・ドライバを使用して、ディレクトリ・オブジェクト名およびファイル名を外部表の2つの列に格納することにより、BFILE列をアンロードできます。DBMS_LOB.FILEGETNAMEプロシージャは両方の名前を返します。ただし、これはプロシージャであるため、SELECT文では使用できません。かわりに、2つのファンクションを使用します。最初のファンクションは、ディレクトリ・オブジェクト名を返し、2つ目のファンクションはファイル名を返します。

次の手順では、BFILEデータ型のアンロードおよびロードの例を示します。

  1. BFILE 列のディレクトリ・オブジェクトを抽出するファンクションを作成します。列がNULLの場合は、NULLが返されます。
    SQL> CREATE FUNCTION get_dir_name (bf BFILE) RETURN VARCHAR2 IS
      2  DIR_ALIAS VARCHAR2(255);
      3  FILE_NAME VARCHAR2(255);
      4  BEGIN
      5    IF bf is NULL
      6    THEN
      7      RETURN NULL;
      8    ELSE
      9      DBMS_LOB.FILEGETNAME (bf, dir_alias, file_name);
     10      RETURN dir_alias;
     11    END IF;
     12  END;
     13  /
    
    Function created.
    
  2. BFILE列のファイル名を抽出するファンクションを作成します。
    SQL> CREATE FUNCTION get_file_name (bf BFILE) RETURN VARCHAR2 is
      2  dir_alias VARCHAR2(255);
      3  file_name VARCHAR2(255);
      4  BEGIN
      5    IF bf is NULL
      6    THEN
      7      RETURN NULL;
      8    ELSE
      9      DBMS_LOB.FILEGETNAME (bf, dir_alias, file_name);
     10      RETURN file_name;
     11    END IF;
     12  END;
     13  /
    
    Function created.
    
  3. 次のように、BFILE列にNULL値を持つ行を追加できます。
    SQL> INSERT INTO PRINT_MEDIA (product_id, ad_id, ad_graphic)
      2  VALUES (3515, 12001, NULL);
    
    1 row created.
    

    新しく作成したファンクションを使用して外部表を移入できます。BFILE列がNULLの場合、ファンクションはad_graphic_dir列およびad_graphic_file列をNULLに設定します。

  4. print_media表からのデータを含める外部表を作成します。get_dir_nameおよびget_file_nameファンクションを使用して、BFILE列の構成要素を取得します。
    SQL> CREATE TABLE print_media_xt
      2  ORGANIZATION EXTERNAL
      3  (
      4    TYPE oracle_datapump
      5    DEFAULT DIRECTORY def_dir1
      6    LOCATION ('pm_xt.dmp')
      7  ) AS
      8  SELECT product_id, ad_id,
      9         get_dir_name (ad_graphic) ad_graphic_dir,
     10         get_file_name(ad_graphic) ad_graphic_file
     11  FROM print_media;
    
    Table created.
    
  5. 外部表内のデータからBFILE列をロードするファンクションを作成します。外部表のad_graphic_dir列がNULLの場合、ファンクションはNULLを返します。
    SQL> CREATE FUNCTION get_bfile (dir VARCHAR2, file VARCHAR2) RETURN
    BFILE is
      2  bf BFILE;
      3  BEGIN
      4    IF dir IS NULL
      5    THEN
      6      RETURN NULL;
      7    ELSE
      8      RETURN BFILENAME(dir,file);
      9    END IF;
     10  END;
     11  /
    
    Function created.
    
  6. get_bfileファンクションを使用してBFILE列を含む新しい表を移入できます。
    SQL> CREATE TABLE print_media_int AS
      2  SELECT product_id, ad_id,
      3         get_bfile (ad_graphic_dir, ad_graphic_file) ad_graphic
      4  FROM print_media_xt;
    
    Table created.
    
  7. 新しくロードされた表の列にあるデータと、print_media表の列のデータは一致している必要があります。
    SQL> SELECT product_id, ad_id,
      2         get_dir_name(ad_graphic),
      3         get_file_name(ad_graphic)
      4  FROM print_media_int
      5  MINUS
      6  SELECT product_id, ad_id,
      7         get_dir_name(ad_graphic),
      8         get_file_name(ad_graphic)
      9  FROM print_media;
    
    no rows selected