如何使用外部表在oracle中加载csv
我想使用外部表将csv加载到oracle中。有1列需要使用FK转换为单独的表 csv如何使用外部表在oracle中加载csv,oracle,external-tables,Oracle,External Tables,我想使用外部表将csv加载到oracle中。有1列需要使用FK转换为单独的表 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,col
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
表1
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)
表2
ID NUMBER(10,0)
SOX_ID NUMBER(10,0)
EMAIL VARCHAR2(50 BYTE)
我希望能够将col
授权FW请求批准人
分离到表2中。这是第七栏。我想使FK表成为1对多关系。表1是PK,表2有FK要使用外部表,您需要创建表和创建任何目录权限。
(示例:Oracle 12c、Linux)。在Oracle中,创建一个目录
SQL> create directory external_tables as '/home/dbuser/datafiles';
Directory created.
Linux(创建示例csv文件)
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。。。选择。。。从外部_uuo填充它们
-- 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
您确定表1应该包含第7列的唯一值吗?在你的问题中,你提到了一个PK专栏,因此,我用UNIQUE来强调这一点。(我原以为表2应该包含唯一的“Authorized_FW_Request_Approver”值,而表1应该有一个外键约束,引用此列)
然而,也许这并不重要。只要能够从外部表中选择所有必要的数据,填充“目标”表就不会太困难 要使用外部表,您需要“创建表”和“创建任何目录”权限。 (示例:Oracle 12c、Linux)。在Oracle中,创建一个目录
SQL> create directory external_tables as '/home/dbuser/datafiles';
Directory created.
Linux(创建示例csv文件)
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。。。选择。。。从外部_uuo填充它们
-- 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
您确定表1应该包含第7列的唯一值吗?在你的问题中,你提到了一个PK专栏,因此,我用UNIQUE来强调这一点。(我原以为表2应该包含唯一的“Authorized_FW_Request_Approver”值,而表1应该有一个外键约束,引用此列)
然而,也许这并不重要。只要能够从外部表中选择所有必要的数据,填充“目标”表就不会太困难 “授权FW请求批准人”在哪里?您所说的“一列需要变成一个表”是什么意思?据我所知,列不会变成表。数据是否始终是外部的,还是这是一个临时表,您可以从中填充两个真实的表?@AlexPoole我希望在遇到其他csv时能够将其用于其他csv。我将加载数据,然后对其进行验证。有时它将被加载并成为最终数据,有时现有表中的数据将被替换。这里是“授权FW请求批准人”?您所说的“列需要转换为表”是什么意思?据我所知,列不会变成表。数据是否始终是外部的,还是这是一个临时表,您可以从中填充两个真实的表?@AlexPoole我希望在遇到其他csv时能够将其用于其他csv。我将加载数据,然后对其进行验证。有时它将被加载,并将是最终的,有时现有表中的数据将被替换