【问题标题】:How can I load data conditionally using sqlldr in oracle如何在 oracle 中使用 sqlldr 有条件地加载数据
【发布时间】:2011-09-22 19:59:47
【问题描述】:

我有一个txt文件如下。第一个machine_no,第二个emp_no,第三个shift_type(1个进入,3个退出),第4个work_date,第4个是时间。

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,  

我想在表格中加载数据。字段time1 有时间如果 time_type 是 1,如果 time_type 是,则字段 time2 有时间 3. 请让我知道如何在控制文件中包含它。

提前感谢您的帮助..Macky。

下面是oracle中的txt文件和表格。

表格如下:

desc data_trans;

 Name                            Null?    Type
 ------------------------------- -------- ----
 MACHIAN                                  VARCHAR2(4)
 YEAR                                     NUMBER(4)
 MONTH                                    VARCHAR2(2)
 WDAY                                     VARCHAR2(2)
 TIME1                                    VARCHAR2(5)
 TIME2                                    VARCHAR2(5)
 TIME3                                    VARCHAR2(2)
 SHIFT_NO                                 NUMBER(1)
 TIME_TYPE                                NUMBER(1)
 WORK_DATE                                DATE
 EMP_NO                                   VARCHAR2(10)

【问题讨论】:

    标签: oracle sql-loader


    【解决方案1】:

    您为什么不使用外部表来读取此文件,然后您可以简单地从中选择并在 SQL 中轻松执行您想要的任何条件转换。

    注意有一些假设,您似乎将“time_type”与似乎是“shift_type”的内容互换,并且您的数据文件中不存在表列等。

    -- Create the Oracle directory
    CREATE OR REPLACE DIRECTORY file_dir AS '<physical-server-directory-path>';
    
    -- Grant privs on the directory
    GRANT READ, WRITE ON DIRECTORY file_dir TO <username>;
    
    -- Create the external table
    CREATE TABLE ext_data_table
    (machine_no                VARCHAR2(4),
     emp                       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
        BADFILE file_dir :'file.bad'
        LOGFILE file_dir :'file.log'
        DISCARDFILE file_dir :'file.dsc'
         FIELDS TERMINATED BY ','
         (
          machine_no                CHAR(4),
          emp                       CHAR(10),
          shift_type                CHAR(2),
          work_date                 CHAR(10),
          time                      CHAR(5)
         )
       LOCATION (
        FILE_DIR:'<filename>'
       )
      )
      NOPARALLEL;
    
    -- Insert (and transform) your file data
    INSERT INTO data_trans
    (machian,
     year,
     month,
     wday,
     time1,
     time2,
     time3,
     shift_no,
     time_type,
     work_date,
     emp_no)
    SELECT machine_no,              -- machian
           SUBSTR(work_date, 1, 4), -- year
           SUBSTR(work_date, 6, 2), -- month
           SUBSTR(work_date, 9, 2), -- wday
           (CASE TO_NUMBER(shift_type)
               WHEN 1
               THEN time
               ELSE NULL
             END),                  -- time1
           (CASE TO_NUMBER(shift_type)
               WHEN 3
               THEN time
               ELSE NULL
             END),                  -- time2
           NULL,                    -- time3    (You don't specify)
           NULL,                    -- shift_no (You don't specify)
           TO_NUMBER(shift_type),   -- time_type
           TO_DATE(work_date, 'YYYY/MM/DD'), -- work_date
           emp                      -- emp_no
      FROM ext_data_table;
    

    根据给出的信息,这是一个近似值。

    希望对你有帮助。

    【讨论】:

    • 对不起,我之前没有提到我使用的是 Oracle 8i,我不能使用外部表。我正在将数据加载到 oracle 中的 tmp 表中,这就是它的外观。
    • 好的,那你有没有看过这篇文章:oracle-base.com/articles/8i/DIYDynamicViews.php
    • 你应该尝试让你的公司从8i升级,它已经被取消支持很长时间了。
    【解决方案2】:

    这在 SQL*Loader 中是不可能的。使用External Table,然后使用decode 函数将其复制到您的真实表中pivot

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-11-17
      • 1970-01-01
      • 1970-01-01
      • 2019-03-01
      相关资源
      最近更新 更多