【问题标题】:using sqlldr in oracle to import dataoracle中使用sqlldr导入数据
【发布时间】:2011-09-22 13:51:55
【问题描述】:

我有一个txt文件如下。 1号机号,2号机号,3号班次类型(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  

请告知使用代码最简单和最快的方法是什么。感谢您的帮助。

【问题讨论】:

  • 这不是一个很好的问题,标题和问题很混乱,你是在找人给你写一个控制文件吗?还是将数据加载到 oracle 的最佳方式?
  • 很抱歉给您带来了困惑。我正在按照以下方式进行操作。我在桌面上创建了一个名为 time_card.sql 的文件。当我单击此文件时,它会将 txt 文件中的数据加载到 oracle 中的临时表中,然后从临时表中将其加载到我想要的表中,即 come_leav;

标签: oracle sql-loader


【解决方案1】:

查看您提供的数据 sn-p 您应该使用外部表,这应该是关闭的:

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 的回答。

希望这会有所帮助...

【讨论】:

    【解决方案2】:

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

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

    sqlldr 和外部表之间的性能差异很小。 (尽管它们在处理违反约束的方式上有所不同)

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

    【讨论】:

    • 好点,我会编辑我的帖子,我建议你也添加 oracle 8i 标签。
    猜你喜欢
    • 1970-01-01
    • 2018-05-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多