首页 > 数据库 >oracle添加字符串连接聚合函数wm_concat

oracle添加字符串连接聚合函数wm_concat

时间:2022-11-08 17:45:45浏览次数:37  
标签:join string wm impl oracle self concat

自从oracle新版废弃了wm_concat函数后,各种不方便,网上搜索到的自定义聚合函数也是问题多多,例如用varchar2(32767)定义返回值类型,4000会超,32767不一样会超吗?所以最终用clob类型返回才是最终解决方案,你说会慢?慢就慢点,总比无法实现的好,用xmlagg替代的方案更要慢死人。

废话不多说了,上代码

create or replace type wm_concat_impl as object
(
  join_string clob,
  static function ODCIAggregateInitialize(sctx IN OUT wm_concat_impl) 
    return number,
  member function ODCIAggregateIterate(self IN OUT wm_concat_impl, 
    value IN varchar2) return number,
  member function ODCIAggregateTerminate(self IN wm_concat_impl, 
    returnValue OUT clob, flags IN number) return number,
  member function ODCIAggregateMerge(self IN OUT wm_concat_impl, 
    ctx2 IN wm_concat_impl) return number
);

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);
	dbms_lob.createtemporary(sctx.join_string, true);
  return ODCIConst.Success;
end;

member function ODCIAggregateIterate(self IN OUT wm_concat_impl, value IN varchar2) 
return number is
begin
  if(dbms_lob.getlength(self.join_string) > 0)then
	  dbms_lob.append(self.join_string,',');
	end if;
	dbms_lob.append(self.join_string,value);
  return ODCIConst.Success;
end;

member function ODCIAggregateTerminate(self IN wm_concat_impl, returnValue OUT 
clob, flags IN number) return number is
begin
  returnValue := self.join_string;
  return ODCIConst.Success;
end;

member function ODCIAggregateMerge(self IN OUT wm_concat_impl, ctx2 IN 
wm_concat_impl) return number is
begin
  if(dbms_lob.getlength(self.join_string) > 0 and dbms_lob.getlength(ctx2.join_string) > 0) then
    dbms_lob.append(self.join_string,',');
	  dbms_lob.append(self.join_string,ctx2.join_string);
	elsif(dbms_lob.getlength(ctx2.join_string) > 0) then
	  self.join_string := ctx2.join_string;
	end if;
  return ODCIConst.Success;
end;
end;

create or replace FUNCTION wm_concat (input varchar2) RETURN clob 
PARALLEL_ENABLE AGGREGATE USING wm_concat_impl;

  

标签:join,string,wm,impl,oracle,self,concat
From: https://www.cnblogs.com/qldsrx/p/16870555.html

相关文章

  • mybatis中oracle的merge语句示例
    mergeinto在mybatismapper.xml中的用法示例<updateid="mergeTask"parameterType="java.util.List">MERGEINTODM_TASKaUSING(<forea......
  • Oracle、MySQL等数据库故障处理优质文章分享 | 10月汇总
    墨天轮社区于9月起持续举办【聊聊故障处理那些事儿】DBA专题征文活动,每月进行评优发奖,鼓励大家记录工作中遇到的数据库故障处理过程,不仅用于自我复盘与分析,同时也能帮助其......
  • kotlin中ViewModel + ViewBinding使用实例
    android使用androidx后可以使用viewbinding了,因为是内生库,也蛮好用的。butterknife感觉已经在退环境了。文章列出ViewModel+ViewBinding,是MVVM模式的简单使用,没有涉及......
  • Oracle ASM Filter Driver
       OracleASMFilterDriver(asmfd)是oracle12c gi开始提供的一个内核模块位于oracleasmdiskio请求路径之中,asmfd屏蔽任何非oracle产生的io写请求,降低了o......
  • Archlinux + Dwm 配置流程
    本着学习C的态度来了解dwm,本身作为一个i3wm的追崇者,与dwm会擦出怎么样的火花呢?下载安装dwmarchlinuxcn源配置编辑/etc/pacman.conf文件,添加bfsu的archlinuxcn源sudovi......
  • 事件10841解决oracle 9i中JDBC Thin Driver ORA-00600 [ttcgcshnd-1]的异常
    文档课题:事件10841解决oracle9i中JDBCThinDriverORA-00600ttcgcshnd-1的异常.用thindriver连接Oracle9i时,出现exception,如下所示java.sql.SQLException:ORA-00600:......
  • Oracle 字符集
    查看Oracle字符集:SQL>select*fromnls_database_parameters;PARAMETERVALUE----------------------------------------------------------------------------------......
  • oracle emcc 部署
             Oracleenterprisemanagercloudcontrol(emcc)是用于oracle数据库性能管理,实现数据库运营自动化的平台,主要使用场景包括:a、发现、修复和验证数据库......
  • oracle单独禁止A用户修改B用户密码
    一、创建触发器A用户下创建触发器:SQL>conna/oracleConnected.SQL>createorreplacetriggerdb_operator.NO_PASSWD_CHANGE_FOR_Bbeforealterondatabasedec......
  • PLSQL中查询Oracle数据显示科学计数法的解决方法
    PL/SQL查询时,如果Number(17)以上的大数,会显示为科学计数法解决方法:TOOLS->PREFERENCES->WINDOWTYPE->SQLWINDOW下选中Numberfieldsto_char即可。......