設置方式幾乎與 SQL*Loader 一樣,一樣是設置 Control File,藉此載入 csv 資料進資料庫。
以下將在 EDB 以及 Oracle XE 使用一樣的 Control File 以及資料,對照 Loader 的使用指令。
一份表格的 SQL,在 EDB 與 Oracle 通用:
create table testtab( myin int PRIMARY KEY, str varchar2(1000), mylabel int );
把表格建立到 EDB 跟 Oracle 裡面,下面就開始匯入資料。
首先,先有一份 csv 資料以及欄位,並設置 Control File,最後執行指令即可。
以下資料,放在 CSV 文字檔裡面,命名為 demo.csv
1,"apple",10 2,"apple2",10 3,"book", 4,"banana",20 5,"banana2",20
這個資料包含一個沒有值的格子,需要下面的 Control file 設定才能運作。
下面是 EDB 使用的 Control File, demo.ctl
LOAD DATA INFILE 'demo.csv' BADFILE 'emp_fixed.bad' APPEND INTO TABLE testtab FIELDS TERMINATED BY "," OPTIONALLY ENCLOSED BY '"' TRAILING NULLCOLS ( myin, str, mylabel )
裡面幾個非必要修飾詞,如 append(指定資料累加到表格裡面),trailing nullcols(允許 csv 最末一欄沒有值的資料)。大致上跟 Oracle SQL*Loader 差不多。下面也會直接套用在 Oracle XE 裡面。
接著就載入資料:在這裡用上面的檔案,分別在 EDB 與 Oracle 上執行
EDB:
bash-$ source /opt/edb/as10/pgplus_env.sh bash-$ edbldr -h localhost -p 5444 -d edb USERID=enterprisedb/password CONTROL=/your/path/demo.ctl EDB*Loader: Copyright (c) 2007-2017, EnterpriseDB Corporation. Successfully processed (5) records bash-$Oracle:
bash-$ sqlldr userid/password@tnsname control=/your/path/demo.ctl SQL*Loader: Release 11.2.0.2.0 - Production on Fri Jan 26 09:47:02 2018 Copyright (c) 1982, 2009, Oracle and/or its affiliates. All rights reserved. ORA-28002: the password will expire within 7 days Commit point reached - logical record count 6 bash-$
兩者都匯入成功。查看一下
EDB:
edb=# select * from testtab; myin | str | mylabel ------+---------+--------- 1 | apple | 10 2 | apple2 | 10 3 | book | 4 | banana | 20 5 | banana2 | 20 (5 rows) edb=#Oracle:
SQL> select * from testtab; MYIN ---------- STR -------------------------------------------------------------------------------- MYLABEL ---------- 1 apple 10 2 apple2 10 MYIN ---------- STR -------------------------------------------------------------------------------- MYLABEL ---------- 3 book 4 banana MYIN ---------- STR -------------------------------------------------------------------------------- MYLABEL ---------- 20 5 banana2 20 SQL>
我們可以看到,Oracle 的 SQL*Loader 使用的流程幾乎可以無須調整,便能在 EnterpriseDB 企業版的 EDB*Loader 執行。
在此提醒一點,EDB*Loader 不可以跨版本使用,只可以對相同版本的資料庫匯入。
最後來看看原生的 Postgres 如何使用內建的 COPY 指令載入資料。不過這指令要求檔案要在資料庫主機上面,因為該指令會透過資料庫服務的 OS 帳號去讀檔案:
COPY testtab FROM '/your/full/path/demo.csv' WITH (FORMAT csv , DELIMITER ',' , NULL '' , HEADER false , QUOTE '"');
這個指令有一些 CSV 的設定選項,例如分隔符號、檔案編碼之類的,詳情可以到手冊頁面查看。
此外,使用 COPY 指令時,記得要把「最後一行 Enter」拿掉!!不然會匯入失敗的
edb=# -- 注意檔案最後多空一行
edb=# \! cat /your/full/path/demo.csv
1,"apple",10
2,"apple2",10
3,"book",
4,"banana",20
5,"banana2",20
edb=# COPY testtab FROM '/your/full/path/demo.csv'
WITH (FORMAT csv ,
DELIMITER ',' ,
NULL '' ,
HEADER false ,
QUOTE '"');
ERROR: missing data for column "str"
CONTEXT: COPY testtab, line 6: ""
edb=#
上面出現神秘的檔案第六行,就是多一個 Enter 造成的。不過這個不影響 EDB*Loader~
參考資料
比較 Oracle SQL*Loader:sql loader 用法 - Google 搜尋
類似工具:
沒有留言:
張貼留言