相关文章推荐
玉树临风的眼镜  ·  验证器 - Pydantic 验证 - ...·  2 月前    · 
谈吐大方的跑步鞋  ·  成都世运会圣火采集者肖先进: ...·  1 年前    · 
痴情的领结  ·  openwrt ...·  1 年前    · 
踏实的馒头  ·  这座房价连涨13个月的省会取消限购后,市场发 ...·  1 年前    · 
玩命的甜瓜  ·  上海市中医药研究院2024年度下半年公开招聘 ...·  1 年前    · 
重感情的丝瓜  ·  icloud云备份能恢复微信记录吗-抖音·  2 年前    · 
Code  ›  【数据库升级故障】函数wm_concat引发的ORA-01790错误 - 墨天轮
select str函数
https://www.modb.pro/db/1702149017182490624
踢足球的剪刀
2 年前
  • 学习
    • 课程中心
      推荐优质内容、热门课程
    • 学习路径
      预设学习计划、达成学习目标
    • 知识图谱
      综合了解技术体系知识点
    • 课程库
      快速筛选、搜索相关课程
    • 视频学习
      专业视频分享技术知识
    • 电子文档
      快速搜索阅览技术文档
  • 文档
  • 服务
    • 服务介绍
    • 专家团队
    • 在线工具
    • 智能助手
    • 服务平台
  • 暂无图片
    • 数据库百科
    • 核心案例
    • 行业报告
    • 月度解读
    • 大事记
    • 产业图谱
  • 我的订单
  • 登录后可立即获得以下权益
    免费培训课程
    收藏优质文章
    疑难问题解答
    下载专业文档
    签到免费抽奖
    提升成长等级
    立即登录
    登录 注册
      • 登录 注册
    • 首页
    • 资讯
    • 数说
    • 活动
    • 大会
    • 课程
    • 文档
    • 排行
    • 问答
    • 我的订单
    暂无图片
    • 首页
    • 专家团队
    • 智能助手
    • 在线工具
      • SQLRUN
        在线数据库即时SQL运行平台
      • 数据库在线实训平台
        实操环境、开箱即用、一键连接
      • AWR分析
        上传AWR报告,查看分析结果
      • SQL格式化
        快速格式化绝大多数SQL语句
      • SQL审核
        审核编写规范,提升执行效率
      • PLSQL解密
        解密超4000字符的PL/SQL语句
      • OraC函数
        查询Oracle C 函数的详细描述
      • 智能助手小墨
        关于数据库相关的问题,您都可以问我
    • 精选案例
    • 新闻资讯
    • 云市场
    登录后可立即获得以下权益
    免费培训课程
    收藏优质文章
    疑难问题解答
    下载专业文档
    签到免费抽奖
    提升成长等级
    立即登录
    登录 注册
      • 登录 注册
    • 首页
    • 专家团队
    • 智能助手
    • 精选案例
    • 新闻资讯
    • 云市场
    暂无图片
    4
    暂无图片
    暂无图片
    微信扫码
    复制链接
    新浪微博
    分享数说
    暂无图片
    采集到收藏夹
    分享到数说
    首页 / 【数据库升级故障】函数wm_concat引发的ORA-01790错误

    【数据库升级故障】函数wm_concat引发的ORA-01790错误

    原创 virvle 2023-09-14
    669

    这周在梳理老旧系统,其中有十年+的系统需要迁移到新的服务器,鉴于各方面考虑,顺便将库从10.2.0.1版本迁移到11.2.0.4,一切都准备好后,在应用启动后,部分菜单出现报错:
    ORA-01790: expression must have same datatype ascorresponding expression
    怎么办呢??

    1. 问题排查

    排查操作涉及的SQL简化如下:

    select no,wm_concat(name) as name from t1 where no<10 group by no -- 子SQL1 UNION select no,name from t1 where no>10 -- 子SQL2

    2个子SQL单独执行是不会报错的,但是一旦用了union 联合后,就会触发 ORA-01790 报错。
    于是在进一步排查,是函数wm_concat导致的

    2. 究其根源,发现是wm_concat函数惹的祸

    是由于升级到11.2.0.4后,wm_concat函数返回的数据类型发生了变化,在这之前返回的是VARCHAR2字符串类型,而升级之后返回的是CLOB类型。

    3. 解决措施:

    1)【临时解决办法】若将函数包多一层转义,可以解决,子sql1于是改写成如下:

    select no,to_char(wm_concat(name)) as name from t1 where no<10 group by no -- 子SQL1

    PS:但是这需要修改代码,而且涉及的范围可能很广,不单单是此时发现的这一处,改起来费时费力,有没有更好好的办法呢?于是想到在函数 wm_concat 下功夫

    2)【绝招】第一步:重新定义wm_concat函数,改变其返回的数据类型

    -- 连接应用账号,查询需要创建的对象是否存在 select * from dba_objects where object_name in ('F_WM_CONCAT_IMPL','F_WM_CONCAT_IMPL','F_WM_CONCAT') -- 创建自定义函数涉及的类 CREATE OR REPLACE TYPE F_WM_CONCAT_IMPL AS OBJECT -- AUTHID CURRENT_USER AS OBJECT CURR_STR VARCHAR2(32767), STATIC FUNCTION ODCIAGGREGATEINITIALIZE(SCTX IN OUT F_WM_CONCAT_IMPL) RETURN NUMBER, MEMBER FUNCTION ODCIAGGREGATEITERATE(SELF IN OUT F_WM_CONCAT_IMPL, P1 IN VARCHAR2) RETURN NUMBER, MEMBER FUNCTION ODCIAGGREGATETERMINATE(SELF IN F_WM_CONCAT_IMPL, RETURNVALUE OUT VARCHAR2, FLAGS IN NUMBER) RETURN NUMBER, MEMBER FUNCTION ODCIAGGREGATEMERGE(SELF IN OUT F_WM_CONCAT_IMPL, SCTX2 IN F_WM_CONCAT_IMPL) RETURN NUMBER --定义类型body: CREATE OR REPLACE TYPE BODY F_WM_CONCAT_IMPL STATIC FUNCTION ODCIAGGREGATEINITIALIZE(SCTX IN OUT F_WM_CONCAT_IMPL) RETURN NUMBER BEGIN SCTX := F_WM_CONCAT_IMPL(NULL) ; RETURN ODCICONST.SUCCESS; END; MEMBER FUNCTION ODCIAGGREGATEITERATE(SELF IN OUT F_WM_CONCAT_IMPL, P1 IN VARCHAR2) RETURN NUMBER BEGIN IF(CURR_STR IS NOT NULL) THEN CURR_STR := CURR_STR || ',' || P1; CURR_STR := P1; END IF; RETURN ODCICONST.SUCCESS; END; MEMBER FUNCTION ODCIAGGREGATETERMINATE(SELF IN F_WM_CONCAT_IMPL, RETURNVALUE OUT VARCHAR2, FLAGS IN NUMBER) RETURN NUMBER BEGIN RETURNVALUE := CURR_STR ; RETURN ODCICONST.SUCCESS; END; MEMBER FUNCTION ODCIAGGREGATEMERGE(SELF IN OUT F_WM_CONCAT_IMPL, SCTX2 IN F_WM_CONCAT_IMPL) RETURN NUMBER BEGIN IF(SCTX2.CURR_STR IS NOT NULL) THEN SELF.CURR_STR := SELF.CURR_STR || ',' || SCTX2.CURR_STR ; END IF; RETURN ODCICONST.SUCCESS; END; END; --自定义行变列函数: CREATE OR REPLACE FUNCTION F_WM_CONCAT(P1 VARCHAR2) RETURN VARCHAR2 AGGREGATE USING F_WM_CONCAT_IMPL ;

    3)【绝招】最后一步:为了程序不做任何改动,我们直接干翻 WMSYS.WM_CONCAT函数的江湖地位

    --查询同义词对象 select * from dba_objects where object_name in( 'WM_CONCAT','F_WM_CONCAT_IMPL','F_WM_CONCAT') --删除公共同义词 (属主WMSYS)--使用sys用户(或授予相关权限)操作 DROP PUBLIC SYNONYM WM_CONCAT; --创建公共同义词(连接自定义函数) -- 使用sys用户(或授予相关权限)操作 create public synonym WM_CONCAT for <username>.F_WM_CONCAT; --查询同义词 属于<username>用户 select * from dba_synonyms where synonym_name='WM_CONCAT' select wm_concat('Hello') from dual --(针对查询库用户的查询用户)授权执行存储过程
     
    推荐文章
    玉树临风的眼镜  ·  验证器 - Pydantic 验证 - Pydantic 数据验证库
    2 月前
    谈吐大方的跑步鞋  ·  成都世运会圣火采集者肖先进: 三星堆文化传承壮大就像火炬传递代代接力--广汉市人民政府
    1 年前
    痴情的领结  ·  openwrt 重启后看不到docker_mob64ca12ea10ec的技术博客_51CTO博客
    1 年前
    踏实的馒头  ·  这座房价连涨13个月的省会取消限购后,市场发生了什么变化?_手机新浪网
    1 年前
    玩命的甜瓜  ·  上海市中医药研究院2024年度下半年公开招聘公告_招聘公告_上海市人力资源和社会保障局
    1 年前
    重感情的丝瓜  ·  icloud云备份能恢复微信记录吗-抖音
    2 年前
    今天看啥   ·   Py中国   ·   codingpro   ·   小百科   ·   link之家   ·   卧龙AI搜索
    删除内容请联系邮箱 2879853325@qq.com
    Code - 代码工具平台
    © 2024 ~ 沪ICP备11025650号