带有日期列的 oracle 外部 table 并跳过 header

oracle external table with date column and skip header

我有一个文件,

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。 我必须跳过 header 行并加载日期列。

这是我的查询:

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。

能否请一些 oracle 资深人士帮助我,告诉我我做错了什么?我是 oracle 的新手。

您不想在 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>

在我的例子中,即使将它放在 records delimited by newlinefields terminated by ',' lrtrim 之间,skip 1 也不起作用,直到我使用 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
)