【问题标题】:ORA-00932 (inconsistent datatypes: expected - got CLOB) error that I do not understandORA-00932(不一致的数据类型:预期 - 得到 CLOB)错误,我不明白
【发布时间】:2017-04-26 14:44:09
【问题描述】:

我从这样一个查询开始:

    SELECT A.*
      FROM TABLE_A A
INNER JOIN TABLE_B B
        ON A.YEAR = B.YEAR
     WHERE A.ID IN (SELECT ID FROM TABLE_B)

上面的查询给了我重复的记录,所以我添加了DISTINCT关键字:

    SELECT DISTINCT A.*
      FROM TABLE_A A
INNER JOIN TABLE_B B
        ON A.YEAR = B.YEAR
     WHERE A.ID IN (SELECT ID FROM TABLE_B)

第二个查询给了我以下错误:

ORA-00932:不一致的数据类型:预期 - 得到 CLOB

  1. 00000 - “不一致的数据类型:预期的 %s 得到了 %s”

我终于更正了查询并通过将WHERE 子句中的条件移动到INNER JOIN 来消除重复记录,如下所示:

    SELECT A.*
      FROM TABLE_A A
INNER JOIN TABLE_B B
        ON A.YEAR = B.YEAR
       AND A.ID = B.ID

我只是不明白为什么第二个查询不起作用。为什么在这里添加DISTINCT 关键字会突然出现问题?

【问题讨论】:

    标签: sql oracle


    【解决方案1】:

    不是特别亮眼的错误信息,而是因为the restrictions on LOBs,其中有:

    • 您不能在查询的 ORDER BY 子句、查询的 GROUP BY 子句或聚合函数中指定 LOB 列。

    • 您不能在 SELECT...DISTINCT 或 SELECT...UNIQUE 语句或连接中指定 LOB 列。但是,您可以在 SELECT...DISTINCT 语句、使用 UNION 的查询或 MINUS 集合运算符中指定对象类型列的 LOB 属性(如果该列的对象类型上定义了 MAP 或 ORDER 函数) .

    你会遇到第二个,但第一个也会时不时出现。

    你可以用类似的东西来伪造同样的情况:

    SQL> select distinct col from (select to_clob('test') as col from dual);
    
    ERROR at line 1:
    ORA-00932: inconsistent datatypes: expected - got CLOB
    

    如果您仅列出非 CLOB 列,则可以使用 distinct,而不是使用 A.*,后者包括来自 table_a 的 CLOB 列。

    You can work around this,但纠正查询以消除重复项是正确的做法。必须将distinct 添加到查询中通常表明有问题,您正在修复症状而不是原因。

    【讨论】:

      【解决方案2】:

      解决方案是在每个返回字段周围使用函数 to_char(),如 Distinct/Group By/等。无法处理 clob 甚至是 clob 的子字符串。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-07-16
        • 1970-01-01
        • 2011-06-03
        • 2018-04-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-02-28
        相关资源
        最近更新 更多