要使用外部表,您需要 CREATE TABLE 和 CREATE ANY DIRECTORY 权限。
(例如:Oracle 12c、Linux)。在 Oracle 中,创建一个目录。
SQL> create directory external_tables as '/home/dbuser/datafiles';
Directory created.
Linux(创建示例 csv 文件)
$ cd /home/dbuser/datafiles
$ echo "NAME,OPCO,CATEGORY,PRE_APPROVED,PRE_APPROVED_REQUESTER,EXT_PRE_APPROVED_REQUESTER,Authorized_FW_Request_Approver,AUTHORIZED_UPDATE_TEAM_ENTRY,WORK_INSTRUCTIONS_COMMENTS" > csvfile.csv
$ echo "val11,val12,val13,val14,val15,val16,AUTHFRA_7000, val18, val19" >> csvfile.csv
$ echo "val21,val22,val23,val24,val25,val26,AUTHFRA_7001, val28, val29" >> csvfile.csv
$ echo "val31,val32,val33,val34,val35,val36,AUTHFRA_7002, val38, val39" >> csvfile.csv
$ cat csvfile.csv
NAME,OPCO,CATEGORY,PRE_APPROVED,PRE_APPROVED_REQUESTER,EXT_PRE_APPROVED_REQUESTER,Authorized_FW_Request_Approver,AUTHORIZED_UPDATE_TEAM_ENTRY,WORK_INSTRUCTIONS_COMMENTS
val11,val12,val13,val14,val15,val16,AUTHFRA_7000, val18, val19
val21,val22,val23,val24,val25,val26,AUTHFRA_7001, val28, val29
val31,val32,val33,val34,val35,val36,AUTHFRA_7002, val38, val39
Oracle:外部表
create table external_ (
NAME varchar2( 4000 )
, OPCO varchar2( 4000 )
, CATEGORY varchar2( 4000 )
, PRE_APPROVED varchar2( 4000 )
, PRE_APPROVED_REQUESTER varchar2( 4000 )
, EXT_PRE_APPROVED_REQUESTER varchar2( 4000 )
, Authorized_FW_Request_Approver varchar2( 4000 )
, AUTHORIZED_UPDATE_TEAM_ENTRY varchar2( 4000 )
, WORK_INSTRUCTIONS_COMMENTS varchar2( 4000 )
)
organization external (
type oracle_loader
default directory external_tables
access parameters
(
records field names all files
fields CSV without embedded record terminators
)
location
(
'csvfile.csv'
)
)
/
从外部表中选择。
-- column aliases -> output more compact (just for this example)
select
NAME c1
, OPCO c2
, CATEGORY c3
, PRE_APPROVED c4
, PRE_APPROVED_REQUESTER c5
, EXT_PRE_APPROVED_REQUESTER c6
, Authorized_FW_Request_Approver c7
, AUTHORIZED_UPDATE_TEAM_ENTRY c8
, WORK_INSTRUCTIONS_COMMENTS c9
from external_ ;
-- result
C1 C2 C3 C4 C5 C6 C7 C8 C9
val11 val12 val13 val14 val15 val16 AUTHFRA_7000 val18 val19
val21 val22 val23 val24 val25 val26 AUTHFRA_7001 val28 val29
val31 val32 val33 val34 val35 val36 AUTHFRA_7002 val38 val39
然后,您可以创建表 TABLE1 和 TABLE2,并使用 INSERT INTO ... SELECT ... FROM external_ 来填充它们。
-- drop table table1 cascade constraints ;
-- drop table table2 cascade constraints ;
-- authfra: Authorized_FW_Request_Approver
create table table1 (
id number generated always as identity primary key
-- other columns omitted
, authfra varchar2(16 char) unique
-- other columns omitted
);
create table table2 (
-- other columns omitted
authfra varchar2(16 char) references table1( authfra )
-- other columns omitted
);
insert into table1 ( authfra )
select distinct Authorized_FW_Request_Approver
from external_ ;
3 rows inserted.
insert into table2 ( authfra )
select Authorized_FW_Request_Approver
from external_ ;
3 rows inserted.
Table1 / Table2 包含 ...
SQL> select * from table1 ;
ID AUTHFRA
1 AUTHFRA_7000
2 AUTHFRA_7001
3 AUTHFRA_7002
SQL> select * from table2 ;
AUTHFRA
AUTHFRA_7000
AUTHFRA_7001
AUTHFRA_7002
您确定 TABLE1 应该包含第 7 列的唯一值吗?在您的问题中,您提到了一个 PK 专栏,因此,我使用 UNIQUE 来强调这一点。 (我原以为 TABLE2 应该包含唯一的“Authorized_FW_Request_Approver”值,并且 TABLE1 应该有一个外键约束,引用此列)
但是,也许这并不重要。只要您能够从外部表中选择所有必要的数据,填充“目标”表应该不会太困难。