版权声明:本文为博主原创文章,于2023年7月6日首发于CSDN,转载请附上原文出处链接和本声明。本文链接:https://blog.csdn.net/u011046671/article/details/131578422
一、基础环境
操作系统:Windows 或 Linux
数据库版本:Oracle Database 11.2.0.1.0 及以上版本
二、适用场景
当我们使用 insert into select 语句迁移数据的时候,两个表的某个字段类型不一致,select 语句中使用了to_number() 函数进行了格式转换,在迁移过程中报:ORA-01772:无效数字 的错误。由于数据量巨大,无法使用肉眼进行查找定位,因此我使用存储过程编写了以下的检测脚本。
二、操作步骤
在使用过程中需要根据实际情况替换以下变量:(本来打算把表名和字段名作为传入参数传入的,但是这样执行效率太低,因此使用查找替换功能直接替换。)
table_name 数据表名
v_id 数据表的主键或唯一标识方便定位问题数据
num_vulue 需要转换为数值格式的字段名称
create or replace procedure check_data_format(v_error_code out varchar2,
v_error_text out varchar2) is
v_id varchar2; --表中的唯一标识,根据表中的字段类型修改此处的字段类型
v_num number; --存储转换后的数值变量
begin
v_error_code := '0';
v_error_text := '成功完成';
for v in (select id from table_name) loop
select id
into v_id
from table_name t
where t.id = v.id;
select to_number(num_vulue)
into v_num
from table_name t
where t.id = v.id;
end loop;
exception
when others then
v_error_code := sqlcode;
v_error_text := 'id为' || v_id || '的数据格式转换出现错误:' || sqlerrm;
dbms_output.put_line('错误代码:' || sqlcode);
dbms_output.put_line('错误详情:' || sqlerrm);
dbms_output.put_line('出错行号:' || dbms_utility.format_error_backtrace());
rollback;
end check_data_format;
/
创建完成之后,右键单击该存储过程,然后点击【测试】进行测试,根据返回的错误信息进行修正数据,修正完成后继续测试,直至返回【成功完成】为止。
版权声明:本文为博主原创文章,于2023年7月6日首发于CSDN,转载请附上原文出处链接和本声明。本文链接:https://blog.csdn.net/u011046671/article/details/131578422
版权声明:本文为u011046671原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。