专栏首页乐沙弥的世界ORA-00932: inconsistent datatypes: expected - got CLOB

ORA-00932: inconsistent datatypes: expected - got CLOB

      最近数据库从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
--Author : Leshami
--Blog   : http://blog.csdn.net/leshami
--由于返回类型不一致导致了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.

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • PL/SQL -->隐式游标(SQL%FOUND)

    在PL/SQL中,游标的使用分为两种,一种是显示游标,一种是隐式游标,显示游标的使用需要事先使用declare来进行声明,其过程包括

    Leshami
  • db_block_checking与db_block_checksum

        db_block_checking与db_block_checksum两个参数都是对block进行检查,然而两者很容易混淆。事实上,两个参数中前者是对块...

    Leshami
  • SQLPlus 常用命令

    3->LIST [m][*] [n](简写L)显示缓冲区的所有内容。* 当前行,m 第m行,n 第n行,m n 同时出现,m到n行

    Leshami
  • 安全通告 | Apache SkyWalking SQL注入漏洞安全风险公告(CVE-2020-13921)

    近日,腾讯蓝军(force.tencent.com)发现并向Apache SkyWalking官方团队提交SQL注入漏洞(漏洞编号:CVE-2020-1392...

    腾讯云安全
  • 安全通告 | Apache SkyWalking SQL注入漏洞安全风险公告(CVE-2020-13921)

    近日,腾讯蓝军(force.tencent.com)发现并向Apache SkyWalking官方团队提交SQL注入漏洞(漏洞编号:CVE-2020-13921...

    腾讯安全
  • 聊聊 React Router v4 的设计思想

    React Router v4 发布已经有几个月了,但好像并没有得到太多人的青睐,大家(包括我们团队自己)还是习惯使用v2、v3版本。这一方面是因为v4版本是一...

    前端博客 : alili.tech
  • Linux O(1)调度器

    O(n)调度器采用一个runqueue运行队列来管理所有可运行的进程,在主调度schedule函数中会选择一个优先级最高,也就是时间片最大的进程来运行,同时也会...

    DragonKingZhu
  • 最简教程!写个UC浏览器

    文章转载自 https://juejin.im/post/5a212638f265da431523b663 项目github地址: https://github...

    企鹅号小编
  • 核技巧

    关于映射到更高维平面的方法。 对数据进行某种形式的转换,从而得到新的变量来表示数据。从一个特征空间转换到另一个特征空间(特征空间映射)。 其实也就是另外一种距离...

    微风、掠过
  • vue之router文档

    查看 dist 目录. 注意,dist 目录下的文件是最新稳定版,不会同步更新到 dev 分支上的最新代码

    开发架构二三事

扫码关注云+社区

领取腾讯云代金券