资讯专栏INFORMATION COLUMN

oracle新版无wh_concat函数问题小结

IT那活儿 / 3215人阅读
oracle新版无wh_concat函数问题小结


一. 问题描述

11gr2和12C上已经摒弃了wm_concat函数,但是我们很多程序员在程序中却使用了该函数,导致程序出现错误,为了减轻程序员修改程序的工作量,只有通过手工创建个wm_concat函数,来临时解决该问题。


二. 问题现象

在执行数据库导入过程中,在编译阶段出现如下:
alter  PACKAGE BODY LISAPP.HAND_MONITOR compile;
  LINE/COL ERROR
  319/11 PL/SQL: SQL Statement ignored
  319/18 PL/SQL: ORA-00904: "WM_CONCAT": invalid identifier


三. 解决方法

手工创建wm_concat函数

1. 解锁wmsys用户

alter user wmsys account unlock;

2. 创建包、包体和函数

以wmsys用户登录数据库,执行下面的命令

sqlplus user/password@pdbname;----连接到那个PDB下。
CREATE OR REPLACE TYPE WM_CONCAT_IMPLAS OBJECT  
-- AUTHID CURRENT_USER AS OBJECT
(
CURR_STR VARCHAR2(32767),
STATIC FUNCTION ODCIAGGREGATEINITIALIZE(SCTXIN OUT WM_CONCAT_IMPL)RETURN NUMBER,
MEMBER FUNCTION ODCIAGGREGATEITERATE(SELF IN OUT WM_CONCAT_IMPL,
P1IN VARCHAR2)RETURN NUMBER,
MEMBER FUNCTION ODCIAGGREGATETERMINATE(SELF IN WM_CONCAT_IMPL,
RETURNVALUEOUT VARCHAR2,
FLAGSIN NUMBER)
RETURN NUMBER,
MEMBER FUNCTION ODCIAGGREGATEMERGE(SELF IN OUT WM_CONCAT_IMPL,
SCTX2IN WM_CONCAT_IMPL)RETURN NUMBER  
);
/

3. 定义类型body:

CREATE OR REPLACE TYPE BODY WM_CONCAT_IMPL
IS  
STATIC FUNCTION ODCIAGGREGATEINITIALIZE(SCTXIN OUT WM_CONCAT_IMPL)
RETURN NUMBER  
IS  
BEGIN  
SCTX := WM_CONCAT_IMPL(NULL) ;
RETURN ODCICONST.SUCCESS;
END;
MEMBER FUNCTION ODCIAGGREGATEITERATE(SELF IN OUT WM_CONCAT_IMPL,
P1 IN VARCHAR2)
RETURN NUMBER
IS
BEGIN  
IF(CURR_STRIS NOT NULL)THEN  
CURR_STR := CURR_STR ||, || P1;
ELSE
CURR_STR := P1;
END IF;
RETURN ODCICONST.SUCCESS;
END;
MEMBER FUNCTION ODCIAGGREGATETERMINATE(SELF IN WM_CONCAT_IMPL,
RETURNVALUE OUT VARCHAR2,
FLAGS IN NUMBER)
RETURN NUMBER
IS
BEGIN  
RETURNVALUE := CURR_STR ;
RETURN ODCICONST.SUCCESS;
END;
MEMBER FUNCTION ODCIAGGREGATEMERGE(SELF IN OUT WM_CONCAT_IMPL,
SCTX2 IN WM_CONCAT_IMPL)
RETURN NUMBER
IS
BEGIN  
IF(SCTX2.CURR_STRIS NOT NULL)THEN  
SELF.CURR_STR := SELF.CURR_STR ||, || SCTX2.CURR_STR ;
END IF;
RETURN ODCICONST.SUCCESS;
END;
END;
/

4. 自定义行变列函数:

CREATE OR REPLACE FUNCTION wm_concat(P1 VARCHAR2)
RETURN VARCHAR2 AGGREGATE USING WM_CONCAT_IMPL ;
/

5. 创建同义词并授权

create or replace public synonym WM_CONCAT_IMPL for wmsys.WM_CONCAT_IMPL ;
create or replace public synonym wm_concat for wmsys.wm_concat ;
grant execute on WM_CONCAT_IMPL to public ;
grant execute on wm_concat to public ;



四. 经验小结

注意事项:

  1. 公有同义词---可以被所有数据库用户访问

    使用scott创建公有同义词

    grant create public synonym to scott---把公有同义词权限赋予给scott

    create public  synonym syn_dept for dept;

  2. 私有同义词

    create synonym synl for scott.emp;谁创建的同义词,谁使用。


END


更多精彩干货分享

点击下方名片关注

IT那活儿

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/129934.html

相关文章

  • 新书推荐 |《PostgreSQL实战》出版(提供样章下载)

    摘要:作者谭峰张文升出版日期年月页数页定价元本书特色中国开源软件推进联盟分会特聘专家撰写,国内多位开源数据库专家鼎力推荐。张文升中国开源软件推进联盟分会核心成员之一。 很高兴《PostgreSQL实战》一书终于出版,本书大体上系统总结了笔者 PostgreSQL DBA 职业生涯的经验总结,本书的另一位作者张文升拥有丰富的PostgreSQL运维经验,目前就职于探探科技任首席PostgreS...

    Martin91 评论0 收藏0
  • 高性能javascript小结

    摘要:高性能小结文章转载于我的博客最近看完了动物丛书的高性能,觉得那本书的小结部分写得非常不错,简洁轻快易懂概括性很强。由于局部变量存在于作用域链的起始位置,因此访问局部变量比访问跨作用域变量更快。 高性能javascript小结 文章转载于我的CSDN博客:http://blog.csdn.net/hello_world_20/article/details/46793317 最近看完了动...

    wujl596 评论0 收藏0
  • 金三银四面试季节之Java 核心面试技术点 - JVM 小结

    摘要:直接对栈的操作只有两个,就是对栈帧的压栈和出栈。中将永久代移除,同时增加元数据区。在中,本地方法栈和虚拟机栈是在同一块儿区域,这完全取决于技术实现的决定,并未在规范中强制。 原文:https://github.com/linsheng97... 描述一下 JVM 的内存区域 程序计数器(PC,Program Counter Register)。在 JVM 规范中,每个线程都有它自己的...

    XGBCCC 评论0 收藏0

发表评论

0条评论

IT那活儿

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<