1

如何获取 ora-01722 的失败列名:插入时数字无效。

我有两张桌子。表 A - 所有一百列都是 varchar2 和表 B 一半 varchar2 另一半数。

table A ( c1 varchar2(100), c2 varchar2(100) ... c100 varchar2(100) )
table B ( c1 number, c2 number .. c49 number, c50 varchar2(100), c51 varchar2(100)  ... c100 varchar2(100) )

需要将表a加载到表b中。映射不是 1 对 1。列名不匹配。插入 b ( c1, c2, c3, c4 .. c50,c51 .. c100 ) 从 a 中选择 to_number(c20) + to_number(c30), to_number(c10), to_number(c80) .. c4, c5 .. c40 .

在 ora-01722 的情况下,手动查找失败的列需要花费大量时间。

所以我尝试了 - 将错误记录到 err$_b ('INSERT') 拒绝限制无限制。它给你失败的行,但不是列。仍然需要手动查找失败的列。帮助不大。

尝试了错误处理,但是当其他人然后 v_ret := DBMS_SQL.LAST_ERROR_POSITION; 时总是得到 0 偏移位置。dbms_output.put_line(dbms_utility.format_error_stack); dbms_output.put_line('偏移位置错误'||v_ret);

我可以使用自定义 is_number 函数在插入之前检查是否为数字。但在这种情况下,我会得到空目标值,不知道源是空的还是数字格式错误。

可以通过运行数据检查来查找失败的行和列来自动化该过程。如果映射是一对一的,那么简单的数据字典查询可以生成报告以显示哪些列将失败。

select 'select col_name, count(*) rc, max(rowid_col) rowid_example from (' from dual union all
select txt from 
(
with s as ( select t.owner, t.table_name, t.column_name, t.column_id 
            from  all_tab_columns s join all_tab_columns t on s.owner =t.owner and s.column_name = t.column_name
            where lower(s.table_name) = 'a' and s.data_type = 'VARCHAR2' and
                  lower(t.table_name) = 'b' and t.data_type = 'NUMBER'     )
select 'select ''' || column_name ||''' col_name, rowid rowid_col, is_number('|| column_name || ') is_number_check from ' || owner ||'.'|| table_name || 
       case when column_id = (select max(column_id) from s ) 
       then ' ) where is_number_check = 0  group by col_name' 
       else ' union all' end txt
from   s order by column_id
) 

如果表列之间没有一对一的映射,则可以定义映射并将其存储到单独的表中,然后运行报表。

是否有更多的 oracle 可以帮助找到失败的列?有没有更好的手动方法可以快速找到它?

4

0 回答 0