0

每天我都会收到一个很大的界面文件,并且我正在加载所有行,但我只使用最新的信息(少得多的行)。我可以按 .ctl 文件过滤以便只插入最新的行吗?

这是我的 ctl 文件:

LOAD DATA
INSERT  INTO  TABLE SCHEMA.TBL_INTERFACE
(
"ID"    POSITION(001:008), --varchar2(08),
"FIRSTNAME"    POSITION(009:028), --varchar2(20),
"LASTNAME"    POSITION(029:048), --varchar2(20),
"DATE"    POSITION(049:058), --varchar2(10) FORMAT YYYYMMDD 20211029
)

这是我加载的界面示例:

12345678JUAN CARLOS0        PEREZ0               20211029
23456789JUAN CARLOS1        PEREZ1               20201029
34567890JUAN CARLOS2        PEREZ2               20181029
45678901JUAN CARLOS3        PEREZ3               20171029
4

1 回答 1

1

外部表功能怎么样?它的好处是您可以针对它编写查询(并简单地过滤您感兴趣的行)。退税?您必须有权访问数据库服务器;没问题——不过从我的角度来看;只是你不能在本地运行所有东西。

这是一个演练:

由于该功能需要访问目录(指向文件系统目录的 Oracle 对象),我们必须首先创建它,连接为SYS

SQL> connect sys as sysdba
Enter password:
Connected.
SQL> create directory ext_dir as 'c:\temp';

Directory created.

SQL> grant read, write on directory ext_dir to scott;

Grant succeeded.

连接为scott(使用它将解决该问题):

SQL> connect scott/tiger
Connected.

目标表(我拒绝使用保留字 - DATE- 作为列名。这是一个不好的做法,我建议你避免它):

SQL> desc tbl_interface
 Name                                      Null?    Type
 ----------------------------------------- -------- ----------------------------
 ID                                                 NUMBER
 FIRSTNAME                                          VARCHAR2(20)
 LASTNAME                                           VARCHAR2(20)
 DATUM                                              DATE

数据存储在C:\TEMP\TEXT.TXT文件中;请注意,我在笔记本电脑上运行 Oracle,因此它就像是数据库服务器一样。如果您的数据库服务器不在您的 PC 上,您将不得不与 DBA 交谈。

12345678JUAN CARLOS0        PEREZ0               20211029
23456789JUAN CARLOS1        PEREZ1               20201029
34567890JUAN CARLOS2        PEREZ2               20181029
45678901JUAN CARLOS3        PEREZ3               20171029

只需设置日期格式(您不必这样做):

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

Session altered.

最后,让我们创建外部表:

SQL> create table ext_table
  2    (id         number,
  3     firstname  varchar2(20),
  4     lastname   varchar2(20),
  5     datum      date
  6    )
  7  organization external
  8    (type oracle_loader
  9     default directory ext_dir
 10     access parameters
 11       (records delimited by newline
 12        fields (id        position(01:08) char(8),
 13                firstname position(09:28) char(20),
 14                lastname  position(29:48) char(20),
 15                datum     date mask "yyyymmdd"
 16               )
 17       )
 18     location('text.txt')
 19    )
 20     reject limit unlimited;

Table created.

有什么吗?

SQL> select * From ext_table;

        ID FIRSTNAME            LASTNAME             DATUM
---------- -------------------- -------------------- ----------
  12345678 JUAN CARLOS0         PEREZ0               29.10.2021
  23456789 JUAN CARLOS1         PEREZ1               29.10.2020
  34567890 JUAN CARLOS2         PEREZ2               29.10.2018
  45678901 JUAN CARLOS3         PEREZ3               29.10.2017

SQL>

是的,有 - 所有行来自text.txt.

当我们使用 SQL 时,对数据应用任何过滤器都没有问题,例如您想要的过滤器 - 以获取最新数据(今天的):

SQL> select * From ext_table
  2  where datum = trunc(sysdate);

        ID FIRSTNAME            LASTNAME             DATUM
---------- -------------------- -------------------- ----------
  12345678 JUAN CARLOS0         PEREZ0               29.10.2021

显然,现在只需将所需值插入目标表即可:

SQL> insert into tbl_interface (id, firstname, lastname, datum)
  2  select id, firstname, lastname, datum
  3  from ext_table
  4  where datum = trunc(sysdate);

1 row created.

SQL> select * from tbl_interface;

        ID FIRSTNAME            LASTNAME             DATUM
---------- -------------------- -------------------- ----------
  12345678 JUAN CARLOS0         PEREZ0               29.10.2021

SQL>
于 2021-10-29T18:02:10.403 回答