【问题标题】:SQL Converting a varchar to a clob within an SQL unionSQL 在 SQL 联合中将 varchar 转换为 clob
【发布时间】:2013-01-30 14:45:51
【问题描述】:

为什么oracle不允许下面的查询

select to_clob(1) from dual
union
select wm_concat(sysdate) from dual;

wm_concat 返回一个 clob。为了使联合中的两个查询具有相同类型的列,我将第一个查询中的列转换为 clob,但 Oracle 给了我一个 [1]: ORA-00932: inconsistent datatypes: expected - got CLOB 错误,即使两者都返回一个 clob 值。

每个查询单独工作并且都返回一个 clob 值。

【问题讨论】:

    标签: sql oracle


    【解决方案1】:

    我不相信 wm_concat 会返回 CLOB

    这表明返回的是Typ=1,这是一个VARCHAR2

    SQL> select dump(wm_concat(sysdate)) from dual;
    
    DUMP(WM_CONCAT(SYSDATE))
    --------------------------------------------------------------------------------
    Typ=1 Len=9: 49,52,45,70,69,66,45,49,51
    

    如果你创建一个视图也可以看到

    SQL> ed
    Wrote file afiedt.buf
    
      1  create view vw_wm_concat
      2  as
      3* select wm_concat(sysdate) col from dual
    SQL> /
    
    View created.
    
    SQL> desc vw_wm_concat;
     Name                                      Null?    Type
     ----------------------------------------- -------- ----------------------------
     COL                                                VARCHAR2(4000)
    

    如果将WM_CONCAT 返回的VARCHAR2 转换为CLOB,下一个问题是Oracle 不支持在CLOB 列上执行DISTINCT,这是执行UNION。假设您真的不需要删除重复的行,您可以使用UNION ALL 而不是UNION

    将两者放在一起,就像这样

    SQL> ed
    Wrote file afiedt.buf
    
      1   select to_clob(1) from dual
      2   union all
      3* select to_clob(wm_concat(sysdate)) col from dual
    SQL> /
    
    TO_CLOB(1)
    ------------------------------------------------------------
    1
    14-FEB-13
    

    会起作用

    【讨论】:

    • 我使用 wm_concat() 而不是 listagg() 的原因是我试图避免“ORA-01489:字符串连接的结果太长”。如果 wm_concat 返回一个 varchar,我不会对 wm_concat 有同样的问题吗?谢谢
    • @ziggy - 如果结果超过 4000 字节,我希望你会对 wm_concat 有问题,是的。
    • 有点跑题,但如果你坚持使用clob,你也可以使用xmlconcat(...).getclobval()。但这样聚合的字符串将是“XML 格式”。
    • @Ivan - 这实际上是同一个用户最近提出的另一个问题的主题 - stackoverflow.com/questions/14864055/… 我相信 XML 方法的关注点是从 cmets 判断性能。
    猜你喜欢
    • 2021-11-21
    • 2021-03-26
    • 2013-11-27
    • 2013-07-21
    • 1970-01-01
    • 2018-02-10
    • 2010-11-26
    • 2020-10-26
    • 1970-01-01
    相关资源
    最近更新 更多