【发布时间】:2017-02-26 16:42:40
【问题描述】:
我的要求是我需要读取 CSV 文件数据并使用数据库中的一个现有表对其进行查询以更新一些记录。我认为一种方法是创建一个新表(temp)并将 CSV 文件加载到该表中并使用现有表进行查询,但我发现我没有创建新表或目录的权限(对于外部表接近)。
然后我想通过表变量来执行此操作,但我不知道如何将数据加载到表变量中。我写了以下查询,但它说
'无效的表名'
DECLARE
TYPE t IS TABLE OF VARCHAR2(15);
UPDATEPARTYID t;
BEGIN
SELECT *
BULK COLLECT INTO UPDATEPARTYID
FROM 'C:\Test\PartyID.csv';
END;
我以前在 Sql Server 上工作,所以对 Oracle 不太满意。我正在使用 Sql Developer 和 Oracle11g,.csv 文件中有数百万条记录。任何帮助,将不胜感激。
更新:
输入文件的结构:
OldID,NewID
015110044200015,099724838000015
069167641100015,099724838000015
016093943300015,099728485000015
033264160300015,099728485000015
035968914300015,099728485000015
087580324300015,099728485000015
现有表中有一个名为 PartyID (Varchar2(15)) 的列,我需要使用与输入文件的 OldID 匹配的新派对 ID 更新这些 ID。
新目标表的结构为:
From Party ID (Varchar2 15)
To Party ID (Varchar2 15)
Created Date Sysdate
Updated Date Sysdate
Status Char (1) S: Success, F: Failure
No.Of Tries Integer(3) Default value 0
如果尝试次数超过 3 次,则将其标记为失败。
【问题讨论】:
-
我建议使用最多 3 或 4 行的 csv 文件开始。
-
如果您可以让某人为您创建一个临时表来存储数据,您最好的选择可能是使用 Oracle 的 SQL*Loader 实用程序来批量加载数据,之后您可以更新目标表.
-
如果表中不存在记录,是插入还是不执行任何更新?无论哪种方式,@MickMnemonic 的建议都是可行的。如果你不能这样做,Oracle 确实有一些不错的 Oracle 批量更新功能。不过,首先了解您的约束条件会有所帮助。
-
@MickMnemonic 是的,Mick 我已经要求管理员创建一个临时表,以便我可以使用 SQL*Loader。谢谢。
-
@Hambone 在这种情况下,我不执行任何更新。感谢您的评论。我正在按照米克的建议去做。
标签: c# sql oracle oracle11g table-variable