需求場景
將 Oracle 資料表資料匯出為可直接執行的 INSERT 敘述腳本,便於異機匯入或版本控管。
SQL*Plus 腳本範例
SET HEADING OFF
SET FEEDBACK OFF
SET PAGESIZE 0
SET LINESIZE 2000
SET TRIMSPOOL ON
SPOOL d:\text.sql
SELECT 'INSERT INTO addrmap(RAW_ADDR, RAW_ADDR_TYPE, MAPPED_ADDR, MAPPED_ADDR_TYPE, STATUS, DESCRIPTION, DISTRICT) VALUES ('''
|| RAW_ADDR || ''','''
|| RAW_ADDR_TYPE || ''','''
|| MAPPED_ADDR || ''','''
|| MAPPED_ADDR_TYPE || ''','''
|| STATUS || ''','''
|| DESCRIPTION || ''','''
|| DISTRICT || ''');'
FROM addrmap;
SPOOL OFF
關鍵設定說明
| 指令 | 作用 |
SET HEADING OFF | 不顯示欄位標題 |
SET FEEDBACK OFF | 不顯示「X rows selected.」 |
SET PAGESIZE 0 | 取消分頁,避免換頁字元 |
SET LINESIZE 2000 | 加大行寬,防止長 INSERT 截斷換行 |
SET TRIMSPOOL ON | 移除輸出行尾空白 |
SPOOL 路徑 | 將後續輸出導向檔案 |
字串串接技巧
- Oracle 用
|| 串接字串
- 單引號跳脫:
'''' 代表字串中的單引號
- NULL 值處理:可用
NVL(欄位, 'NULL') 或 CASE WHEN 欄位 IS NULL THEN 'NULL' ELSE ''''||欄位||'''' END
進階版:處理 NULL 與特殊字元
SELECT 'INSERT INTO addrmap(...) VALUES ('
|| NVL2(RAW_ADDR, ''''||REPLACE(RAW_ADDR, '''', '''''')||'''', 'NULL') || ','
|| NVL2(RAW_ADDR_TYPE, ''''||REPLACE(RAW_ADDR_TYPE, '''', '''''')||'''', 'NULL') || ','
...
|| ');'
FROM addrmap;
REPLACE(欄位, '''', '''''') 將單引號加倍跳脫,NVL2 優雅處理 NULL。
執行與驗證
- SQL*Plus 執行腳本產生
d:\text.sql
- 用文字編輯器檢查前幾行格式正確
- 目標資料庫執行
@d:\text.sql 匯入
優缺點評估