4

ファイルデータを特定のファイル仕様ごとに DB に読み込むために使用される外部テーブルがいくつかあります。

単一形式のファイルの場合、新しいデフォルト ディレクトリと新しいファイル名を指定することでテーブルが再利用されます。これは問題なく動作していますが、BADFILE、LOGFILE、および DISCARDFILE パラメータを動的に変更する必要がある一方で、残りのアクセス パラメータは変更しないでください。

他のすべてのアクセス パラメータ (列の変換、区切り記号など) を再指定する必要なく、これを行う直接的な方法はありますか?

4

3 に答える 3

4

残念ながら、BADFILE、LOGFILE、および DISCARDFILE パラメータだけを変更しても、他のアクセス パラメータも再指定する必要はありません。

それが価値があるものであり、将来この質問を見つけた人のために、私は最終的に次の方法で問題を回避しました:

外部テーブルを選択し、そのアクセス パラメータで REGEXP_REPLACE を使用して、BADFILE、LOGFILE、および DISCARDFILE とそれらの関連値に一致するアクセス パラメータ BLOB の部分を、指定した新しい値に置き換えます。

  CURSOR external_table_cur(
     cp_external_table IN VARCHAR2,
     cp_new_log_dir IN VARCHAR2,
     cp_log_file IN VARCHAR2
  )
  IS
     SELECT table_name,
            REGEXP_REPLACE(
               access_parameters,
               <REGEX PATTERN>,
               cp_new_log_dir||':'''||LOWER(cp_log_file),
               1,
               0,
               'i'
            ) AS new_access_params
       FROM all_external_tables
      WHERE table_name = UPPER(cp_external_table);

次に、動的 SQL を使用して外部テーブルを変更し、新しいアクセス パラメータを指定しました。

  -- Point external table to new file, directory and access params
  EXECUTE IMMEDIATE(
     'ALTER TABLE '
     || p_table_name
     || ' DEFAULT DIRECTORY '
     || p_directory
     || ' LOCATION ('''
     || p_filename
     || ''') '
     || ' ACCESS PARAMETERS ('
     || TO_CHAR(new_access_params)
     || ')'
  );

これは理想的ではなく、最終的にすべてのアクセス パラメータを再指定する必要がありましたが、REGEX を使用する (そして出力を完全にテストする) ことで、プロセスがそれほど面倒でも遅くもありませんでした。

于 2011-09-20T09:43:22.563 に答える
2

Oracle 12cR2 以降、 query で外部テーブルのパラメータをオーバーライドできました

SELECT ステートメントの EXTERNAL MODIFY 句は、外部テーブル パラメータを変更します。

EXTERNAL MODIFY 句で、外部表の次の句をオーバーライドできます。

  • デフォルトディレクトリ

  • 位置

  • アクセス パラメータ

  • 拒否制限

1 つのクエリで複数の句を変更できます。LOCATION および REJECT LIMIT にはバインド変数を指定できますが、DEFAULT DIRECTORY または ACCESS PARAMETERS には指定できません。

例えば:

SELECT *
FROM tab_ext EXTERNAL MODIFY (
                 ACCESS PARAMETERS (
                   BADFILE temp_dir_2:'some_tab_ext_%a_%p.bad'
                   LOGFILE temp_dir_2
                   DISCARDFILE temp_dir_2
                 )
              );
于 2018-06-15T12:35:24.377 に答える
0

ACCESS PARAMETERS残りは変更せずに句を変更できます。ここを参照してくださいhttp://download.oracle.com/docs/cd/B28359_01/server.111/b28310/tables013.htm#i1007591 私の知る限り、BADFILEのみを変更したい場合でも、 ACCESS PARAMETERS ですべてのことを繰り返します。
例えば:

ALTER TABLE ext_table
  ACCESS PARAMETERS
   (
     records delimited by newline 
     badfile admin_bad_dir:'empxt%a_%p.bad' 
     logfile admin_log_dir:'empxt%a_%p.log' 
     fields terminated by ',' 
     missing field values are null 
     ( field1, field2 ) 
  );
于 2011-08-30T14:45:42.193 に答える