如何获取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可以帮助找到失败的列? 有没有更好的手工方式来快速找到它?