create or replace procedure updateDataType is
--定義需要用到的變量
tableName varchar2(200);
columnName varchar2(200);
dataLength number;
sql_1 varchar2(200);
sql_2 varchar2(200);
sql_3 varchar2(200);
sql_4 varchar2(200);
begin
--查詢數(shù)據(jù)庫中所有的字段類型為NCHAR的字段讯檐,并放入tableData中蓄髓,數(shù)據(jù)量過大勿用in
for tableData in (SELECT * FROM user_tab_columns WHERE
TABLE_NAME in (select t.table_name from user_tables t)
and DATA_TYPE = 'NCHAR'
) loop
--循環(huán)開始熊榛,賦值
tableName := tableData.Table_Name;
columnName := tableData.Column_Name;
dataLength := tableData.Data_Length/2;
--dbms_output.put_line(tableName ||'++'||columnName ||'++'||dataLength);
--sql字符串使用||進(jìn)行變量拼接(修改存在數(shù)據(jù)的字段類型讼昆,需要新加字段進(jìn)行調(diào)換)
sql_1 := 'alter table ' ||tableName|| ' rename column '||columnName||' to '||columnName||'_TMP';
--dbms_output.put_line(sql_1);
execute immediate sql_1;
sql_2 := 'alter table '||tableName||' add '||columnName|| ' varchar2('||dataLength||')';
--dbms_output.put_line(sql_2);
execute immediate sql_2;
sql_3 := 'update '||tableName||' set '||columnName||' =trim('||columnName||'_TMP)';
--dbms_output.put_line(sql_3);
execute immediate sql_3;
sql_4 := 'alter table '||tableName||' drop column '||columnName||'_TMP';
--dbms_output.put_line(sql_4);
execute immediate sql_4;
--循環(huán)結(jié)束
end loop;
commit;
end updateDataType;