業務增長導致 VARCHAR2(4000) 不敷使用,需轉為 CLOB。直接 ALTER TABLE ... MODIFY col CLOB 會報 ORA-22858。本文提供三種適用不同場景的解決方案。
CREATE TABLE TB_WITHOUT_DATA (ID NUMBER, NAME VARCHAR2(100), DESCRIPTION VARCHAR2(2000)); CREATE TABLE TB_WITH_DATA (ID NUMBER, NAME VARCHAR2(100), DESCRIPTION VARCHAR2(2000)); INSERT INTO TB_WITH_DATA VALUES (1, 'David', 'Short text'); COMMIT;
ALTER TABLE TB_WITHOUT_DATA MODIFY DESCRIPTION LONG; ALTER TABLE TB_WITHOUT_DATA MODIFY DESCRIPTION CLOB;
限制:有資料時執行第一步會報 ORA-01439: column to be modified must be empty。
-- 1. 重命名 ALTER TABLE TB_WITH_DATA RENAME COLUMN DESCRIPTION TO DESCRIPTION_BAK; ALTER TABLE TB_WITHOUT_DATA RENAME COLUMN DESCRIPTION TO DESCRIPTION_BAK; -- 2. 新增 CLOB 欄 ALTER TABLE TB_WITH_DATA ADD DESCRIPTION CLOB; ALTER TABLE TB_WITHOUT_DATA ADD DESCRIPTION CLOB; -- 3. 複製資料 (有資料表才需) UPDATE TB_WITH_DATA SET DESCRIPTION = DESCRIPTION_BAK; COMMIT; -- 4. 刪除備份欄 ALTER TABLE TB_WITH_DATA DROP COLUMN DESCRIPTION_BAK; ALTER TABLE TB_WITHOUT_DATA DROP COLUMN DESCRIPTION_BAK;
-- 1. 重命名舊表 RENAME TB_WITH_DATA TO TB_WITH_DATA_BAK; RENAME TB_WITHOUT_DATA TO TB_WITHOUT_DATA_BAK; -- 2. 建立新表並轉換 CREATE TABLE TB_WITH_DATA AS SELECT ID, NAME, TO_CLOB(DESCRIPTION) DESCRIPTION FROM TB_WITH_DATA_BAK; CREATE TABLE TB_WITHOUT_DATA AS SELECT ID, NAME, TO_CLOB(DESCRIPTION) DESCRIPTION FROM TB_WITHOUT_DATA_BAK; -- 3. 驗證結構與資料 DESC TB_WITH_DATA; -- DESCRIPTION 應為 CLOB SELECT * FROM TB_WITH_DATA; -- 4. 刪除備份表 DROP TABLE TB_WITH_DATA_BAK; DROP TABLE TB_WITHOUT_DATA_BAK;
DESC TB_WITH_DATA Name Null Type ------------- ---- ------------- ID NUMBER NAME VARCHAR2(100) DESCRIPTION CLOB SELECT * FROM TB_WITH_DATA; ID NAME DESCRIPTION --- ------- ---------------- 1 David Short text