我们最近修复了一个问题,即从文本文件中错误地读取字符编码到我们的系统中,方法是确保文件是UTF-8,并且Java代码以UTF-8编码打开这些文件。
然而,我们最终在整个数据库表中添加了大量插入了错误字符的记录,即°F被读取为�F。因此,即使我们现在已经修复了这个问题,我们现在也需要清理数据库表来纠正这种异常。
有没有人能给我建议一下实现这个目标的方法?
发布于 2012-02-21 12:37:50
前段时间我也遇到过类似的问题。幸运的是,受其影响的列数有限,并且这些列在整个数据库中具有相同的名称。
我通过编写一个执行以下操作的脚本解决了这个问题:
更新列表中的所有表
这使用了一种健康的动态SQL,从user_constraints和user_tab_columns中提取数据,过滤我所针对的特定列名。
这里有一个粗略的框架,我只是快速地把它组装在一起,所以它没有经过测试。此外,如果您需要担心触发器,则需要禁用这些触发器:
-- disable constraints
BEGIN
FOR c IN (
SELECT c.owner, c.table_name, c.constraint_name, c.constraint_type
FROM user_constraints c
INNER JOIN user_tables t ON (t.table_name = c.table_name)
AND c.status = 'ENABLED'
AND c.constraint_type NOT IN ('C', 'P')
ORDER BY c.constraint_type DESC
)
LOOP
dbms_utility.exec_ddl_statement('alter table '||c.table_name||' disable constraint ' || c.constraint_name);
END LOOP;
END;
-- do the updates
BEGIN
FOR t IN (
SELECT table_name, column_name
FROM user_tab_columns
WHERE column_name = 'TEMPERATURE'
AND data_type = 'VARCHAR2';
)
LOOP
dbms_utility.exec_ddl_statement('UPDATE '||t.table_name||' SET ' ||t.column_name||' = '||''GOOD VALUE''||' WHERE '||t.column_name||' = '||''BAD VALUE'');
END LOOP;
END;
-- re-enable constraints
BEGIN
FOR c IN (
SELECT c.owner, c.table_name, c.constraint_name, c.constraint_type
FROM user_constraints c
INNER JOIN user_tables t ON (t.table_name = c.table_name)
AND c.status = 'DISABLED'
AND c.constraint_type NOT IN ('C', 'P')
ORDER BY c.constraint_type ASC
)
LOOP
dbms_utility.exec_ddl_statement('alter table '||c.table_name||' enable constraint ' || c.constraint_name);
END LOOP;
END;
/https://stackoverflow.com/questions/9372190
复制相似问题