【问题标题】:SQLLDR and NULL Field detection in column to be imported要导入的列中的 SQLLDR 和 NULL 字段检测
【发布时间】:2011-08-31 08:27:12
【问题描述】:

SQLLDR 和 CTL 文件

有一个 CSV 文件要导入。

我想在我的 CTL 文件中指定仅当我的 CSV 文件的某个列中有一个空值时才插入到我的表中。例如,我只想上传没有终止日期的用户记录。

我尝试了各种选择

  • 当 TERMINATIONDATE = ''时
  • 当 TERMINATIONDATE = ""时
  • 当 TERMINATIONDATE = null 时
  • 当 TERMINATIONDATE = 'null'时

它只在我使用时有效

  • 当 TERMINATIONDATE != '' 然后我得到所有被解雇的员工。 但我想要相反...

这似乎不可能吗?

我的 CTL 文件

OPTIONS (SKIP=1)
LOAD DATA
INFILE 'C:\temp\users.csv' 
BADFILE 'C:\temp\users.bad'
DISCARDFILE 'C:\temp\users.dsc'
TRUNCATE
INTO TABLE "alawakaba"."users"
When TERMINATIONDATE = ''
FIELDS TERMINATED BY '|'
OPTIONALLY ENCLOSED BY '"'
TRAILING NULLCOLS
(
ID,
FIRSTNAME,
LASTNAME,
FUNCTION,
DEPARTMENT,
COSTCENTER,
HIREDATE,
Field8 FILLER,
TERMINATIONDATE,
LOCCODE
)

(第 8 列只是我不需要的,所以我跳过它)

【问题讨论】:

    标签: database oracle csv import sql-loader


    【解决方案1】:

    它应该与以下子句一起使用:

    WHEN TERMINATIONDATE = BLANKS
    

    【讨论】:

    • 没有做到这一点 :( 它只是忽略了所有这些。不知何故 SQLLDR 不能使用带空格的When
    【解决方案2】:

    这不是最终的解决方案,并且有一些开销,但我可以在 2 次运行中完成:

    a) 作为上面的 CTL 运行。 更改
    当 TERMINATIONDATE = ''

    当 TERMINATIONDATE != ''

    丢弃的记录将被注入到 DISCARDFILE 'C:\temp\users.dsc' 现在我丢弃的文件将包含我要上传的所有记录

    b) 运行第二个 CTL 命令以拾取 DSC 文件作为输入,不要再跳过记录,也不要指定 when 子句

    LOAD DATA
    INFILE 'C:\temp\users.dsc' 
    BADFILE 'C:\temp\users.bad'
    DISCARDFILE 'C:\temp\users-run2.dsc'
    TRUNCATE
    INTO TABLE "alawakaba"."users"
    FIELDS TERMINATED BY '|'
    OPTIONALLY ENCLOSED BY '"'
    TRAILING NULLCOLS
    (
    ID,
    FIRSTNAME,
    LASTNAME,
    FUNCTION,
    DEPARTMENT,
    COSTCENTER,
    HIREDATE,
    Field8 FILLER,
    TERMINATIONDATE,
    LOCCODE
    )
    

    不是最好或最快的,但它可以解决问题。

    不敢相信这样一个简单的子句在 SQLLDR 中从一开始就不起作用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-02-14
      • 2020-07-15
      • 2017-02-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多