注意:
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.
外部表では、LOCATION
句で指定された各データ・ファイルが単一グラニュルとして扱われます。PREPROCESSOR
句によるパラレル処理を最大限に活用するには、ロードされるデータを複数ファイル(グラニュル)に分割する必要があります。これは、外部表における並列度が、存在するデータ・ファイル数までに制限されるためです。たとえば、並列度を16に指定し、データ・ファイルが10個のみ存在する場合には、10個のスレーブ・プロセスがビジーとなり、6個がアイドル状態になるため、実際の並列度は10となります。アイドル状態のスレーブ・プロセスがないことが最適な状態です。したがって、並列度を指定する場合、すべてのスレーブ・プロセスがビジーになるように、並列度がデータ・ファイル数を超えないことが理想的です。
関連項目:
並列度のグラニュルの詳細は、『Oracle Database VLDBおよびパーティショニング・ガイド』を参照してください。