USER_VIEWS.TEXT, USER_TRIGGERS.TRIGGER_BODY)。SUBSTR, INSTR, LIKE) —— 這是最大痛點。INSERT ... SELECT 複製。INSERT ... SELECT / CREATE TABLE ... AS SELECT**。NULL/NOT NULL/DEFAULT。LONG RAW 同樣限制)。SUBSTR, INSTR, LENGTH 等皆報錯)。LONG_CHUNK_SIZE 參數。SELECT (但工具常截斷)UPDATE ... SET long_col = '...'INSERT ... VALUES ('...')| 特性 | LONG | CLOB |
|---|---|---|
| 最大長度 | 2 GB | 4 GB ~ 128 TB (視 block size) |
| 單表欄位數 | 1 | 無限制 |
| 索引支援 | 無 | Context/Full Text 索引 |
| 字串函數 | 無 | DBMS_LOB.SUBSTR/INSTR/COMPARE 等完整支援 |
| PL/SQL 變數 | 不可 | 可宣告 CLOB 變數 |
| 分散式查詢 | 不可 | 支援 (DB Link) |
| 工具相容性 | 差 | 優 (SQL*Plus, SQL Developer, JDBC 皆完整支援) |
-- 1. 新增 CLOB 欄位
ALTER TABLE old_table ADD new_clob_col CLOB;
-- 2. 使用 TO_LOB 轉換 (僅限 CREATE TABLE AS SELECT 或 INSERT SELECT)
CREATE TABLE new_table AS
SELECT id, TO_LOB(long_col) AS clob_col, other_cols
FROM old_table;
-- 或 PL/SQL 逐筆搬移 (大表分批 Commit)
DECLARE
CURSOR c IS SELECT rowid, long_col FROM old_table FOR UPDATE;
BEGIN
FOR r IN c LOOP
UPDATE old_table SET new_clob_col = TO_LOB(long_col) WHERE ROWID = r.ROWID;
IF MOD(c%ROWCOUNT, 1000) = 0 THEN COMMIT; END IF;
END LOOP;
COMMIT;
END;
/
-- 3. 驗證後 DROP 原 LONG 欄位
ALTER TABLE old_table DROP COLUMN long_col;
ALTER TABLE old_table RENAME COLUMN new_clob_col TO long_col;
**LONG 是歷史包袱**,Oracle 官方早已標記為 Deprecated。所有新開發**嚴禁使用 LONG**,既有系統應規劃遷移至 CLOB。若必須暫時共存,請封裝 DBMS_LOB 操作介面隔離差異,並建立監控腳本偵測新增 LONG 欄位違規。