使用CSV文件中的值更新Oracle表

时间:2009-12-23 13:08:48

标签: sql oracle plsql csv import

我有一个包含ID和其他几列的CSV文件。我在oracle中也有一个表,其中ID标识一行。如何使用CSV文件中的值最好地替换表中的值,同时保持其他列的方式与之前的方式相同?

这必须使用oracle本身提供的工具(即PL / SQL或SQL脚本)来完成,我不能使用“真正的”脚本语言(Python,...)或“真正的”程序。

谢谢, 托马斯

5 个答案:

答案 0 :(得分:10)

查看Oracle doc中的EXTERNAL TABLES。您可以将csv文件复制到Oracle服务器上,让Oracle将其作为“正常”表格显示在其上,您可以在其中运行查询。

然后问题只是将数据从一个表复制到另一个表。

外部表对于处理这样的数据加载非常有用。

答案 1 :(得分:5)

用于将CSV类型数据文件加载到数据库中的“标准”Oracle工具是SQLLoader。它通常用于插入记录,但控制文件可以配置为运行更新,如果这是你想要的。

这不是世界上最容易使用的工具(阅读“这是一个痛苦的屁股”),但它是标准工具包的一部分,它完成了这项工作。

答案 2 :(得分:1)

另一种选择是逐行读取文件,使用REGEXP_REPLACE之类的内容解析行中的字段,并更新相应的行。您可以解析逗号分隔的字符串,如下所示:

SELECT TRIM(REGEXP_REPLACE(strLine, '(.*),.*,.*', '\1')),
       TRIM(REGEXP_REPLACE(strLine, '.*,(.*),.*', '\1')),
       TRIM(REGEXP_REPLACE(strLine, '.*,.*,(.*)', '\1'))
  INTO strID, strField1, strField2      FROM DUAL;

如果您的网站不允许使用外部表,这非常有用。

分享并享受。

答案 3 :(得分:1)

使用SQL * Loader

sqlldr username@server/password control=load_csv.ctl

load_csv.ctl文件

load data
 infile '/path/to/mydata.csv'
 into table mydatatable
 fields terminated by "," optionally enclosed by '"'          
 ( empno, empname, sal, deptno )

其中 /path/to/mydata.csv 是您需要加载的CSV文件的路径,在Windows上 比如 C:\ data \ mydata.csv 。表名是 mydatatable 。这些列按顺序列在最后一行的csv文件中。

除非您拥有非常大量的数据,否则这是最容易维护的数据获取方式 如果需要定期加载数据,可以将其加载到shell脚本中,并由UON NX系统上的CRON运行。

答案 4 :(得分:-7)

首先创建一个表并将所有CSV数据放入该表中,然后编写一个游标以使用与ID对应的CSV创建表更新您的oracle表

create table t

然后将CSV数据导入此表。

现在写一个光标

declare
cursor c1 is
select * from t1;
begin
update Oracle table
set
t1.Column=t2.column
where t1.id=t2.id;

我认为它会起作用