设为首页 收藏本站
查看: 1818|回复: 0

[经验分享] ORA-00932: inconsistent datatypes: expected - got CLOB

[复制链接]
累计签到:1 天
连续签到:1 天
发表于 2014-5-23 09:28:06 | 显示全部楼层 |阅读模式
    最近数据库从10.2.0.3升级到了10.2.0.5之后,一些对象无法编译通过。查看了这些对象主要表现在之前写法不严格的SQL语法导致了这些package无法成功编译,诸如select查询列中不能使用混淆的列名称等。另外一个比较表现突出的是返回ORA-00932: inconsistent datatypes: expected - got CLOB错误,即不一致的数据类型,获得CLOB数据类型。下面是这个问题的症状及对策。



1、故障现象


    SQL> alter package bo_trd_trade_relink_pkg compile body;  
      
    Warning: Package Body altered with compilation errors.  
      
    SQL> show errors;  
    Errors for PACKAGE BODY BO_TRD_TRADE_RELINK_PKG:  
      
    LINE/COL ERROR  
    -------- -----------------------------------------------------------------  
    30/13    PL/SQL: ORA-00932: inconsistent datatypes: expected - got CLOB  
    30/13    PL/SQL: SQL Statement ignored  
    898/13   PL/SQL: ORA-00932: inconsistent datatypes: expected - got CLOB  
    898/13   PL/SQL: SQL Statement ignored  

2、分析与解决


    --记得当前服务器下数据库并没有使用任何CLOB数据类型,却返回CLOB类型了,我懵!  
    --还是搜索了数据库中是否存在,一个也没有找到  
    SQL> select * from v$version where rownum<2;  
      
    BANNER  
    ----------------------------------------------------------------  
    Oracle Database 10g Release 10.2.0.3.0 - 64bit Production  
      
    SQL> select data_type from dba_tab_columns where data_type like '%LOB%' and owner='GOEX_ADMIN';  
      
    no rows selected  
      
    --在错误提示地方,如30行处发现了为select 查询列使用了wm_concat函数,尝试注视该列,Pckage编译成功,看来是这个函数是罪魁祸首  
    --关于这个函数在10.2.0.3的表现为返回为VARCHAR2数据类型,如下:   
    SQL> select * from v$version where rownum<2;  
      
    BANNER  
    ----------------------------------------------------------------  
    Oracle Database 10g Release 10.2.0.3.0 - 64bit Production  
      
    SQL> desc wmsys.wm_concat  
    FUNCTION wmsys.wm_concat RETURNS VARCHAR2  
     Argument Name                  Type                    In/Out Default?  
     ------------------------------ ----------------------- ------ --------  
     P1                             VARCHAR2                IN  
      
    --而10.2.0.5表现为返回的CLOB数据类型   
    SQL> select * from v$version where rownum<2;  
      
    BANNER  
    ----------------------------------------------------------------  
    Oracle Database 10g Release 10.2.0.5.0 - 64bit Production  
      
    SQL> desc wmsys.wm_concat  
    FUNCTION wmsys.wm_concat RETURNS CLOB  
     Argument Name                  Type                    In/Out Default?  
     ------------------------------ ----------------------- ------ --------  
     P1                             VARCHAR2                IN  

    --由于返回类型不一致导致了package在新环境中无法成功编译  
      
    原因:lob字段不能用做group by,而union中需要使用group by过滤重复记录,所以无法编译成功  
      
    解决方案:  
    a、为这个select 查询列使用了to_char函数来进行转换(wm_concat(col_name))  
    b、或者修改union 为union all  
      
    --下面给一个示例供大家参考(10.2.0.5环境),仅仅是执行SQL  
    SQL> select * from t8;  
      
            ID VAL  
    ---------- --------------------  
             1 LINUX  
             1 SOLARIS  
             2 ORACLE  
             2 MYSQL  
      
    SQL> select * from t9;  
      
            ID VAL  
    ---------- --------------------  
             3 OFFICE  
      
    --单独使用时没有任何异常  
    SQL> select id,wm_concat(val) new_val from t8 group by id;  
      
            ID NEW_VAL  
    ---------- ------------------------------  
             1 LINUX,SOLARIS  
             2 ORACLE,MYSQL      
      
    --使用union时出现ORA-00932错误  
    SQL> select id,wm_concat(val) new_val from t8 group by id  
      2  union   
      3  select id,wm_concat(val) new_val from t9 group by id;  
    select id,wm_concat(val) new_val from t8 group by id  
              *  
    ERROR at line 1:  
    ORA-00932: inconsistent datatypes: expected - got CLOB  
      
    --通过修改union为union all或者使用to_char类解决  
    SQL> select id,wm_concat(val) new_val from t8 group by id  
      2  union all  
      3  select id,wm_concat(val) new_val from t9 group by id;  
      
            ID NEW_VAL  
    ---------- ------------------------------  
             1 LINUX,SOLARIS  
             2 ORACLE,MYSQL  
             3 OFFICE  
      
    SQL> select id,to_char(wm_concat(val)) new_val from t8 group by id  
      2  union select id, to_char(wm_concat(val)) new_val from t9 group by id;  
      
            ID NEW_VAL  
    ---------- ------------------------------  
             1 LINUX,SOLARIS  
             2 ORACLE,MYSQL  
             3 OFFICE  

                  
3、Metalink上的相关文档(ID 1300595.1,ID 1336219.1)
--是一个内部函数,不建议使用

Symptoms

In releases 10.2.0.5 and 11.2.0.2, creating a view using the WMSYS.WM_CONCAT function fails.

In releases 10.2.0.4, 11.1.0.7 and 11.2.0.1, the view compiles successfully.



Cause

The datatype returned from WMSYS.WM_CONCAT function changed from VARCHAR2 to CLOB in releases 10.2.0.5 and 11.2.0.2.

In 10.2.0.4 / 11.1.0.7 / 11.2.0.1 it returns VARCHAR2
SQL> desc wmsys.wm_concat;
FUNCTION wmsys.wm_concat RETURNS VARCHAR2 <<<<<<<<<<<<<<<Argument Name           Type                     In/Out   Default?
----------------------- ------------------------ -------- ---------
P1                      VARCHAR2                 IN


In 10.2.0.5 / 11.2.0.2 it returns CLOB
SQL> desc wmsys.wm_concat;
FUNCTION wmsys.wm_concat RETURNS CLOB <<<<<<<<<<<<<<<Argument Name           Type                     In/Out   Default?
----------------------- ------------------------ -------- ---------
P1                      VARCHAR2                 IN



Solution

This is not a bug.

The function WMSYS.WM_CONCAT is an internal undocumented function which is installed/uninstalled as part of the Workspace Manager feature of Oracle Database. It is internally used in a number of Workspace Manager views. It is not meant to be used by customers directly, and could be changed/updated without notice by Oracle Development. Do not use the WMSYS.WM_CONCAT view in your application.

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-19520-1-1.html 上篇帖子: Oracle 后台进程介绍 下篇帖子: oracle11g安装时报INFO:INFO错误解决 expected
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表