0

在 SQL Developer 中运行以下命令:

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: 不一致的数据类型: 预期 NUMBER 得到了 TIMESTAMP

如果我删除第一部分 ( insert into table2),则 select 命令运行良好,并且如预期的那样不会返回任何记录。

Table1 和 table2 有 70 多列 VARCHAR2、TIMESTAMP 和 NUMBER。

表 1 和表 2 是由一个 APP 创建的,它遍历表 1 的列并创建表 2,唯一的区别是表 1 有许多索引,而表 2 有一个索引。

我已经验证 table1 和 table2 具有完全相同的列和数据类型。但是,“desc table1”和“desc table2”的输出以不同的顺序列出了列,但它们都匹配。

当我在以类似方式创建但列较少(它们仍然具有相同列类型)的其他表上运行该命令时,插入工作并且不显示错误。对这些表运行“desc”命令以相同的顺序列出列。

我通过谷歌搜索了很多错误,但找不到答案。我的 Oracle 版本是 11g。

知道为什么会返回此错误以及如何解决它吗?

4

1 回答 1

1

您说您的两个表具有相同的列,但顺序不同 - 这很可能是您的问题的原因,因为如果您不自己指定列,则您依赖于默认的列排序(例如,table1 的第一个 col 将匹配 table2 的第一个 col,等等)。如果您在两个表中的列顺序不匹配,那么当您遇到诸如冲突数据类型之类的问题时不要感到惊讶!

如果我是你,我会明确说明选择和插入的列,而不是依赖默认的列顺序。

所以,它应该看起来像:

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);
于 2015-12-17T17:07:30.183 回答