ITPUB论坛-中国最专业的IT技术社区

 
 注册
热搜:
查看: 1071|回复: 12

WMSYS.WM_CONCAT 超长了,怎么办啊?求助啊

[复制链接]
论坛徽章:
1
优秀写手
日期:2014-10-28 06:00:13
跳转到指定楼层
1#
发表于 2017-11-24 13:28 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式

               WMSYS.WM_CONCAT(chr(10)|| checkdatetime ||' ' || alias) over(partition by idcard,checkdate2 )


求助,某个sql 用了这个未公开的函数
其中拼接的时候字符串超长 。应该如何解决啊。
  

求职 : 数据库开发
论坛徽章:
17
优秀写手
日期:2014-02-27 06:00:13秀才
日期:2017-08-11 15:37:32弗兰奇
日期:2017-07-04 09:16:01秀才
日期:2017-06-29 10:16:48乌索普
日期:2017-05-26 08:58:24娜美
日期:2017-05-18 16:07:23ITPUB15周年纪念
日期:2017-05-02 15:22:36妮可·罗宾
日期:2017-04-06 10:06:19处女座
日期:2016-03-10 09:03:26白羊座
日期:2015-10-09 16:42:50
2#
发表于 2017-11-24 14:00 | 只看该作者
自定义函数, xmlagg

使用道具 举报

回复
论坛徽章:
394
阿斯顿马丁
日期:2014-01-03 13:53:522014年世界杯参赛球队:喀麦隆
日期:2014-07-11 12:10:53马上有对象
日期:2014-04-09 16:19:542014年世界杯参赛球队: 洪都拉斯
日期:2014-06-25 08:25:55itpub13周年纪念徽章
日期:2014-09-28 10:55:55itpub13周年纪念徽章
日期:2014-10-01 15:27:22itpub13周年纪念徽章
日期:2014-10-09 12:04:18马上有钱
日期:2014-10-14 21:37:37马上有钱
日期:2015-01-22 00:39:13喜羊羊
日期:2015-02-20 22:26:07
3#
发表于 2017-11-24 20:40 | 只看该作者
我记得某个版本的oracle已经把参数改为clob了,但这个函数在12c被删除了

使用道具 举报

回复
论坛徽章:
480
榜眼
日期:2015-09-09 10:34:21秀才
日期:2015-11-23 10:03:12秀才
日期:2015-11-23 10:03:12秀才
日期:2015-11-23 10:03:12秀才
日期:2015-11-23 10:03:12秀才
日期:2015-11-23 10:03:12秀才
日期:2015-11-23 10:03:12秀才
日期:2015-11-23 10:03:12状元
日期:2015-11-23 10:04:09举人
日期:2015-11-23 10:04:09
4#
发表于 2017-11-24 22:19 | 只看该作者
11g是CLOB类型的。总之就是不能用这种未公开的黑科技。网上一搜一大把。

使用道具 举报

回复
论坛徽章:
1
优秀写手
日期:2014-10-28 06:00:13
5#
 楼主| 发表于 2017-11-25 10:37 | 只看该作者
求一个解决方法啊
来自安卓客户端来自客户端

使用道具 举报

回复
论坛徽章:
394
阿斯顿马丁
日期:2014-01-03 13:53:522014年世界杯参赛球队:喀麦隆
日期:2014-07-11 12:10:53马上有对象
日期:2014-04-09 16:19:542014年世界杯参赛球队: 洪都拉斯
日期:2014-06-25 08:25:55itpub13周年纪念徽章
日期:2014-09-28 10:55:55itpub13周年纪念徽章
日期:2014-10-01 15:27:22itpub13周年纪念徽章
日期:2014-10-09 12:04:18马上有钱
日期:2014-10-14 21:37:37马上有钱
日期:2015-01-22 00:39:13喜羊羊
日期:2015-02-20 22:26:07
6#
发表于 2017-11-25 16:50 | 只看该作者
yaksha1 发表于 2017-11-25 10:37
求一个解决方法啊

自定义聚合函数,网上搜一把

使用道具 举报

回复
论坛徽章:
480
榜眼
日期:2015-09-09 10:34:21秀才
日期:2015-11-23 10:03:12秀才
日期:2015-11-23 10:03:12秀才
日期:2015-11-23 10:03:12秀才
日期:2015-11-23 10:03:12秀才
日期:2015-11-23 10:03:12秀才
日期:2015-11-23 10:03:12秀才
日期:2015-11-23 10:03:12状元
日期:2015-11-23 10:04:09举人
日期:2015-11-23 10:04:09
7#
发表于 2017-11-26 09:20 | 只看该作者
yaksha1 发表于 2017-11-25 10:37
求一个解决方法啊

不是都给你链接了吗?

使用道具 举报

回复
论坛徽章:
1
优秀写手
日期:2014-10-28 06:00:13
8#
 楼主| 发表于 2017-11-26 21:41 | 只看该作者
newkid 发表于 2017-11-26 09:20
不是都给你链接了吗?

打不开,换了好几个网络了,打不开这个网址。另外这个函数是不是也不能超过4000字符?

使用道具 举报

回复
论坛徽章:
480
榜眼
日期:2015-09-09 10:34:21秀才
日期:2015-11-23 10:03:12秀才
日期:2015-11-23 10:03:12秀才
日期:2015-11-23 10:03:12秀才
日期:2015-11-23 10:03:12秀才
日期:2015-11-23 10:03:12秀才
日期:2015-11-23 10:03:12秀才
日期:2015-11-23 10:03:12状元
日期:2015-11-23 10:04:09举人
日期:2015-11-23 10:04:09
9#
发表于 2017-11-27 22:53 | 只看该作者
打不开早说,又浪费一个帖子。



drop function listagg_clob;
drop type listagg_clob_t;

create or replace package list_const_p
is
  list_sep varchar2(10) := ',';
end list_const_p;
/
sho err

create type listagg_clob_t as object(
  v_liststring varchar2(32767),
  v_clob       clob,
  v_templob    number,

  static function ODCIAggregateInitialize(
    sctx IN OUT listagg_clob_t
  ) return number,
  member function ODCIAggregateIterate(
    self IN OUT listagg_clob_t, value IN varchar2
  ) return number,
  member function ODCIAggregateTerminate(
    self IN OUT listagg_clob_t, returnValue OUT clob, flags IN number
  ) return number,
  member function ODCIAggregateMerge(
    self IN OUT listagg_clob_t, ctx2 IN OUT listagg_clob_t
  ) return number
);
/
sho err

create or replace type body listagg_clob_t is

static function ODCIAggregateInitialize(sctx IN OUT listagg_clob_t)
return number is
begin
  sctx := listagg_clob_t('', '', 0);
  return ODCIConst.Success;
end;

member function ODCIAggregateIterate(
  self IN OUT listagg_clob_t,
  value IN varchar2
) return number is
begin
  if nvl(lengthb(v_liststring),0) + nvl(lengthb(value),0) <= 4000 then
    self.v_liststring:=self.v_liststring || value || list_const_p.list_sep;
  else
    if self.v_templob = 0 then
      dbms_lob.createtemporary(self.v_clob, true, dbms_lob.call);
      self.v_templob := 1;
    end if;
    dbms_lob.writeappend(self.v_clob, length(self.v_liststring), v_liststring);
    self.v_liststring := value || list_const_p.list_sep;
  end if;
  return ODCIConst.Success;
end;

member function ODCIAggregateTerminate(
  self IN OUT listagg_clob_t,
  returnValue OUT clob,
  flags IN number
) return number is
begin
  if self.v_templob != 0 then
    dbms_lob.writeappend(self.v_clob, length(self.v_liststring), self.v_liststring);
    dbms_lob.trim(self.v_clob, dbms_lob.getlength(self.v_clob) - 1);
  else
    self.v_clob := substr(self.v_liststring, 1, length(self.v_liststring) - 1);
  end if;
  returnValue := self.v_clob;
  return ODCIConst.Success;
end;

member function ODCIAggregateMerge(self IN OUT listagg_clob_t, ctx2 IN OUT listagg_clob_t) return number is
begin
  if ctx2.v_templob != 0 then
    if self.v_templob != 0 then
      dbms_lob.append(self.v_clob, ctx2.v_clob);
      dbms_lob.freetemporary(ctx2.v_clob);
      ctx2.v_templob := 0;
    else
      self.v_clob := ctx2.v_clob;
      self.v_templob := 1;
      ctx2.v_clob := '';
      ctx2.v_templob := 0;
    end if;
  end if;
  if nvl(lengthb(self.v_liststring),0) + nvl(lengthb(ctx2.v_liststring),0) <= 4000 then
    self.v_liststring := self.v_liststring || ctx2.v_liststring;
    ctx2.v_liststring := '';
  else
    if self.v_templob = 0 then
      dbms_lob.createtemporary(self.v_clob, true, dbms_lob.call);
      self.v_templob := 1;
    end if;
    dbms_lob.writeappend(self.v_clob, length(self.v_liststring), self.v_liststring);
    dbms_lob.writeappend(self.v_clob, length(ctx2.v_liststring), ctx2.v_liststring);
    self.v_liststring := '';
    ctx2.v_liststring := '';
  end if;
  return ODCIConst.Success;
end;
end;
/
sho err

CREATE or replace FUNCTION listagg_clob (input varchar2) RETURN clob
PARALLEL_ENABLE AGGREGATE USING listagg_clob_t;
/
sho err

使用道具 举报

回复
论坛徽章:
480
榜眼
日期:2015-09-09 10:34:21秀才
日期:2015-11-23 10:03:12秀才
日期:2015-11-23 10:03:12秀才
日期:2015-11-23 10:03:12秀才
日期:2015-11-23 10:03:12秀才
日期:2015-11-23 10:03:12秀才
日期:2015-11-23 10:03:12秀才
日期:2015-11-23 10:03:12状元
日期:2015-11-23 10:04:09举人
日期:2015-11-23 10:04:09
10#
发表于 2017-11-28 04:36 | 只看该作者
补上用法示例:

SELECT listagg_clob(n)
  FROM (SELECT LEVEL n FROM DUAL CONNECT BY LEVEL<=10);

LISTAGG_CLOB(N)
-------------------------
1,2,3,4,5,6,7,8,9,10

缺省的分隔符是逗号。假如要改成其他,比如冒号:

exec list_const_p.list_sep := ':';

再执行:

SELECT listagg_clob(n)
  FROM (SELECT LEVEL n FROM DUAL CONNECT BY LEVEL<=10);

LISTAGG_CLOB(N)
------------------------------
1:2:3:4:5:6:7:8:9:10

1人打赏

使用道具 举报

回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则

TOP技术积分榜 社区积分榜 徽章 团队 统计 知识索引树 积分竞拍 文本模式 帮助
  ITPUB首页 | ITPUB论坛 | 数据库技术 | 企业信息化 | 开发技术 | 微软技术 | 软件工程与项目管理 | IBM技术园地 | 行业纵向讨论 | IT招聘 | IT文档 |
  | | |
CopyRight 1999-2011 itpub.net All Right Reserved. 北京盛拓优讯信息技术有限公司版权所有 联系我们 网站律师 隐私政策 知识产权声明
 北京市公安局海淀分局网监中心备案编号:11010802021510 广播电视节目制作经营许可证:编号(京)字第1149号
  
快速回复 返回顶部 返回列表