Как получить неверное имя столбца для 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) выбрать 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; 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
)
Если между столбцами таблицы нет сопоставления один к одному, вы можете определить и сохранить сопоставление в отдельной таблице, а затем запустить отчет.
Есть ли что-то еще, что может помочь в поиске неисправной колонки? Есть ли лучшие ручные способы быстро найти его?