【问题标题】:How to load CSV data into Oracle table that has more columns than the csv file?如何将 CSV 数据加载到列数多于 csv 文件的 Oracle 表中?
【发布时间】:2012-04-03 08:18:49
【问题描述】:

我有一个 .csv 文件,其中仅包含表中某些列的数据。如何将该 .csv 导入表中,而其他列保持不变(或设置 NULL 值)?

最初,该表与 .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 中的列呢?

【问题讨论】:

标签: sql oracle csv loader


【解决方案1】:

您无需做任何事情。

只会发送文件中的列值。

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

不确定保持其他列不变是什么意思,因为 SQL*Loader 将插入新行,没有什么可以“保持不变”。

【讨论】:

  • 你是对的......“保持其他列完好无损”真的没有意义......它就像你说的那样工作,问题是触发器没有正确定义...... . 谢谢 :P
【解决方案2】:

你也可以使用 awk。

这里有一个详细的示例,说明如何根据 CSV 文件中的值编写 SQL 查询。

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

[oracle@myora ~]$ 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
[oracle@myora ~]$

[oracle@myora ~]$ 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

[oracle@myora ~]$ 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′));
[oracle@myora ~]$

[oracle@myora ~]$ sqlplus myuser/mypwd@myinst

SQL> @RunMe.sql

…

1 row created.

1 row created.

1 row created.

1 row created.

1 row created.

SQL> commit;

Commit complete.

SQL> exit

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-26
    • 2019-11-19
    • 2013-07-29
    • 2015-03-21
    • 2021-10-02
    相关资源
    最近更新 更多