在Oracle中将CSV文件数据加载到表变量中(按表索引)

本文关键字:变量 索引 中将 Oracle CSV 文件 加载 数据 | 更新日期: 2023-09-27 18:13:21

我的要求是,我需要读取CSV文件数据,并用数据库中的一个现有表查询它,以更新一些记录。一种方法是创建一个新表(临时表),并将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))的列,我需要用新的party ID更新那些ID,这些ID与输入文件的OldID匹配。

新目标表的结构将是:

  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次,则将其标记为失败

在Oracle中将CSV文件数据加载到表变量中(按表索引)

对于从文本文件加载大量数据到Oracle, SQL*Loader实用程序是一个不错的选择。该软件包含在Oracle客户端安装中(例如,您可以在这里下载)。

置>

假设您正在将数据导入到具有

结构的目标表(target_table)中。
CREATE TABLE target_table (
     from_party VARCHAR2(15) NOT NULL,
     to_party   VARCHAR2(15) NOT NULL,
     created    DATE,
     updated    DATE,
     status     CHAR(1),
     tries      NUMBER(1)
)

,并使用具有以下结构

的两列源数据文件(在路径/path/to/party_import.csv中)
OldID,NewID
015110044200015,099724838000015
069167641100015,099724838000015
016093943300015,099728485000015
033264160300015,099728485000015
035968914300015,099728485000015
087580324300015,099728485000015

可以使用包含以下内容的控制文件:

OPTIONS (SKIP=1)
LOAD DATA
INFILE '/path/to/party_import.csv'
BADFILE 'import.bad'
INSERT
INTO TABLE target_table
fields terminated by ","  TRAILING NULLCOLS
(
  from_party,
  to_party,
  created sysdate
)

运行SQL *装载机

要运行SQL*Loader,可以调用以下命令:

sqlldr username/pw@db_connection control=/path/to/control_file.ctl

这假定事先已经完成了以下设置:

  • Oracle客户端(包括SQL*Loader)已安装
  • sqlldr.exe在path中,或者使用可执行文件的绝对路径
  • 您已经配置了数据库连接(db_connection),可以通过Oracle的Net配置助手或手动提供tnsnames.ora文件并设置TNS_ADMIN环境变量(此处为示例)

默认情况下,只有在处理完整个文件后才提交事务。如果你想每1000行提交一次,你可以使用ROWS选项:

sqlldr username/pw@db_connection control=/path/to/control_file.ctl ROWS=1000

仅使用c#的另一种方法:

使用SQLBulkCopy类从CSV文件插入大容量数据到数据库表

https://www.c-sharpcorner.com/article/insert-bulk-data-from-csv-file-to-database-table-using-sqlbu/