EDB-Loader 工具的簡單範例

2018.01.26 Docker Containerized Platforms
2018-02-06
EDB Postgres 10 企業版裡面的 Partitioned Table 系統表
2018-02-06

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