1

我有一个txt文件如下。1st machine_no,2nd emp_no, 3rd shift_type(1代表进入,3代表退出,也可以是4代表进入(多次进入),5代表退出(多次退出),第5个工作日期,第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 中进行选择,并根据您的选择移动或转换数据。

注意我已将字段保留为 VARCHAR2 但您可以根据需要对它们进行 to_date 或 to_number 。我更喜欢在数据库中转换数据,您可能更喜欢在外部表中进行...

有关外部表操作方法的链接,请参阅 Kevin Burton 的答案。

希望这可以帮助...

于 2011-09-19T14:03:15.043 回答