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

前
次

PREPROCESSOR

注意:

PREPROCESSOR句を使用する場合は、セキュリティ上の影響を考慮する必要があります。詳細は、『Oracle Databaseセキュリティ・ガイド』を参照してください。

ロードするファイルにORACLE_LOADERアクセス・ドライバでサポートしていない形式のデータ・レコードが含まれる場合は、PREPROCESSOR句を使用して、ユーザーが用意するプリプロセッサ・プログラムを指定し、そのプログラムをすべてのデータ・ファイルに対して実行します。引数を使用する場合は、そのプログラムの指定をシェル・スクリプトに入れる必要があります(「file_spec」の説明を参照)。

プリプロセッサ・プログラムは、アクセス・ドライバがサポートするレコード形式にデータを変換し、変換したレコード・データを標準出力(stdout)に書き出します。アクセス・ドライバはそのデータを入力として読み取ることになります。PREPROCESSOR句の構文は次のとおりです。

directory_spec

各データ・ファイルに対して実行するプリプロセッサ・プログラムの名前が含まれるディレクトリ・オブジェクトを指定します。外部表にアクセスするユーザーには、使用されるディレクトリ・オブジェクトのEXECUTE権限が必要です。directory_specを省略した場合は、外部表に対して指定されたデフォルトのディレクトリが使用されます。

注意:

セキュリティ上の理由から、プリプロセッサ・プログラムは、デフォルト・ディレクトリでなく別のディレクトリを使用して格納することをお薦めします。プリプロセッサ・プログラムが格納されているディレクトリには別のファイルを保管しないでください。

プリプロセッサ・プログラムは、ディレクトリ・オブジェクト内に存在する必要があります。これは、セキュリティ上の理由から、プログラムへのアクセスを制御できるようにするためです。OSシステム管理者は、そのディレクトリ・オブジェクトに対応するディレクトリを作成し、OSユーザーORACLEがそのディレクトリへのアクセス権を持っていることを確認する必要があります。DBAは、承認されたユーザーのみが、ディレクトリ・パスに関連付けられたディレクトリ・オブジェクトにアクセスできるようにする必要があります。ディレクトリ・オブジェクトのアクセス権は、複数のデータベース・ユーザーに付与できますが、そのディレクトリ内のプリプロセッサを実行できるのはEXECUTE権限を持つユーザーのみです。ディレクトリ・オブジェクトへの読取り/書込み権限を持つ既存データベース・ユーザーでは、前処理の機能を使用できません。DBAがディレクトリ・オブジェクトのEXECUTE権限をどのユーザーにも付与しなければ、プリプロセッサの使用を禁止できます。

関連項目:

EXECUTE権限を付与する方法については、『Oracle Database SQL言語リファレンス』を参照してください。

file_spec

プリプロセッサ・プログラムの名前です。この名前は、使用されているディレクトリ・オブジェクト(directory_specまたは外部表のデフォルト・ディレクトリのいずれか)に関連付けられたパス名の後ろに追加されます。file_specに絶対ディレクトリ・パスや相対ディレクトリ・パスを含めることはできません。

プリプロセッサ・プログラムに引数(gunzip -cなど)が必要な場合は、プログラム名とその引数を実行可能シェル・スクリプト(Windowsオペレーティング・システムではバッチ(.bat)・ファイル)で指定する必要があります。シェル・スクリプトおよびバッチ・ファイルには、次の項で説明する特定の要件があります。

オペレーティング・システム・ディレクトリに正しいバージョンのプリプロセッサ・プログラムがあることを必ず確認してください。

次に、シェルまたはバッチ・ファイルを使用せずにPREPROCESSOR句を指定する例を示します。

SQL> CREATE TABLE xtab (recno varchar2(2000))
     2    ORGANIZATION EXTERNAL (
     3    TYPE ORACLE_LOADER
     4    DEFAULT DIRECTORY data_dir
     5    ACCESS PARAMETERS (
     6    RECORDS DELIMITED BY NEWLINE
     7    PREPROCESSOR execdir:'zcat'
     8    FIELDS (recno char(2000)))
     9    LOCATION ('foo.dat.gz'))
   10    REJECT LIMIT UNLIMITED;
Table created.

Linuxオペレーティング・システムにおけるPREPROCESSOR句でのシェル・スクリプトの使用

  • シェル・スクリプトは、directory_specに存在する必要があります。

  • gunzipなどのシステム・コマンドのフルパス名を指定する必要があります。

  • プリプロセッサのシェル・スクリプトには、EXECUTE権限が必要です。

  • 外部表のLOCATION句にリストされているデータ・ファイルは、$1で参照する必要があります。

次の例は、外部表作成時のPREPROCESSOR句でのシェル・スクリプトの指定方法を示しています。

SQL> CREATE TABLE xtab (recno varchar2(2000))
     2    ORGANIZATION EXTERNAL (
     3    TYPE ORACLE_LOADER
     4    DEFAULT DIRECTORY data_dir
     5    ACCESS PARAMETERS (
     6    RECORDS DELIMITED BY NEWLINE
     7    PREPROCESSOR execdir:'uncompress.sh'
     8    FIELDS (recno char(2000)))
     9    LOCATION ('foo.dat.gz'))
   10    REJECT LIMIT UNLIMITED;
Table created.

Windowsオペレーティング・システムにおけるPREPROCESSOR句でのバッチ・ファイルの使用

  • バッチ・ファイルは、directory_specに存在する必要があります。

  • gunzipなどのシステム・コマンドのフルパス名を指定する必要があります。

  • プリプロセッサのバッチ・ファイルには、EXECUTE権限が必要です。

  • バッチ・ファイルの最初の行には@echo offを含める必要があります。この要件は、バッチ・ファイルの実行時にはデフォルトで実行中のコマンドが表示され、表示されたコマンドが外部表アクセス・ドライバへの入力として扱われるという意図しない副次的な影響があるために設けられています。

  • LOCATION句からの入力を表すには、%1を使用する必要があります。(これは、LOCATION句が$1によって参照されるLinuxスタイルのシェル・スクリプトとは異なることに注意してください。)

  • バッチ・ファイル内の実行可能ファイルにはすべてフルパスを指定する必要があります(次の例ではsed.exe)。すべてのWindowsインストールにMKSツールキットが存在するわけではないため、sed.exeなどのコマンドが使用できない場合があることにも注意してください。

    Windowsで使用するバッチ・ファイルには、.batまたは.cmd拡張子が必要です。これらがない場合(たとえば、プリプロセッサ・スクリプトをsed.shと指定しようとした場合)、次のエラーが発生します。

    SQL> select * from foo ;
    select * from foo
    *
    ERROR at line 1:
    
    ORA-29913: error in executing ODCIEXTTABLEFETCH callout
    ORA-29400: data cartridge error
    KUP-04095: preprocessor command
    C:/Temp\sed.sh encountered error
    "CreateProcess Failure for Preprocessor:
    C:/Temp\sed.sh, errorcode: 193

次に、Windowsで外部表PREPROCESSORオプションを指定したバッチ・ファイルを使用する単純な例を示します。この例では、バッチ・ファイルはストリーム・エディタ(sed.exe)ユーティリティを使用して、入力データの単純な変換を実行します。

create table deptxt
(
   deptno char(2),
   dname char(14),
   loc char(13)
)
organization external
(
type ORACLE_LOADER
default directory def_dir1
access parameters
(
   records delimited by newline
   badfile 'deptxt.bad'
   logfile 'deptxt.log'
   preprocessor exec_dir:'sed.bat'
   fields terminated by ','
   missing field values are null
)
   location ('deptxt.dat')
)
reject limit unlimited ;

select * from deptxt ;

Where deptxt.dat contains:

10,ACCOUNTING,NEW YORK
20,RESEARCH,DALLAS
30,SALES,CHICAGO
40,OPERATIONS,BOSTON

プリプロセッサ・プログラムsed.batの内容は次のとおりです。

@echo off
c:/mksnt/mksnt/sed.exe -e 's/BOSTON/CALIFORNIA/' %1

PREPROCESSORオプションにより、入力データ(deptxt.dat)がsed.batに渡されます。その後、deptxt表から選択すると、以前はBOSTONだった最後の行のLOC列がCALIFORNIAになったことが結果に表示されます。

SQL> select * from deptxt ;

DE DNAME          LOC
-- -------------- -------------
1a ACCOUNTING     NEW YORK
20 RESEARCH       DALLAS
30 SALES          CHICAGO
40 OPERATIONS     CALIFORNIA

4 rows selected.

PREPROCESSOR句によるパラレル処理の使用

外部表では、LOCATION句で指定された各データ・ファイルが単一グラニュルとして扱われます。PREPROCESSOR句によるパラレル処理を最大限に活用するには、ロードされるデータを複数ファイル(グラニュル)に分割する必要があります。これは、外部表における並列度が、存在するデータ・ファイル数まで制限されるためです。たとえば、並列度を16に指定し、データ・ファイルが10個のみ存在する場合には、10個のスレーブ・プロセスがビジーとなり、6個がアイドル状態になるため、実際の並列度は10となります。アイドル状態のスレーブ・プロセスがないことが最適な状態です。したがって、並列度を指定する場合、すべてのスレーブ・プロセスがビジーになるように、並列度がデータ・ファイル数を超えないことが理想的です。

関連項目:

  • 並列度のグラニュルの詳細は、『Oracle Database VLDBおよびパーティショニング・ガイド』を参照してください。

PREPROCESSOR句を使用する際の制限事項

  • Oracle Database Vault機能を使用するデータベースでは、PREPROCESSOR句を使用できません。

  • PREPROCESSOR句は、COLUMN TRANSFORMS句とともには使用できません。