簡體   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