2009-12-23 73 views
7

我有一個CSV文件,其中包含一個ID和其他幾列。我在oracle中也有一個表,標識一行。我怎樣才能最好地使用CSV文件中的值替換表中的值,同時保持其他列以前的樣式?使用CSV文件中的值更新Oracle表

這需要使用oracle本身提供的工具(即PL/SQL或SQL腳本)完成,我不能使用「真正的」腳本語言(Python,...)或「真實」的程序。

感謝, 托馬斯

回答

10

看看在Oracle文檔外部表。您可以將csv文件複製到Oracle服務器框中,並讓Oracle將其呈現爲可在其上運行查詢的「普通」表。

然後,問題就變成了將數據從一個表複製到另一個表的問題。

外部表格對於處理像這樣的數據加載非常有用。

+0

+1。 * EXTERNAL TABLE *是關鍵。請點擊此處http://download.oracle.com/docs/cd/B10501_01/server.920/a96652/ch11.htm#1007030來加載數據。 – Guru 2009-12-23 13:38:47

1

另一種選擇是逐行讀入文件,使用類似於REGEXP_REPLACE的方式解析行中的字段,並更新相應的行。您可以解析逗號分隔的字符串,如下所示:

SELECT TRIM(REGEXP_REPLACE(strLine, '(.*),.*,.*', '\1')), 
     TRIM(REGEXP_REPLACE(strLine, '.*,(.*),.*', '\1')), 
     TRIM(REGEXP_REPLACE(strLine, '.*,.*,(.*)', '\1')) 
    INTO strID, strField1, strField2  FROM DUAL; 

如果您的站點不允許使用外部表,這非常有用。

分享和享受。

5

用於將CSV型數據文件加載到數據庫中的「標準」Oracle工具是SQLLoader。它通常用於插入記錄,但是可以將控制文件配置爲運行更新,如果這是您的願望。它不是世界上最簡單的工具(閱讀「它是一個痛苦的屁股」),但它是標準工具包的一部分,它可以完成這項工作。

+0

外部表也是「標準」,比SQL-Loader更靈活。首先,它們更快,因爲您實際上並不需要將數據加載到Oracle中才能訪問。它以一種可以使用普通SQL的方式呈現。 – CMG 2009-12-23 13:34:04

1

使用SQL *裝載機

sqlldr [email protected]/password control=load_csv.ctl 

的load_csv.ctl文件

load data 
infile '/path/to/mydata.csv' 
into table mydatatable 
fields terminated by "," optionally enclosed by '"'   
(empno, empname, sal, deptno) 

其中/path/to/mydata.csv是路徑,你需要加載CSV文件,在Windows上有些東西 像C:\ data \ mydata.csv。表名是mydatatable。列出這些列以便它們在最後一行的csv文件中顯示。

除非數據量非常大,否則這是獲取數據 英寸的最簡單方法。如果數據需要定期加載,則可以將其加載到shell腳本中並由CRON運行在U * NX系統上。

-7

首先創建一個表,並把所有的CSV數據轉換成表格,然後寫一個光標來更新您的Oracle表與CSV創建對應的ID

create table t 

,然後表將CSV數據導入到此表中。

寫信光標

declare 
cursor c1 is 
select * from t1; 
begin 
update Oracle table 
set 
t1.Column=t2.column 
where t1.id=t2.id; 

我認爲它會工作