不得了!这个国产数据库居然实现了Oracle聚合函数vm_concat

本文主要是介绍不得了!这个国产数据库居然实现了Oracle聚合函数vm_concat,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

熟悉Oracle的朋友一定听过或者用过这个聚合函数vm_concat。说到这个函数,含泪的讲,给我们带来了很多故障,当然都是客户开发商的人员不了解Oracle版本变化带来的问题。

是的,实际上Oracle 11g之后就不再推荐使用这个函数了,在处理varchar2的时候会导致temp使用暴涨。

然而,很多应用程序在12c或19c中可能自定义了类似wm_concat的函数,例如 my_wm_concat。这些函数被广泛使用在应用程序中。当这些应用程序的数据库迁移到国产数据库如MogDB时,如果希望数据库层面兼容而不修改应用代码,通常迁移工具只能做语句规则替换;要么我们就需要实现函数兼容。

在开源PostgreSQL版本中有string_agg函数实现类型功能,MogDB中除了支持string_agg之外,同时还支持listagg(是的,你没有看错,兼容Oracle 12c的listagg函数),也自带了wm_concat。但需要注意一点的是,MogDB中vm_concat函数不支持像oracle一样的synonym给个别名,需要创建函数。

这里给大家简单分享一下:

MogDB=# \da+ wm_concatList of aggregate functionsSchema   |   Name    | Result data type | Argument data types | Description
------------+-----------+------------------+---------------------+-------------pg_catalog | wm_concat | text             | text                |
(1 row)SELECT p.proname AS function_name,pg_catalog.pg_get_function_result(p.oid) AS result_type,pg_catalog.pg_get_function_arguments(p.oid) AS argument_types,CASEWHEN p.proisagg THEN 'agg'ELSE 'normal'END AS function_type,a.aggtransfn,a.aggfinalfnFROM pg_catalog.pg_proc p
LEFT JOIN pg_catalog.pg_namespace n ON n.oid = p.pronamespace
LEFT JOIN pg_catalog.pg_aggregate a ON a.aggfnoid = p.oidWHERE a.aggfnoid IS NOT NULLAND p.proname like 'wm_concat%';function_name | result_type | argument_types | function_type |      aggtransfn      |      aggfinalfn
---------------+-------------+----------------+---------------+----------------------+----------------------wm_concat     | text        | text           | agg           | vm_concat_state_func | vm_concat_final_funcSELECT p.proname AS function_name,pg_catalog.pg_get_function_result(p.oid) AS result_type,pg_catalog.pg_get_function_arguments(p.oid) AS argument_types,CASEWHEN p.proisagg THEN 'agg'ELSE 'normal'END AS function_type,a.aggtransfn,a.aggfinalfnFROM pg_catalog.pg_proc p
LEFT JOIN pg_catalog.pg_namespace n ON n.oid = p.pronamespace
LEFT JOIN pg_catalog.pg_aggregate a ON a.aggfnoid = p.oidWHERE a.aggfnoid IS NOT NULLAND p.proname like 'string_agg%';function_name | result_type | argument_types | function_type |        aggtransfn        |        aggfinalfn
---------------+-------------+----------------+---------------+--------------------------+--------------------------string_agg    | text        | text, text     | agg           | string_agg_transfn       | string_agg_finalfnstring_agg    | bytea       | bytea, bytea   | agg           | bytea_string_agg_transfn | bytea_string_agg_finalfn
(2 rows)SELECT p.proname AS function_name,pg_catalog.pg_get_function_result(p.oid) AS result_type,pg_catalog.pg_get_function_arguments(p.oid) AS argument_types,CASEWHEN p.proisagg THEN 'agg'ELSE 'normal'END AS function_type,a.aggtransfn,a.aggfinalfnFROM pg_catalog.pg_proc p
LEFT JOIN pg_catalog.pg_namespace n ON n.oid = p.pronamespace
LEFT JOIN pg_catalog.pg_aggregate a ON a.aggfnoid = p.oidWHERE a.aggfnoid IS NOT NULLAND p.proname like 'listagg%';function_name | result_type |          argument_types           | function_type |             aggtransfn              |    aggfinalfn
---------------+-------------+-----------------------------------+---------------+-------------------------------------+------------------listagg       | text        | text, text                        | agg           | list_agg_transfn                    | list_agg_finalfnlistagg       | text        | text                              | agg           | list_agg_noarg2_transfn             | list_agg_finalfnlistagg       | text        | smallint, text                    | agg           | int2_list_agg_transfn               | list_agg_finalfnlistagg       | text        | smallint                          | agg           | int2_list_agg_noarg2_transfn        | list_agg_finalfnlistagg       | text        | integer, text                     | agg           | int4_list_agg_transfn               | list_agg_finalfnlistagg       | text        | integer                           | agg           | int4_list_agg_noarg2_transfn        | list_agg_finalfnlistagg       | text        | bigint, text                      | agg           | int8_list_agg_transfn               | list_agg_finalfnlistagg       | text        | bigint                            | agg           | int8_list_agg_noarg2_transfn        | list_agg_finalfnlistagg       | text        | real, text                        | agg           | float4_list_agg_transfn             | list_agg_finalfnlistagg       | text        | real                              | agg           | float4_list_agg_noarg2_transfn      | list_agg_finalfnlistagg       | text        | double precision, text            | agg           | float8_list_agg_transfn             | list_agg_finalfnlistagg       | text        | double precision                  | agg           | float8_list_agg_noarg2_transfn      | list_agg_finalfnlistagg       | text        | numeric, text                     | agg           | numeric_list_agg_transfn            | list_agg_finalfnlistagg       | text        | numeric                           | agg           | numeric_list_agg_noarg2_transfn     | list_agg_finalfnlistagg       | text        | date, text                        | agg           | date_list_agg_transfn               | list_agg_finalfnlistagg       | text        | date                              | agg           | date_list_agg_noarg2_transfn        | list_agg_finalfnlistagg       | text        | timestamp without time zone, text | agg           | timestamp_list_agg_transfn          | list_agg_finalfnlistagg       | text        | timestamp without time zone       | agg           | timestamp_list_agg_noarg2_transfn   | list_agg_finalfnlistagg       | text        | timestamp with time zone, text    | agg           | timestamptz_list_agg_transfn        | list_agg_finalfnlistagg       | text        | timestamp with time zone          | agg           | timestamptz_list_agg_noarg2_transfn | list_agg_finalfnlistagg       | text        | interval, text                    | agg           | interval_list_agg_transfn           | list_agg_finalfnlistagg       | text        | interval                          | agg           | interval_list_agg_noarg2_transfn    | list_agg_finalfn
(22 rows)MogDB=# \df string_aggList of functionsSchema   |    Name    | Result data type | Argument data types | Type | fencedmode | propackage | prokind
------------+------------+------------------+---------------------+------+------------+------------+---------pg_catalog | string_agg | bytea            | bytea, bytea        | agg  | f          | f          | fpg_catalog | string_agg | text             | text, text          | agg  | f          | f          | f
(2 rows)MogDB=# select wm_concat(name) from test2;wm_concat
-----------1,2,3
(1 row)MogDB=# select string_agg(name,',') from test2;string_agg
------------1,2,3
(1 row)MogDB=# select string_agg(name,',' order by id desc ) from test2;
select string_agg(name,',' order by id desc ) from test2;string_agg
------------3,2,1
(1 row)MogDB=# select listagg(name,',') within group(order by id desc ) from test2;
select listagg(name,',') within group(order by id desc ) from test2;listagg
---------3,2,1
(1 row)

MogDB中的wm_concat、string_agg、listagg都可以实现类似oracle 中的wm_concat函数功能。

MogDB=# CREATE OR REPLACE FUNCTION pg_catalog.my_wm_concat_state_func (results text, val text)
MogDB-#  RETURNS text
MogDB-#  LANGUAGE sql COST 50 IMMUTABLE
MogDB-#  AS $$ select results || ',' ||val; $$;
CREATE FUNCTION
MogDB=# 
MogDB=#  CREATE OR REPLACE FUNCTION pg_catalog.my_wm_concat_final_func (results text)
MogDB-#  RETURNS text
MogDB-#  LANGUAGE sql COST 111 IMMUTABLE
MogDB-#  AS $$ select substr(results, 2); $$;
CREATE FUNCTION
MogDB=# 
MogDB=# CREATE AGGREGATE pg_catalog.my_wm_concat(text)
MogDB-#  (
MogDB(#    sfunc = pg_catalog.my_wm_concat_state_func,
MogDB(#    stype = text,
MogDB(#    initcond = '',
MogDB(#    FINALFUNC = pg_catalog.my_wm_concat_final_func
MogDB(#  );
CREATE AGGREGATE
MogDB=# 
MogDB=# 
MogDB=# select my_wm_concat(name) from test2;my_wm_concat   
-----------------aaa,bbb,ccc,ddd
(1 row)MogDB=# 

欢迎大家多多体验MogDB,并发现其中的一些乐趣!

关于聚合函数的一些更多内容,详见官方文档:https://docs.mogdb.io/zh/mogdb/v5.0/aggregate-functions

这篇关于不得了!这个国产数据库居然实现了Oracle聚合函数vm_concat的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1030721

相关文章

使用Python实现IP地址和端口状态检测与监控

《使用Python实现IP地址和端口状态检测与监控》在网络运维和服务器管理中,IP地址和端口的可用性监控是保障业务连续性的基础需求,本文将带你用Python从零打造一个高可用IP监控系统,感兴趣的小伙... 目录概述:为什么需要IP监控系统使用步骤说明1. 环境准备2. 系统部署3. 核心功能配置系统效果展

Python实现微信自动锁定工具

《Python实现微信自动锁定工具》在数字化办公时代,微信已成为职场沟通的重要工具,但临时离开时忘记锁屏可能导致敏感信息泄露,下面我们就来看看如何使用Python打造一个微信自动锁定工具吧... 目录引言:当微信隐私遇到自动化守护效果展示核心功能全景图技术亮点深度解析1. 无操作检测引擎2. 微信路径智能获

Python中pywin32 常用窗口操作的实现

《Python中pywin32常用窗口操作的实现》本文主要介绍了Python中pywin32常用窗口操作的实现,pywin32主要的作用是供Python开发者快速调用WindowsAPI的一个... 目录获取窗口句柄获取最前端窗口句柄获取指定坐标处的窗口根据窗口的完整标题匹配获取句柄根据窗口的类别匹配获取句

在 Spring Boot 中实现异常处理最佳实践

《在SpringBoot中实现异常处理最佳实践》本文介绍如何在SpringBoot中实现异常处理,涵盖核心概念、实现方法、与先前查询的集成、性能分析、常见问题和最佳实践,感兴趣的朋友一起看看吧... 目录一、Spring Boot 异常处理的背景与核心概念1.1 为什么需要异常处理?1.2 Spring B

Python位移操作和位运算的实现示例

《Python位移操作和位运算的实现示例》本文主要介绍了Python位移操作和位运算的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一... 目录1. 位移操作1.1 左移操作 (<<)1.2 右移操作 (>>)注意事项:2. 位运算2.1

如何在 Spring Boot 中实现 FreeMarker 模板

《如何在SpringBoot中实现FreeMarker模板》FreeMarker是一种功能强大、轻量级的模板引擎,用于在Java应用中生成动态文本输出(如HTML、XML、邮件内容等),本文... 目录什么是 FreeMarker 模板?在 Spring Boot 中实现 FreeMarker 模板1. 环

Qt实现网络数据解析的方法总结

《Qt实现网络数据解析的方法总结》在Qt中解析网络数据通常涉及接收原始字节流,并将其转换为有意义的应用层数据,这篇文章为大家介绍了详细步骤和示例,感兴趣的小伙伴可以了解下... 目录1. 网络数据接收2. 缓冲区管理(处理粘包/拆包)3. 常见数据格式解析3.1 jsON解析3.2 XML解析3.3 自定义

SpringMVC 通过ajax 前后端数据交互的实现方法

《SpringMVC通过ajax前后端数据交互的实现方法》:本文主要介绍SpringMVC通过ajax前后端数据交互的实现方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价... 在前端的开发过程中,经常在html页面通过AJAX进行前后端数据的交互,SpringMVC的controll

Spring Security自定义身份认证的实现方法

《SpringSecurity自定义身份认证的实现方法》:本文主要介绍SpringSecurity自定义身份认证的实现方法,下面对SpringSecurity的这三种自定义身份认证进行详细讲解,... 目录1.内存身份认证(1)创建配置类(2)验证内存身份认证2.JDBC身份认证(1)数据准备 (2)配置依

利用python实现对excel文件进行加密

《利用python实现对excel文件进行加密》由于文件内容的私密性,需要对Excel文件进行加密,保护文件以免给第三方看到,本文将以Python语言为例,和大家讲讲如何对Excel文件进行加密,感兴... 目录前言方法一:使用pywin32库(仅限Windows)方法二:使用msoffcrypto-too