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
--查询数据库中所有的字段类型为NCHAR的字段,并放入tableData中,数据量过大勿用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
--循环开始,赋值
tableName := tableData.Table_Name;
columnName := tableData.Column_Name;
dataLength := tableData.Data_Length/2;
--dbms_output.put_line(tableName ||'++'||columnName ||'++'||dataLength);
--sql字符串使用||进行变量拼接(修改存在数据的字段类型,需要新加字段进行调换)
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;
--循环结束
end loop;
commit;
end updateDataType;