因數據庫遷移,需要將原oracle備份文件導入新的oracle數據庫中,EXP導出后,IMP報錯,發現字符串長度太長報錯。查找后發現,原數據庫為GBK字符集(oracle在varchar2類型中一個漢字占用兩位),新數據庫為UTF8字符集(一個漢子占用三位)。
解決方法如下,將原數據庫所有含varchar2的字段的長度批量修改。
修改分為兩步,varchar2最長支持4000的長度,若carchar2長度存在超過2667(4000*2/3)的,可修改為CLOB類型,或者驗證字段中最長的使用長度,若低於2667,調整為4000即可。
批量修改方法如下:
create or replace procedure p_test as
CURSOR TEMP IS
SELECT TABLE_NAME, COLUMN_NAME, ceil(DATA_LENGTH*3/2) DATA_LENGTH
FROM USER_TAB_COLUMNS
WHERE DATA_TYPE = 'VARCHAR2'
and DATA_LENGTH < 2000;
STR VARCHAR2(100) := '';
BEGIN
FOR S IN TEMP LOOP
STR := 'ALTER TABLE ' || S.TABLE_NAME || ' MODIFY(' || S.COLUMN_NAME ||
' VARCHAR2(' || DATA_LENGTH || '))';
DBMS_OUTPUT.PUT_LINE(STR);
EXECUTE IMMEDIATE STR;
END LOOP;
END;
注意:若存在字段的函數索引,批量修改會報錯需將函數索引刪除,才可執行。
最后,導出dmp,然后IMP導入即可。
