如何使用外部表在oracle中加载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

我想使用外部表将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,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。我将加载数据,然后对其进行验证。有时它将被加载,并将是最终的,有时现有表中的数据将被替换