繁体   English   中英

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

[英]Loading CSV file data into a Table Variable (Index-by table) in Oracle

我的要求是我需要读取 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)) 的列,我需要使用新的派对 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 中, 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*Loader

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

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

这假设已预先完成以下设置:

  • 已安装 Oracle 客户端(包括 SQL*Loader)
  • sqlldr.exe在路径中,或者使用了可执行文件的绝对路径
  • 您已经配置了数据库连接 ( 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/

暂无
暂无

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

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