2015-12-17 2 views
0

, выполнив следующую команду в SQL Developer:Oracle "ORA-00932: несовместимые типы данных: ожидаемое число получил TIMESTAMP" на INSERT INTO, но не ВЫБРАТЬ

insert into table2 
select * 
from table1 
where id_ in (select fileid 
       from table3 
       where status in ('DELETED', 'TODELETE') 
       and softdeletedate < to_date('11/08/2015 01:00:00 AM', 'mm/dd/yyyy hh:mi:ss AM')) 
and id_ not in (select id_ from table2); 

Результаты в этой ошибки:

ORA-00932: inconsistent datatypes: expected NUMBER got TIMESTAMP

Если я удаляю первую часть (insert into table2), команда select работает нормально и, как ожидается, не возвращает никаких записей.

Таблица 1 и таблица2 имеют более 70 столбцов VARCHAR2, TIMESTAMP и NUMBER.

Таблица 1 и таблица2 создаются APP, который проходит через столбцы table1 и создает таблицу2, единственное отличие состоит в том, что таблица1 имеет много индексов, а таблица2 имеет единственный индекс.

Я проверил, что таблица1 и таблица2 имеют одинаковые точные столбцы и типы данных. Однако вывод «desc table1» и «desc table2» перечисляет столбцы в другом порядке, но все они соответствуют.

Когда я запускаю команду на других таблицах, которые были созданы аналогичным образом, но имеют меньше столбцов (они все еще имеют одинаковые типы столбцов), вставка работает и не отображает ошибки. Запуск команды «desc» в отношении этих таблиц перечисляет столбцы в том же порядке.

Я прошел через многие поисковые запросы Google, но не смог найти ответ. Моя версия Oracle - 11g.

Любая идея, почему эта ошибка возвращена и как ее обойти?

ответ

1

Вы говорите, что ваши две таблицы имеют одинаковые столбцы, но не в том же порядке - это, скорее всего, будет причиной вашей проблемы, поскольку, если вы не укажете сами столбцы, вы полагаетесь на упорядочение столбцов по умолчанию (например, первый столбец таблицы1 будет соответствовать первому столбцу таблицы2 и т. д.). Если ваши порядки столбцов в обеих таблицах не совпадают, не удивляйтесь, когда сталкиваетесь с такими проблемами, как конфликтующие типы данных!

Если бы я был вами, я бы прямо указывал выбранные и вставленные столбцы, а не полагался на упорядочение столбцов по умолчанию.

Таким образом, это должно выглядеть примерно так:

insert into table2 (id_, 
        other_col_1, 
        other_col_2, 
        ...) 
select id_, 
     other_col_1, 
     other_col_2, 
     ... 
from table1 
where id_ in (select fileid 
       from table3 
       where status in ('DELETED', 'TODELETE') 
       and softdeletedate < to_date('11/08/2015 01:00:00 AM', 'mm/dd/yyyy hh:mi:ss AM')) 
and id_ not in (select id_ from table2); 
+1

Я пошел бы дальше, чем даже просто * * предполагая явные имена столбцов. Каждый раз, когда вы: а) заботитесь о порядке столбцов и б) используйте 'select * from ...' для получения столбцов в неявном порядке - это ошибка, ожидающая только того, что произойдет. Он * может * не укусить вас сегодня или даже вообще, но это очень хрупкая и плохая идея. – Gerrat

+0

Благодарим вас за очень быстрый ответ. Указание столбцов явно заботится об этой проблеме. – user3722575

Смежные вопросы