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

  • Post author:
  • Post category:其他


版权声明:本文为博主原创文章,于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 版权协议,转载请附上原文出处链接和本声明。