将 CSV 文件数据加载到 Oracle 中的 Table 变量(按 table 索引)
Loading CSV file data into a Table Variable (Index-by table) in Oracle
我的要求是我需要读取 CSV 文件数据并使用数据库中现有的 table 查询它以更新一些记录。我认为一种方法是创建一个新的 table (temp) 并将 CSV 文件加载到该 table 中并使用现有的 table 进行查询,但我发现我没有权限创建一个新的 table 或目录(对于外部 table 方法)。
然后我想通过一个 table 变量来做到这一点,但我不知道如何将数据加载到 table 变量中。我写了以下查询,但它说
'invalid table name'
DECLARE
TYPE t IS TABLE OF VARCHAR2(15);
UPDATEPARTYID t;
BEGIN
SELECT *
BULK COLLECT INTO UPDATEPARTYID
FROM 'C:\Test\PartyID.csv';
END;
我曾经在 Sql 服务器上工作,所以对 Oracle 不太满意table。我正在使用 Sql Developer 和 Oracle11g,.csv 文件中有数百万条记录。任何帮助,将不胜感激。
更新:
输入文件的结构:
OldID,NewID
015110044200015,099724838000015
069167641100015,099724838000015
016093943300015,099728485000015
033264160300015,099728485000015
035968914300015,099728485000015
087580324300015,099728485000015
现有 table 中有一个名为 PartyID (Varchar2(15)) 的列,我需要用新的参与方 ID 更新这些 ID,这些 ID 与输入文件的 OldID 匹配。
新目标的结构table将是:
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 utility is a good choice. The software is included in the Oracle client installation (which you can download for example here)。
设置
假设您要将数据导入具有结构
的目标table (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
您可以使用包含以下内容的 control file:
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
在路径中,或者使用了executable的绝对路径
- 您已通过 Oracle 的网络配置助手或手动提供
tnsnames.ora
文件并设置 TNS_ADMIN
环境变量(示例 here)
默认情况下,只有在处理完整个文件后才会提交事务。如果你想提交例如每 1000 行,您可以使用 ROWS
选项来执行此操作:
sqlldr username/pw@db_connection control=/path/to/control_file.ctl ROWS=1000
另一种只使用 C# 的方法:
使用 SQLBulkCopy 将 CSV 文件中的批量数据插入数据库 Table Class
https://www.c-sharpcorner.com/article/insert-bulk-data-from-csv-file-to-database-table-using-sqlbu/
我的要求是我需要读取 CSV 文件数据并使用数据库中现有的 table 查询它以更新一些记录。我认为一种方法是创建一个新的 table (temp) 并将 CSV 文件加载到该 table 中并使用现有的 table 进行查询,但我发现我没有权限创建一个新的 table 或目录(对于外部 table 方法)。
然后我想通过一个 table 变量来做到这一点,但我不知道如何将数据加载到 table 变量中。我写了以下查询,但它说
'invalid table name'
DECLARE
TYPE t IS TABLE OF VARCHAR2(15);
UPDATEPARTYID t;
BEGIN
SELECT *
BULK COLLECT INTO UPDATEPARTYID
FROM 'C:\Test\PartyID.csv';
END;
我曾经在 Sql 服务器上工作,所以对 Oracle 不太满意table。我正在使用 Sql Developer 和 Oracle11g,.csv 文件中有数百万条记录。任何帮助,将不胜感激。
更新:
输入文件的结构:
OldID,NewID
015110044200015,099724838000015
069167641100015,099724838000015
016093943300015,099728485000015
033264160300015,099728485000015
035968914300015,099728485000015
087580324300015,099728485000015
现有 table 中有一个名为 PartyID (Varchar2(15)) 的列,我需要用新的参与方 ID 更新这些 ID,这些 ID 与输入文件的 OldID 匹配。
新目标的结构table将是:
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 utility is a good choice. The software is included in the Oracle client installation (which you can download for example here)。
设置
假设您要将数据导入具有结构
的目标table (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
您可以使用包含以下内容的 control file:
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
在路径中,或者使用了executable的绝对路径- 您已通过 Oracle 的网络配置助手或手动提供
tnsnames.ora
文件并设置TNS_ADMIN
环境变量(示例 here)
默认情况下,只有在处理完整个文件后才会提交事务。如果你想提交例如每 1000 行,您可以使用 ROWS
选项来执行此操作:
sqlldr username/pw@db_connection control=/path/to/control_file.ctl ROWS=1000
另一种只使用 C# 的方法:
使用 SQLBulkCopy 将 CSV 文件中的批量数据插入数据库 Table Class
https://www.c-sharpcorner.com/article/insert-bulk-data-from-csv-file-to-database-table-using-sqlbu/