【问题标题】:Issues with multiple delimiters for records and fields in a Oracle External TableOracle 外部表中记录和字段的多个分隔符问题
【发布时间】:2021-10-24 20:37:41
【问题描述】:

给定一个 .CSV 格式的文件;

!!"9999"!@!""!@!""!@!""!!
!!"100"!@!""!@!""!@!"INP"!!
!!"700"!@!""!@!""!@!""!!
!!"800"!@!""!@!""!@!""!!

开始和结束分隔符= !! 字段分隔符 = !@! 用双引号括起来的所有字段

以下外部语法无法正常工作;

CREATE TABLE caunit_ext 
(
 ID                 VARCHAR2(4), 
 MILL_FAC_ID        VARCHAR2(200), 
 MILL_LOC_ID        VARCHAR2(200), 
 MILL_ENC_TYP_ID    VARCHAR2(200)
)
ORGANIZATION EXTERNAL (
  TYPE ORACLE_LOADER
  DEFAULT DIRECTORY PWSTAGING
  ACCESS PARAMETERS (
    RECORDS DELIMITED BY '!!'
    FIELDS TERMINATED BY '!@!'
    MISSING FIELD VALUES ARE NULL
    (
         ID                 CHAR(4), 
         MILL_FAC_ID        CHAR(200), 
         MILL_LOC_ID        CHAR(200), 
         MILL_ENC_TYP_ID    CHAR(20)   
    )
  )
  LOCATION ('CAUNIT.csv')
)
PARALLEL 5
REJECT LIMIT UNLIMITED;
/

select * from caunit_ext;
  1. 我可以使用多个字符作为分隔符吗?我看到的医生没有说你不能,但也不要说你可以!
  2. 由于我的开始记录和结束记录分隔符相同,如何处理?

【问题讨论】:

    标签: oracle csv oracle11g external-tables


    【解决方案1】:

    您可以使用多个字符作为分隔符。

    Oracle 加载器文档说分隔符必须是单个字符,但没有说明字段分隔符。

    因此,您可以为两个分隔符使用任意数量的字符。

    例如,您可以使用“!!@!!”作为分隔符和“!@!”作为字段分隔符。

    这适用于以下外部语法:

    CREATE TABLE caunit_ext 
    (
     ID                 VARCHAR2(4), 
     MILL_FAC_ID        VARCHAR2(200), 
     MILL_LOC_ID        VARCHAR2(200), 
     MILL_ENC_TYP_ID    VARCHAR2(200)
    )
    ORGANIZATION EXTERNAL (
      TYPE ORACLE_LOADER
      DEFAULT DIRECTORY PWSTAGING
      ACCESS PARAMETERS (
        RECORDS DELIMITED BY '!!@!!'
        FIELDS TERMINATED BY '!@!'
        MISSING FIELD VALUES ARE NULL
        (
             ID                 CHAR(4), 
             MILL_FAC_ID        CHAR(200), 
             MILL_LOC_ID        CHAR(200), 
             MILL_ENC_TYP_ID    CHAR(20)   
        )
      )
      LOCATION ('CAUNIT.csv')
    )
    PARALLEL 5
    REJECT LIMIT UNLIMITED;
    /
    
    select * from caunit_ext;
    

    【讨论】:

    • 不幸的是,这对我不起作用; KUP-04021:字段 ID 的字段格式错误 KUP-04026:数据类型的字段太长 KUP-04101:文件 /mnt/systems/CAUNIT.csv 中的记录 1 被拒绝
    • 你能在分隔符周围用双引号吗?
    【解决方案2】:

    我的解决方案是使用 FILLER 参数来扔掉垃圾;

    喜欢

    create table REFRESHTABLE(C1 varchar2(200), C2 varchar2(200), C3 varchar2(200), C4 varchar2(200),C5 varchar2(200), C6 varchar2(200), C7 varchar2(200), C8 varchar2(200)) 
                    ORGANIZATION EXTERNAL (TYPE ORACLE_LOADER DEFAULT DIRECTORY PWSTAGING ACCESS PARAMETERS (FIELDS TERMINATED BY ''"'' MISSING FIELD VALUES ARE NULL
                        (
                             FILLER,
                             C1      CHAR(200), 
                             FILLER,
                             C2      CHAR(200), 
                             FILLER,
                             C3      CHAR(200), 
                             FILLER,
                             C4      CHAR(200),   
                             FILLER,
                             C5      CHAR(200), 
                             FILLER,
                             C6      CHAR(200), 
                             FILLER,
                             C7      CHAR(200), 
                             FILLER,
                             C8      CHAR(200)   
                        )
                      )
                      LOCATION (''' || V_CURRENTTABLE || '.csv''))';
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-04-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-14
      • 1970-01-01
      • 2019-12-08
      • 2016-10-05
      相关资源
      最近更新 更多