外部表功能怎么样?它的好处是您可以针对它编写查询(并简单地过滤您感兴趣的行)。退税?您必须有权访问数据库服务器;没问题——不过从我的角度来看;只是你不能在本地运行所有东西。
这是一个演练:
由于该功能需要访问目录(指向文件系统目录的 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>