5

以下は私の制御ファイルの例です:

    OPTIONS (skip=1,errors=1000,direct=true,rows=10000)
    load data 
    append
    into table TABLE_NAME
    fields terminated by ','
    OPTIONALLY ENCLOSED BY '"'
    trailing nullcols(
      DATE_ID       DATE_ID_VALUE,
      DESC1         char(1000),
      DESC2         char(1000),
      DISP_URL      char(1000),
      DEST_URL      char(1000),
      ACCT_ID       ACCOUNTID_VALUE,
      Acct_num      ACCOUNT_NUM,
      created_date SYSDATE
    )

sqlldr コマンドから DATE_ID_VALUE、ACCOUNTID、ACCOUNTNUM の値を渡す必要があります。sqlldr「DATA」パラメーターから渡されるcsvファイルを介して、リマミング列データを渡しています。sqlldr コマンドまたはその他の方法で他の必要なパラメーターを渡す方法はありますか?

以下は私のsqlldrコマンドです:

   sqlldr userid=abc/abcdef@abcdefgh CONTROL= cont.ctl DATA= $csvFilePath  LOG=admaster.log BAD=admaster.bad
4

2 に答える 2

1

これが古いことは知っていますが、偶然見つけたばかりで、最近同様の質問に答えました。ラッパー プログラムから制御ファイルを作成する手法については、こちらの返信を参照してください。

INFILE のタイムスタンプを SQLLOADER から列に挿入します

于 2014-12-16T18:51:12.413 に答える
1

.ctl ファイル内の変数をパラメーター化することはできませんが、.ctl ファイルを完全に省略して、必要に応じてパラメーター化することは可能です。

sqlldr を直接呼び出すのではなく、外部テーブルを宣言してから SQL を実行する必要がありますINSERT into TABLE_NAME SELECT * from EXTERNAL_TABLE;。外部テーブル宣言には、バックグラウンドで使用される sqlldr パラメータが含まれており、Unix シェルから直接実行できる SQL クエリで定義され、必要なすべてのパラメータが Unix システム変数またはコマンドとして指定されます。

たとえば、呼び出し環境で $DATE_ID_VALUE と他の 2 つの変数の値を設定したら、まず外部テーブルを作成します。

echo "create table myschema.temp_table_name (
    DATE_ID       INTEGER,
    DESC1         char(1000),
    DESC2         char(1000),
    DISP_URL      char(1000),
    DEST_URL      char(1000),
    ACCT_ID       INTEGER,
    Acct_num      INTEGER,
    created_date  DATE)
   organization external
     (
     type oracle_loader
     default directory mydir
     access parameters (
       records delimited by newline
       badfile bad_dir: 'temp_ext_temp_table_name_load.bad'
       logfile log_dir: 'temp_ext_temp_table_name_load.log'
       fields terminated by ',' (
          DESC1         char(1000),
          DESC2         char(1000),
          DISP_URL      char(1000),
          DEST_URL      char(1000)
       )
       column transforms (
          DATE_ID       FROM CONSTANT '$DATE_ID_VALUE',
          ACCT_ID       FROM CONSTANT '$ACCOUNTID_VALUE',
          Acct_num      FROM CONSTANT '$ACCOUNT_NUM',
          created_date  FROM CONSTANT \"`date '+%d-%b-%Y'`\"
       )
     )
     location ('temp_table_name.dat')
     )
     reject limit 1000;" | sqlplus -s /

このcolumn transforms句は、環境変数と Unix date コマンドから解決された定数値を外部テーブルに入力します。

次に、ターゲット テーブルに挿入します (appendダイレクト パス ロードのオプションのヒント)。

insert /*+ append */ into table_name
select * from myschema.temp_table_name;

SYSDATE を含める方法が見つからなかったので、代わりに UNIX の date コマンドを使用しました。

于 2016-07-14T15:32:52.653 に答える