如何为外部表缺失的列填充空值 |甲骨文 | PLSQL

问题描述 投票:0回答:1

我一直卡在这一刻没有得到我需要做的事情

我有一个名为 - employee.csv 的文件,有 4 列

EMPID,EMPNAME,EMPAGE,EMPCREATION
1,ABC,12,202190211
2,XYZ,24,202190211
3,HJK,25,202190211

我的员工表结构

create table employee
(
  empid number,
  empname varchar2(255),
  empage  varchar2(255),
  empcreation date
  emprole varchar2(255),
  empgroup varchar2(255)  
)

如您所见,我的上表有 6 列,而我的数据文件只有 4 列

当我使用 oracle external 加载文件时,我的外部表是空的

   create table demo_employee
   ( 
      empid number,
      empname varchar2(255),
      empage  varchar2(255),
      empcreation date
      emprole varchar2(255),
      empgroup varchar2(255)  
   )organization external ( type oracle_loader default directory ABC access parameters 
    ( fields terminated by ',') location ('employee.csv')reject limit unlimited;

我的外部表创建了,但里面没有记录。如果我的文件中缺少我的列,则应将数据填充为 NULL 并继续。

oracle plsql external-tables
1个回答
0
投票

你检查日志文件了吗?它可能说日期格式无效。

empcreation
听起来像约会,你想把
202190211
放在那里。它是什么?
2021
可能是一年;接下来的
9
是什么?还是
90

我修改了示例数据,使其实际代表有效的日期值:

1,ABC,12,20230423  --> 23rd of April 2023
2,XYZ,24,20230427
3,HJK,25,20210903

然后,创建表(为了更漂亮的输出,我修改了列长度):

SQL> CREATE TABLE employee
  2  (
  3     empid         NUMBER,
  4     empname       VARCHAR2 (10),
  5     empage        VARCHAR2 (10),
  6     empcreation   DATE,
  7     emprole       VARCHAR2 (10),
  8     empgroup      VARCHAR2 (10)
  9  );

Table created.

外部表;

note missing field values are null
empcreation
的数据类型(
varchar2
,不是
date
):

SQL> CREATE TABLE demo_employee
  2  (
  3     empid         NUMBER,
  4     empname       VARCHAR2 (10),
  5     empage        VARCHAR2 (10),
  6     empcreation   VARCHAR2 (10),
  7     emprole       VARCHAR2 (10),
  8     empgroup      VARCHAR2 (10)
  9  )
 10  ORGANIZATION EXTERNAL
 11     (
 12        TYPE oracle_loader
 13        DEFAULT DIRECTORY dpdir
 14        ACCESS PARAMETERS (RECORDS DELIMITED BY NEWLINE
 15                           FIELDS TERMINATED BY "," MISSING FIELD VALUES ARE NULL)
 16        LOCATION ('test_so.csv'))
 17     REJECT LIMIT UNLIMITED;

Table created.

里面有什么吗?是的!

SQL> SELECT * FROM demo_employee;

     EMPID EMPNAME    EMPAGE     EMPCREATIO EMPROLE    EMPGROUP
---------- ---------- ---------- ---------- ---------- ----------
         1 ABC        12         20230423
         2 XYZ        24         20230427
         3 HJK        25         20210903

现在,将数据传输到目标表中,为

empcreation
提供格式掩码:

SQL> INSERT INTO employee (empid,
  2                        empname,
  3                        empage,
  4                        empcreation)
  5     SELECT empid, empname, empage, TO_DATE (empcreation, 'yyyymmdd') FROM demo_employee;

3 rows created.

最终结果:

SQL> SELECT * FROM employee;

     EMPID EMPNAME    EMPAGE     EMPCREATIO EMPROLE    EMPGROUP
---------- ---------- ---------- ---------- ---------- ----------
         1 ABC        12         23.04.2023
         2 XYZ        24         27.04.2023
         3 HJK        25         03.09.2021

SQL>
© www.soinside.com 2019 - 2024. All rights reserved.