精华内容
下载资源
问答
  • WM_CONCAT 经常使用到行转列上,早期的代码里这个函数用的会比较多,但是可惜在12c中,这个函数已经过期了:所以,在后续的开发中,不要再使用这个函数。在MOS中,Oracle也不建议客户使用这个函数,该函数为系统内部...

    WM_CONCAT 经常使用到行转列上,早期的代码里这个函数用的会比较多,但是可惜在12c中,这个函数已经过期了:

    所以,在后续的开发中,不要再使用这个函数。在MOS中,Oracle也不建议客户使用这个函数,该函数为系统内部使用:

    那PG中有没有类似的函数呢?答案是肯定的:string_agg.

    创建测试数据

    create table t_concat (id int,name varchar(100),score int); # pg

    create table t_concat (id number,name varchar2(100),score number); # Oracle

    truncate table t_concat;

    insert into t_concat values (1,'yuwen',90);

    insert into t_concat values (1,'shuxue',85);

    insert into t_concat values (1,'yingyu',70);

    insert into t_concat values (1,'wuli',80);

    insert into t_concat values (1,'huaxue',74);

    insert into t_concat values (2,'yuwen',91);

    insert into t_concat values (2,'shuxue',90);

    insert into t_concat values (2,'yingyu',73);

    insert into t_concat values (2,'wuli',78);

    insert into t_concat values (2,'huaxue',74);

    查询

    # Oracle

    select id,sum(score),wm_concat(name) from t_concat group by id order by id;

    SQL> select id,sum(score),wm_concat(name) from t_concat group by id order by id;

    ID SUM(SCORE) WM_CONCAT(NAME)

    ---------- ---------- --------------------------------------------------------------------------------

    1 399 yuwen,huaxue,wuli,yingyu,shuxue

    2 406 yuwen,huaxue,wuli,yingyu,shuxue

    # pg

    select id,sum(score),string_agg(name,',') from t_concat group by id order by id;

    test=# select id,sum(score),string_agg(name,',') from t_concat group by id order by id;

    id | sum | string_agg

    ----+-----+---------------------------------

    1 | 399 | yuwen,shuxue,yingyu,wuli,huaxue

    2 | 406 | yuwen,shuxue,yingyu,wuli,huaxue

    (2 rows)

    pg可以指定其中的分隔符:

    test=# select id,sum(score),string_agg(name,'-') from t_concat group by id order by id;

    id | sum | string_agg

    ----+-----+---------------------------------

    1 | 399 | yuwen-shuxue-yingyu-wuli-huaxue

    2 | 406 | yuwen-shuxue-yingyu-wuli-huaxue

    (2 rows)

    test=# select id,sum(score),string_agg(name,'||') from t_concat group by id order by id;

    id | sum | string_agg

    ----+-----+-------------------------------------

    1 | 399 | yuwen||shuxue||yingyu||wuli||huaxue

    2 | 406 | yuwen||shuxue||yingyu||wuli||huaxue

    (2 rows)

    test=#

    在Oracle官方文档中,从11gr2开始,建议使用listagg代替wm_concat:

    col names format a60;

    select id,sum(score),listagg(name,'-') within group (order by score ) as "names"from t_concat group by id order by id;

    SQL> SQL> select id,sum(score),listagg(name,'-') within group (order by score ) as "names"from t_concat group by id order by id;

    ID SUM(SCORE) names

    ---------- ---------- ------------------------------------------------------------

    1 399 yingyu-huaxue-wuli-shuxue-yuwen

    2 406 yingyu-huaxue-wuli-shuxue-yuwen

    SQL>

    select id,sum(score),listagg(name) within group (order by name ) as "names"from t_concat group by id order by id;

    ID SUM(SCORE) names

    ---------- ---------- ------------------------------------------------------------

    1 399 huaxueshuxuewuliyingyuyuwen

    2 406 huaxueshuxuewuliyingyuyuwen

    SQL>

    分隔符不是必选参数。PG的string_agg的分隔符为必选参数:

    test=# select id,sum(score),string_agg(name) from t_concat group by id order by id;

    ERROR: function string_agg(character varying) does not exist

    LINE 1: select id,sum(score),string_agg(name) from t_concat group by...

    ^

    HINT: No function matches the given name and argument types. You might need to add explicit type casts.

    test=#

    参考链接:

    展开全文
  • 最近咨询组人员反馈现场数据库升级到11g后,报函数找不到 ORA-00904: "wm_concat":invalid 查文档发现 wm_concat函数已不被oracle 推荐使用,该函数是在8i版本引入,主要功能是行列转换 ,具体用法、功能我就不介绍...

    最近咨询组人员反馈现场数据库升级到11g后,报函数找不到 ORA-00904: "wm_concat":invalid 查文档发现 wm_concat函数已不被oracle 推荐使用,该函数是在8i版本引入,主要功能是行列转换 ,具体用法、功能我就不介绍了,见验证语句微笑。虽然oracle不推荐使用,主要原因是bug多,但创建脚本还是保留着,地址在$ORACLE_HOME/RDBMS/ADMIN/ 目录下

    请用 as sysdba 登录执行

    owmctab.plb (主要功能创建用户,如果WMSYS可以省略执行)  、

    owmaggrs.plb (数据类型之类的)、

    owmaggrb.plb (包体函数之类的)

    注意按顺序执行,如果不确定也可以执行多次,报错请忽略。

    执行完毕后随便验证下:

    select wm_concat(a.OWNER )  from dba_objects a where rownum < 19;

    不报错就ok了,注意该函数返回的数据类型是clob 未超过4000 可以用to_char转换。

    虽然oracle已不推荐使用,但它还是推出了性能和效率更高的函数来替代他 listagg

    语法

    4d5499e8cc07a2d6ec3c35906e5bdc98.png

    我看了下文档举个例子吧SELECT LISTAGG(last_name, '; ')

    WITHIN GROUP (ORDER BY hire_date, last_name) "Emp_list",

    MIN(hire_date) "Earliest"

    FROM employees

    WHERE department_id = 30;

    Emp_list                                                     Earliest

    -

    Raphaely; Khoo; Tobias; Baida; Himuro; Colmenares            07-DEC-02

    这里是用分号(;)分割,当然你也可以用其它字符替代 比如上面替换函数(wm_concat)使用的逗号(,)而且只能用逗号(,),看到了吧,是不是强了那么一丢丢。性能这里就不讨论了。完

    展开全文
  • oracle数据库wm_concat函数替代方案

    千次阅读 2019-09-12 09:44:34
    oracle数据库wm_concat有长度限制,如果长度超长会显示如下提示: 例如原始SQL: select rcid, wm_concat(column_comment) as des from dm_s_resource_catalog_metadata where rcid=‘d6b3d14a17314cdbbe750a57428c4...

    oracle数据库wm_concat有长度限制,如果长度超长会显示如下提示:
    在这里插入图片描述
    例如原始SQL:
    select rcid, wm_concat(column_comment) as des from dm_s_resource_catalog_metadata where rcid=‘d6b3d14a17314cdbbe750a57428c4abc’ group by rcid

    替代方案:
    select XMLAGG(XMLELEMENT(E, column_comment || ‘,’)).EXTRACT(’//text()’).getclobval() des from dm_s_resource_catalog_metadata where rcid=‘d6b3d14a17314cdbbe750a57428c4abc’

    展开全文
  • 列数据 pid userid 1 0000 1 0001 1 0002 想要得到的结果 pid userid 1 0000,0001,0002 方法一: 函数wm_concat() ...替代函数为 listagg 方法二: 函数listagg(userid,’,’)within group (or

    列数据
    pid userid
    1 0000
    1 0001
    1 0002
    想要得到的结果
    pid userid
    1 0000,0001,0002

    方法一:
    函数wm_concat()
    select t.pid , wm_concat(t.userid) from oraceltable
    group by t.id
    存在问题 :版本为12G以上的该方法会出现乱码问题
    替代函数为 listagg

    方法二:
    函数listagg(userid,’,’)within group (order by )
    select id ,listagg(userid,’,’) within group(order by username) zhuanuserid from oraceltable group by id、

    listagg(userid,’,’); userid要转置的列名 ;
    within group(order by username); username 排序的列名;
    zhuanuserid ; 是转置后的列名;

    可能存在问题: 出现乱码问题;
    解决方案: to_char 一下
    例如: listagg(to_char(userid),’,’)

    展开全文
  • 1. createorreplacefunctionpostgresql(p_tnamevarchar2, p_... / 函数: create or replace FUNCTION zh_concat(P1 VARCHAR2) RETURN VARCHAR2 AGGREGATE USING zh_concat_im ; 修改标红部门,可调整字段间分隔符
  • 主要解决oracle低版本(例如9i)无法使用WM_CONCAT函数实现多行字段拼接问题,参考附件中样例即可
  • LISTAGG函数介绍LISTAGG函数是Oracle 11.2新增的函数,用于字符串拼接,11.2之前的版本无法使用,先来简单介绍一下listagg函数的使用LISTAGG完整语法以上是官方文档中给出的完整语法可以自由选择字符串之间的间隔...
  • 替代oralce的wm_concat函数

    万次阅读 2018-07-30 15:28:23
    wm_concat函数是oracle拼接字符串常用函数,但是这函数并不是oracle官方推荐的,估计oracle在后续更新中会悄无声息的去除,在oracle 11g之前可以使用wm_concat,但是如果拼接字符串超过3000就会报错 Ora...
  • oralce函数wm_concat 替代办法

    万次阅读 2017-11-16 16:51:52
    1.该函数不是oracle公开的系统函数,它的用户是wmsys,而不是sys或者system,oracle很有可能在版本升级或者补丁的时候取消或者修改这个函数甚至用户,这种变化oracle是不会公开的。所有可能会由于这个变化而导致异常...
  • Oracle w## 标题m_concat 函数的使用 在需要合并的添加到函数内 Oracle wm_concat 函数的使用 例: select u_id, wmsys.wm_concat(goods) goods_sum from shopping group by u_id
  • 解决Oracle-12C没有wm_concat函数Oracle-12C中wm_concat函数替代方案 Oracle-12C中wm_concat函数替代方案 解锁wmsys用户; alter user wmsys account unlock; 为wmsys用户授权,可根据需要授权; grant all...
  • Oracle10g之后有些版本已不包含WMSYS.WM_CONCAT函数,若用到此函数, 系统会提示异常:ORA-00904: "WM_CONCAT": invalid identifier 因此需单独重建此函数,方法如下: 解压附件,在sqlplus中执行包里的owmctab....
  • 来源 WM_CONCAT的前世今生,想必大多人都知道...想当年,在我们需要将某字段多行内容拼接起来的时候,wm_concat提供了简洁的方法,这使得这个未公开的函数,得到了广泛的宣传与运用 问题 但是,不公开,英文是un...
  • wm_concat 函数在PG中替代

    千次阅读 2018-08-07 10:02:42
    WM_CONCAT 经常使用到行转列上,早期的代码里这个函数用的会比较多,但是可惜在12c中,这个函数已经过期了: WM_CONCAT is gone in 12c. Use LISTAGG instead ...
  • 导致程序出现错误,为了减轻程序员修改程序的工作量,只有通过手工创建个wm_concat函数,来临时解决该问题,但是注意,即使创建了该函数,在使用的过程中,也需要用to_char(wm_concat())方式,才能完全替代之前的...
  • oracle中替代wm_concat函数的方法

    千次阅读 2017-05-26 10:06:00
    racle数据库中,不许用wm_concat函数,合并列,希望得到与wm_concat 一样的结果: s_type s2 水果 葡萄,哈密瓜,香瓜,火龙果 蔬菜 西兰花,茼蒿,茄子 坚果 核桃,巴旦木 数据如下: create table t_thz_1( n_id number...
  • 导致程序出现错误,为了减轻程序员修改程序的工作量,只有通过手工创建个wm_concat函数,来临时解决该问题,但是注意,及时创建了该函数,在使用的过程中,也需要用to_char(wm_concat())方式,才能完全替代之前的...
  • 虽然其不支持,但是为了方便统计数据,我们是可以重新创建该函数的,或者,我们也可以使用其替代函数,listagg,下面我们就这两种方式分别写出对应解决方案 2、解决方案 2.1创建wm_concat函数 --首先使用dba...
  • Oracle wm_concat函数 转换成MySQL的函数

    千次阅读 2016-10-25 09:54:18
    Oracle wm_concat函数 转换成MySQL的函数 (勿喷,只为自己以后复习) 之前在一个项目中用Oracle数据库,其中有段sql是这样的: select wm_concat('"' || d.name || '":"' || d.code || '"') as resvalue, d....
  • 导致程序出现错误,为了减轻程序员修改程序的工作量,只有通过手工创建个wm_concat函数,来临时解决该问题,但是注意,及时创建了该函数,在使用的过程中,也需要用to_char(wm_concat())方式,才能完全替代之前的...
  • 在oracle12C上创建wm_concat函数

    千次阅读 2017-05-02 11:27:26
    导致程序出现错误,为了减轻程序员修改程序的工作量,只有通过手工创建个wm_concat函数,来临时解决该问题,但是注意,及时创建了该函数,在使用的过程中,也需要用to_char(wm_concat())方式,才能完全替代之前的...
  • 在Oracle 上补充创建wm_concat函数

    千次阅读 2017-02-23 08:55:09
    导致程序出现错误,为了减轻程序员修改程序的工作量,只有通过手工创建个wm_concat函数,来临时解决该问题,但是注意,及时创建了该函数,在使用的过程中,也需要用to_char(wm_concat())方式,才能完全替代之前的...
  • create or replace TYPE zh_concat_im AUTHID CURRENT_USER AS OBJECT (  CURR_STR VARCHAR2(32767),  STATIC FUNCTION ODCIAGGREGATEINITIALIZE(SCTX IN OUT zh_concat_im) RETURN NUMBER,  MEMBER FUNCTIO
  • 大家用oracle数据库里面的wmsys.wm_concat函数有没有遇见过字符串缓冲区太小的情况? 针对这种情况我写了个自定义聚合函数 是clob版的。
  • 由于WMSYS_CONCAT()只适用于oracle10.0及之前的版本,且该oracle函数并不是官方规定的函数,导致在使用的过程中会发生因为oracle数据库版本升级后,该函数失效,从而使得sql语句报错:[Err] ORA-00904: "WM_...
  • 11gr2和12C上已经摒弃了wm_concat函数,当时我们很多程序员在程序中确使用了该函数,导致程序出现错误,为了减轻程序员修改程序的工作量,只有通过手工创建个wm_concat函数,来临时解决该问题,但是注意,及时创建了...
  • -- wm_concat出现在oracle10g版本中,不仅是加密...-- 将下边的一个type,一个函数的创建脚本执行,就可以构建自己的wm_concat(这里叫zh_concat)。使用方法同wm_concat: -- type: create or replace TYPE ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 475
精华内容 190
关键字:

wm_concat替代函数