2012-04-03 104 views
2

我有一个.csv文件,其中只包含表中某些列的数据。如何将.csv导入到表中,使其他列保持原样(或设置NULL值)?如何将CSV数据加载到比csv文件列多的Oracle表中?

最初的表有相同的列.csv文件,我就是用这个SQL装载机:

LOAD DATA 
INFILE '"Path"/file.csv' 
APPEND 
INTO TABLE MY_TABLE 
FIELDS TERMINATED BY ';' OPTIONALLY ENCLOSED BY '"' 
(
    COLUMN1, 
    COLUMN2, 
    COLUMN3, 
    COLUMN4, 
    COLUMN5 
) 

但后来我不得不添加表需要与数据更新一些列其他表,并且当从初始列的.csv插入数据时,我想更新它们(使用触发器)。那么如何在表格中导入.csv中的列?

+0

你可以在这里使用一个外部表像这样的例子:https://forums.oracle.com/forums/thread.jspa?threadID=545565 – Ollie 2012-04-03 08:21:59

回答

3

没有什么需要做的。

只发送文件中的列值。

当插入行时,其他列将获得其默认值(通常为NULL,但取决于列定义)。

不知道你的意思与留下其他列的完整,如使用SQL * Loader将插入新行,没有什么是“原封不动”。

+0

你是对的......它并没有真正做感觉“离开其他列完好无损”......它就像你说的那样工作,问题是没有正确定义触发器......谢谢:P – zetordie 2012-04-03 08:31:09

0

你也可以使用awk。

以下是有关如何根据CSV文件中的值组合SQL查询的详细示例。

SQL> create table MY_TABLE(a varchar2(100), b varchar2(100)); 

[[email protected] ~]$ tail Some_Input_CSV_file 
Some Data A 1,Some Data B 1 
Some Data A 2,Some Data B 2 
Some Data A 3,Some Data B 3 
Some Data A 4,Some Data B 4 
Some Data A 5,Some Data B 5 
Some Data A 6,Some Data B 6 
Some Data A 7,Some Data B 7 
Some Data A 8,Some Data B 8 
Some Data A 9,Some Data B 9 
Some Data A 10,Some Data B 10 
[[email protected] ~]$ 

[[email protected] ~]$ cat Some_Input_CSV_file | awk -F, ‘ { printf(“insert into MY_TABLE values(trim(\x27%s\x27), trim(\x27%s\x27));\n”, $1, $2); } ‘ > RunMe.sql 

[[email protected] ~]$ tail RunMe.sql 
insert into MY_TABLE values(trim(‘Some Data A 1′), trim(‘Some Data B 1′)); 
insert into MY_TABLE values(trim(‘Some Data A 2′), trim(‘Some Data B 2′)); 
insert into MY_TABLE values(trim(‘Some Data A 3′), trim(‘Some Data B 3′)); 
insert into MY_TABLE values(trim(‘Some Data A 4′), trim(‘Some Data B 4′)); 
insert into MY_TABLE values(trim(‘Some Data A 5′), trim(‘Some Data B 5′)); 
insert into MY_TABLE values(trim(‘Some Data A 6′), trim(‘Some Data B 6′)); 
insert into MY_TABLE values(trim(‘Some Data A 7′), trim(‘Some Data B 7′)); 
insert into MY_TABLE values(trim(‘Some Data A 8′), trim(‘Some Data B 8′)); 
insert into MY_TABLE values(trim(‘Some Data A 9′), trim(‘Some Data B 9′)); 
insert into MY_TABLE values(trim(‘Some Data A 10′), trim(‘Some Data B 10′)); 
[[email protected] ~]$ 

[[email protected] ~]$ sqlplus myuser/[email protected] 

SQL> @RunMe.sql 

… 

1 row created. 

1 row created. 

1 row created. 

1 row created. 

1 row created. 

SQL> commit; 

Commit complete. 

SQL> exit