EDB-Loader 工具的簡單範例
Brandon
相仿 Oracle 的 SQL*Loader 工具,是EDB 用來載入大筆資料的工具。
設置方式幾乎與 SQL*Loader 一樣,一樣是設置 Control File,藉此載入 csv 資料進資料庫。
以下將在 EDB 10 以及 Oracle XE 11 使用一樣的 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 |
下面是 EDB 使用的 Control File, demo.ctl 這個資料包含一個沒有值的格子,需要下面的 Control file 設定才能運作。
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~
參考資料
EDB Postgres Advanced Server 10.0 Database Compatibility for Oracle Developers Tools and Utilities Guide / 2 EDB*Loader
比較 Oracle SQL*Loader:sql loader 用法 – Google 搜尋
類似工具: pg_bulkload pgloader