因數據庫遷移,須要將原oracle備份文件導入新的oracle數據庫中,EXP導出後,IMP報錯,發現字符串長度太長報錯。查找後發現,原數據庫爲GBK字符集(oracle在varchar2類型中一個漢字佔用兩位),新數據庫爲UTF8字符集(一個漢子佔用三位)。數據庫
解決方法以下,將原數據庫全部含varchar2的字段的長度批量修改。oracle
修改分爲兩步,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;test
注意:若存在字段的函數索引,批量修改會報錯需將函數索引刪除,纔可執行。方法
最後,導出dmp,而後IMP導入便可。數據