如何使用外部 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 应该不会太困难。