1

次のようなtxtファイルがあります。1 番目の machine_no、2 番目の emp_no、3 番目の shift_type (1 はエントリ、3 は退出、4 はエントリ (複数のエントリ)、5 は退出 (複数のエントリ)、5 番目の work_date、6 番目は時間です。

001,0000000021,01,2011/06/21,06:50,        
001,0000000026,01,2011/06/21,14:00,        
001,0000000018,01,2011/06/21,07:00,        
001,0000000021,03,2011/06/21,14:00,        
001,0000000018,03,2011/06/21,16:50,        
001,0000000026,03,2011/06/21,16:55,        
001,0000000023,01,2011/06/21,07:20,        
001,0000000023,03,2011/06/21,16:30,        
001,0000000023,01,2011/06/22,07:20,        
001,0000000023,03,2011/06/22,16:30,        
001,0000000023,01,2011/06/23,07:20,        
001,0000000023,03,2011/06/23,16:30, 

次のように、txtファイルからOracleテーブルにデータをロードしたい:

EMP_NO WORK_DATE         START_TIME          END_TIME            
------ ------------- ----------------------- -------------------
    26 21-06-2011 00:00:00   21-06-2011 14:00:00 21-06-2011 16:55:00
    18 21-06-2011 00:00:00   21-06-2011 07:00:00 21-06-2011 16:50:00
    23 21-06-2011 00:00:00   21-06-2011 07:20:00 21-06-2011 16:30:00
    23 22-06-2011 00:00:00   22-06-2011 07:20:00 22-06-2011 16:30:00
    23 23-06-2011 00:00:00   23-06-2011 07:20:00 23-06-2011 16:30:00
    21 21-06-2011 00:00:00   21-06-2011 06:50:00 21-06-2011 14:00:00  

コードでそれを行う最も簡単で最速の方法を教えてください。あなたの助けに感謝。

4

2 に答える 2

2

SQLLDR + SQL スクリプトは、データベースにデータをロードする優れた方法です。

ただし、Oracle 9i 以降を使用している場合、最も簡単な解決策は外部テーブルを使用することですが、データベースがアクセスできるストレージ (samba 共有または NFS マウント ファイル システム) にファイルを取得する必要があります。

sqlldr と外部テーブルのパフォーマンスの違いはほとんどありません。(ただし、両者は制約違反の処理方法に違いがあります)

参照: http://orafaq.com/node/848

于 2011-09-19T13:26:50.543 に答える
2

あなたが提供したデータスニペットを見ると、外部テーブルを使用する必要があり、これは近いはずです:

CREATE TABLE file_table
(machine_no     VARCHAR2(3),
 emp_no         VARCHAR2(10),
 shift_type     VARCHAR2(2),
 work_date      VARCHAR2(10),
 time           VARCHAR2(5)
)
  ORGANIZATION EXTERNAL 
  (
   DEFAULT DIRECTORY file_dir 
    ACCESS PARAMETERS
    (
     RECORDS DELIMITED BY NEWLINE
     FIELDS TERMINATED BY ','
     (
      machine_no     CHAR(3),
      emp_no         CHAR(10),
      shift_type     CHAR(2),
      work_date      CHAR(10),
      time           CHAR(5)
     )
    )
    LOCATION 
    (
     file_dir:'<file_name_including_extension>'
    )
  )
  NOPARALLEL;

データファイルを配置できる物理サーバーディレクトリを指す論理Oracleディレクトリを作成する必要があります(デフォルトでは、外部テーブルもそのディレクトリにログを書き込みます)。

CREATE OR REPLACE DIRECTORY file_dir AS '<server-directory-path>';

これが完了したら、file_table から選択して、選択したデータを移動または変換できます。

NB フィールドを VARCHAR2 として保持していますが、必要に応じて to_date または to_number できます。私はデータがDBに入ったら変換することを好みますが、外部テーブルで行うことを好むかもしれません...

外部テーブルのハウツーへのリンクについては、Kevin Burton の回答を参照してください。

お役に立てれば...

于 2011-09-19T14:03:15.043 に答える