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

时间:2017-10-04 19:04:57

标签: oracle insert-into ora-01722

如何获取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')拒绝限制无限制。 它为您提供了失败的行,但不是列。 仍需要手动查找失败的列。没什么帮助。

尝试了错误处理,但总是得到0偏移位置         当别人的时候例外         v_ret:= DBMS_SQL.LAST_ERROR_POSITION;         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可以帮助找到失败的列? 有没有更好的手工方式来快速找到它?

0 个答案:

没有答案