快速定位 ORA-01772_无效数字 的数据


       版权声明:本文为博主原创文章,于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

猜你喜欢

转载自blog.csdn.net/u011046671/article/details/131578422