带有日期列和跳过标头的oracle外部表

时间:2018-02-05 06:27:19

标签: oracle10g

我有一个文件,

ID,DNS,R_D,R_A
1,123456,2014/11/17,10
2,987654,2016/05/20,30
3,434343,2017/08/01,20

我正在尝试使用外部表加载到oracle。 我必须跳过标题行并加载日期列。

这是我的疑问:

DECLARE
FILENAME VARCHAR2(400);
BEGIN
FILENAME := 'actual_data.txt';
EXECUTE IMMEDIATE 'CREATE TABLE EXT_TMP (
  ID      NUMBER(25),
  DNS  VARCHAR2(20),
  R_D DATE,
  R_A  NUMBER(25)
)
ORGANIZATION EXTERNAL (
  TYPE ORACLE_LOADER
  DEFAULT DIRECTORY USER_DIR
  ACCESS PARAMETERS (
    RECORDS DELIMITED BY NEWLINE
    FIELDS TERMINATED BY '',''
    MISSING FIELD VALUES ARE NULL
    SKIP 1
    (
  "ID",      
  "DNS",
  "R_D" date "dd-mon-yy",
  "RECHARGE_AMOUNT"
    )
  )
  LOCATION (''' || FILENAME || ''')
)
PARALLEL 5
REJECT LIMIT UNLIMITED';
END;

我得到以下例外:

ERROR at line 1:
ORA-29913: error in executing ODCIEXTTABLEOPEN callout
ORA-29400: data cartridge error
KUP-00554: error encountered while parsing access parameters
KUP-01005: syntax error: found "skip": expecting one of: "column, exit, (,
reject"
KUP-01007: at line 4 column 5
ORA-06512: at "SYS.ORACLE_LOADER", line 19

我正在使用sqlplus。

有些神谕老兵请帮帮我,告诉我这里我做错了什么?我对甲骨文很新。

2 个答案:

答案 0 :(得分:1)

您不希望在PL / SQL中创建任何类型的表(包括外部表);并非这是不可能的,但它与最佳实践相反。

根据您提供的信息查看我的尝试 - 工作正常。

SQL> alter session set nls_date_format = 'dd.mm.yyyy';

Session altered.

SQL> create table ext_tmp
  2  (
  3    id      number,
  4    dns     varchar2(20),
  5    r_d     date,
  6    r_a     number
  7  )
  8  organization external
  9  (
 10    type oracle_loader
 11    default directory kcdba_dpdir
 12    access parameters
 13    (
 14      records delimited by newline
 15      skip 1
 16      fields terminated by ',' lrtrim
 17      missing field values are null
 18      (
 19       id,
 20       dns,
 21       r_d date 'yyyy/mm/dd',
 22       r_a
 23      )
 24    )
 25    location ('actual_data.txt')
 26  )
 27  parallel 5
 28  reject limit unlimited;

Table created.

SQL> select * from ext_tmp;

        ID DNS                  R_D               R_A
---------- -------------------- ---------- ----------
         1 123456               17.11.2014         10
         2 987654               20.05.2016         30
         3 434343               01.08.2017         20

SQL>

答案 1 :(得分:0)

就我而言,skip 1直到将其放在records delimited by newlinefields terminated by ',' lrtrim之间才起作用,直到我使用load when为止。现在skip 1使用以下访问参数:

access parameters (
    records delimited by newline 
    load when (someField != BLANK)
    skip 1 
    fields terminated by '','' lrtrim
    missing field values are null
    reject rows with all null fields
)