如何使用外部 table 在 oracle 中加载 csv
how to load csv in oracle using external table
我想使用外部 table 将 csv 加载到 oracle 中。有 1 列需要使用 FK 变成单独的 table。
csv
NAME,OPCO,CATEGORY,PRE_APPROVED,PRE_APPROVED_REQUESTEREXT_PRE_APPROVED_REQUESTER,EXT_PRE_APPROVED_REQUESTER,Authorized FW-Request Approver,AUTHORIZED_UPDATE_TEAM_ENTRY,WORK_INSTRUCTIONS_COMMENTS
col1,col2,col3,col4,col5,col6,col7, col8, col9
col1,col2,col3,col4,col5,col6,col7, col8, col9
col1,col2,col3,col4,col5,col6,col7, col8, col9
table1
ID NUMBER(10,0)
NAME VARCHAR2(50 BYTE)
OPCO VARCHAR2(50 BYTE)
CATEGORY VARCHAR2(50 BYTE)
PRE_APPROVED NUMBER(1,0)
PRE_APPROVED_REQUESTER VARCHAR2(20 BYTE)
EXT_PRE_APPROVED_REQUESTER VARCHAR2(20 BYTE)
AUTHORIZED_UPDATE_TEAM_ENTRY VARCHAR2(50 BYTE)
WORK_INSTRUCTIONS_COMMENTS VARCHAR2(2000 BYTE)
table2
ID NUMBER(10,0)
SOX_ID NUMBER(10,0)
EMAIL VARCHAR2(50 BYTE)
我希望能够将列 Authorized FW-Request Approver
与 table2 分开。这是第 7 列。我想让 FK table 所以它是一对多的关系。 table1是PK,table2是FK
要使用外部 tables,您需要 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:外部 table
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'
)
)
/
SELECT 来自外部 table.
-- 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
然后,您可以创建 tables 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.
表 1 / 表 2 包含...
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 应该有外键约束,引用此列)
不过,也许这并不重要。只要您能够 SELECT 来自外部 table 的所有必要数据,填充 "destination" table 应该不会太困难。
我想使用外部 table 将 csv 加载到 oracle 中。有 1 列需要使用 FK 变成单独的 table。
csv
NAME,OPCO,CATEGORY,PRE_APPROVED,PRE_APPROVED_REQUESTEREXT_PRE_APPROVED_REQUESTER,EXT_PRE_APPROVED_REQUESTER,Authorized FW-Request Approver,AUTHORIZED_UPDATE_TEAM_ENTRY,WORK_INSTRUCTIONS_COMMENTS
col1,col2,col3,col4,col5,col6,col7, col8, col9
col1,col2,col3,col4,col5,col6,col7, col8, col9
col1,col2,col3,col4,col5,col6,col7, col8, col9
table1
ID NUMBER(10,0)
NAME VARCHAR2(50 BYTE)
OPCO VARCHAR2(50 BYTE)
CATEGORY VARCHAR2(50 BYTE)
PRE_APPROVED NUMBER(1,0)
PRE_APPROVED_REQUESTER VARCHAR2(20 BYTE)
EXT_PRE_APPROVED_REQUESTER VARCHAR2(20 BYTE)
AUTHORIZED_UPDATE_TEAM_ENTRY VARCHAR2(50 BYTE)
WORK_INSTRUCTIONS_COMMENTS VARCHAR2(2000 BYTE)
table2
ID NUMBER(10,0)
SOX_ID NUMBER(10,0)
EMAIL VARCHAR2(50 BYTE)
我希望能够将列 Authorized FW-Request Approver
与 table2 分开。这是第 7 列。我想让 FK table 所以它是一对多的关系。 table1是PK,table2是FK
要使用外部 tables,您需要 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:外部 table
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'
)
)
/
SELECT 来自外部 table.
-- 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
然后,您可以创建 tables 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.
表 1 / 表 2 包含...
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 应该有外键约束,引用此列)
不过,也许这并不重要。只要您能够 SELECT 来自外部 table 的所有必要数据,填充 "destination" table 应该不会太困难。