Oracle12C 中,去掉了 WM_CONCAT函数。
网上众多的还是恢复wmsys 用户,然后创建用户,授权等等,太过繁琐。
那就不能创建一个用户自己的函数,不得了。所有使用的非系统函数,都变成自己的呗。
函数创建如下:
CREATE OR REPLACE TYPE WM_CONCAT_IMPL AS OBJECT -- AUTHID CURRENT_USER AS OBJECT ( CURR_STR VARCHAR2(32767), STATIC FUNCTION ODCIAGGREGATEINITIALIZE(SCTX IN OUT WM_CONCAT_IMPL) RETURN NUMBER, MEMBER FUNCTION ODCIAGGREGATEITERATE(SELF IN OUT WM_CONCAT_IMPL, PARAM1 IN VARCHAR2) RETURN NUMBER, MEMBER FUNCTION ODCIAGGREGATETERMINATE(SELF IN WM_CONCAT_IMPL, RETURNVALUE OUT VARCHAR2, FLAGS IN NUMBER) RETURN NUMBER, MEMBER FUNCTION ODCIAGGREGATEMERGE(SELF IN OUT WM_CONCAT_IMPL, SCTX2 IN WM_CONCAT_IMPL) RETURN NUMBER ); / --定义类型body: CREATE OR REPLACE TYPE BODY WM_CONCAT_IMPL IS STATIC FUNCTION ODCIAGGREGATEINITIALIZE(SCTX IN 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,PARAM1 IN VARCHAR2) RETURN NUMBER IS BEGIN IF(CURR_STR IS NOT NULL) THEN CURR_STR := CURR_STR || ',' || PARAM1; ELSE CURR_STR := PARAM1; 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_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 wm_concat(PARAM1 VARCHAR2) RETURN VARCHAR2 AGGREGATE USING WM_CONCAT_IMPL ;
亲测,在Oracle12C的PDB上,可用。
相关推荐
### Oracle 创建wm_concat函数 #### 知识点一:Oracle 10G及以下版本的wm_concat函数自定义实现 在Oracle 10G及更早版本中,并没有内置的`wm_concat`函数,该函数主要用于对一组字符串进行连接操作。为了在这些...
Oracle从12C版本开始,不支持wm_concat函数,我们可以采取的办法有使用listagg函数代替wm_concat函数,或者为了减小修改程序的工作量,可以通过手工创建wm_concat函数来解决这个问题。
11gr2和12C上已经摒弃了wm_concat函数,当时我们很多程序员在程序中使用了该函数,导致程序出现错误,为了减轻程序员修改程序的工作量,只有通过手工创建个wm_concat函数,来临时解决该问题
这意味着在12C及更高版本中,如果还想使用`wm_concat`功能,就需要我们自己创建这个函数。下面,我们将详细介绍如何自定义`wm_concat`函数,并探讨其工作原理以及替代方案。 首先,`wm_concat`函数的原意是返回一个...
解决ORA-00904: "WMSYS"."WM_CONCAT": 标识符无效 在sqlplus中执行包里的owmctab.plb、owmaggrs.plb、owmaggrb.plb三个脚本即可。 简单来说,用PL/SQL执行下一下几个脚本就可以了。 特别要注意:PL/SQL登录时,要...
2. **自定义函数**:如果不能使用LISTAGG(例如,在Oracle 10g或更低版本中),可以创建自己的自定义聚合函数来替代WM_CONCAT。 3. **调整查询**:在某些情况下,可能可以通过重新构造查询,使用嵌套的SELECT语句或...
1. **数据库版本问题**:Oracle在11g版本后开始不推荐使用`WM_CONCAT`,在12c及更高版本中彻底移除。如果你正在尝试在一个较新版本的Oracle数据库中使用这个函数,那么可能会导致这个错误。 2. **权限问题**:用户...
oracle 12c 兼容 11g 的 wm_concat 方法。 oracle 12c wm_concat。 owmaggrb.plb,owmaggrs.plb,owmctab.plb 1、下载三个文件:owmctab.plb 、 owmaggrs.plb 、 owmaggrb.plb 2、用sqlplus登录:sqlplus sys/123 as...
1. **利用系统包创建WM_CONCAT函数**:Oracle提供了一套脚本来创建一个类似`WM_CONCAT`的函数,这通常涉及到在`WMSYS`模式下执行一系列的PL/SQL语句,以复现`WM_CONCAT`的功能。这个过程需要对Oracle的内部工作原理...
owmaggrb.plb,owmaggrs.plb,owmctab.plb 1、下载三个文件:owmctab.plb 、 owmaggrs.plb 、 owmaggrb.plb 2、用sqlplus登录:sqlplus sys/123 as sysdba 3、执行@C:\Users\JOYTRAVEL\Desktop\WMSYS用户\owmaggrb....
Oracle 12c 创建建WMSYS用户的WMSYS.WM_CONCAT函数 解决12c不支持WM_CONCAT函数问题 解压到E:\WMSYS\目录下然后在cmd里执行下边的命令 sqlplus / as sysdba @E:\WMSYS\owmctab.plb; @E:\WMSYS\owmaggrs.plb; @...
Oracle中的WM_CONCAT函数是一个非标准的聚合函数,主要用于将同一组内的多个行值合并成一个字符串。这个函数在处理数据汇总,特别是当需要将某个列的多个值合并成一个单一的字符串时非常有用。然而,需要注意的是,...
oracle 10g 11g 12c 19c 21c 23c 重建wm_concat函数脚本 varchar类型clob类型报错不用listagg ORA-01790: 表达式必须具有与对应表达式相同的数据类型 ORA-00904: “WM_CONCAT“: invalid identifier 解决 owmaggrb....
总结一下,Oracle 12c中不再支持`wm_concat`,建议使用`listagg`函数代替。如果因为特定原因必须使用`wm_concat`,可以通过创建自定义的PL/SQL函数来模拟其功能,如提供的`owmctab.plb`、`owmaggrs.plb`和`owmaggrb....
本文将深入探讨在"Oracle材料"中提到的一些关键知识点,包括`listagg`函数、Oracle SQL Developer的使用、数据导入导出、远程登录、`rownum`与分组排序以及`wm_concat`函数。 1. **Listagg函数**:`listagg`是...
2. **创建自定义函数**:如果你对"WM_CONCAT"的行为非常依赖,可以创建一个自定义的函数来模拟它的功能。这通常涉及到编写一个PL/SQL函数,使用"CLOB"类型和循环结构来合并字符串。 3. **升级代码**:如果可能,更新...
- **WM_CONCAT**:这是一个聚合函数,用于将多列结果合并成一个字符串,但请注意,这个函数在Oracle 12c及以后版本已被废弃。 - **REPLACE**:替换字符串中的某个子串,例如`REPLACE(WMSYS.WM_CONCAT(a.xmid),',',...