繁体   English   中英

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

[英]Update Oracle table with values from CSV file

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

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

谢谢,托马斯

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

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

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

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

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

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

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

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

分享和享受。

使用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运行系统。

首先创建一个表并将所有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;

我认为它会奏效

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM