我有一个包含ID和其他几列的CSV文件。我在oracle中也有一个表,其中ID标识一行。如何使用CSV文件中的值最好地替换表中的值,同时保持其他列的方式与之前的方式相同?
这必须使用oracle本身提供的工具(即PL / SQL或SQL脚本)来完成,我不能使用“真正的”脚本语言(Python,...)或“真正的”程序。
谢谢, 托马斯
答案 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;
我认为它会起作用