在oracle中使用sqlldr导入数据

时间:2011-09-19 13:10:55

标签: oracle sql-loader

我有一个txt文件如下。 1st machine_no,2nd emp_no,3rd 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  

请告知什么是最简单的&用代码完成它的最快方法。感谢您的帮助。

2 个答案:

答案 0 :(得分:2)

SQLLDR + SQL脚本是将数据加载到数据库的绝佳方式。

但是,如果您使用的是Oracle 9i及更高版本,我认为,最简单的解决方案必须是使用external tables,但您需要将文件放到数据库可以访问的某个存储上(samba共享)或NFS挂载文件系统)

sqlldr& s之间的性能差异很小。外部表格。 (尽管它们处理约束违规的方式有所不同)

另见:http://orafaq.com/node/848

答案 1 :(得分: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中进行选择,然后根据您的选择移动或转换数据。

N.B。我将字段保存为VARCHAR2,但您可以根据需要to_date或to_number。我更喜欢在数据库中转换数据后,您可能更愿意在外部表中进行...

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

希望这会有所帮助......