不得了!这个国产数据库居然实现了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

相关文章

C++对象布局及多态实现探索之内存布局(整理的很多链接)

本文通过观察对象的内存布局,跟踪函数调用的汇编代码。分析了C++对象内存的布局情况,虚函数的执行方式,以及虚继承,等等 文章链接:http://dev.yesky.com/254/2191254.shtml      论C/C++函数间动态内存的传递 (2005-07-30)   当你涉及到C/C++的核心编程的时候,你会无止境地与内存管理打交道。 文章链接:http://dev.yesky

通过SSH隧道实现通过远程服务器上外网

搭建隧道 autossh -M 0 -f -D 1080 -C -N user1@remotehost##验证隧道是否生效,查看1080端口是否启动netstat -tuln | grep 1080## 测试ssh 隧道是否生效curl -x socks5h://127.0.0.1:1080 -I http://www.github.com 将autossh 设置为服务,隧道开机启动

【操作系统】信号Signal超详解|捕捉函数

🔥博客主页: 我要成为C++领域大神🎥系列专栏:【C++核心编程】 【计算机网络】 【Linux编程】 【操作系统】 ❤️感谢大家点赞👍收藏⭐评论✍️ 本博客致力于知识分享,与更多的人进行学习交流 ​ 如何触发信号 信号是Linux下的经典技术,一般操作系统利用信号杀死违规进程,典型进程干预手段,信号除了杀死进程外也可以挂起进程 kill -l 查看系统支持的信号

关于如何更好管理好数据库的一点思考

本文尝试从数据库设计理论、ER图简介、性能优化、避免过度设计及权限管理方面进行思考阐述。 一、数据库范式 以下通过详细的示例说明数据库范式的概念,将逐步规范化一个例子,逐级说明每个范式的要求和变换过程。 示例:学生课程登记系统 初始表格如下: 学生ID学生姓名课程ID课程名称教师教师办公室1张三101数学王老师101室2李四102英语李老师102室3王五101数学王老师101室4赵六103物理陈

数据库期末复习知识点

A卷 1. 选择题(30') 2. 判断范式(10') 判断到第三范式 3. 程序填空(20') 4. 分析填空(15') 5. 写SQL(25') 5'一题 恶性 B卷 1. 单选(30') 2. 填空 (20') 3. 程序填空(20') 4. 写SQL(30') 知识点 第一章 数据库管理系统(DBMS)  主要功能 数据定义功能 (DDL, 数据定义语

时序预测 | MATLAB实现LSTM时间序列未来多步预测-递归预测

时序预测 | MATLAB实现LSTM时间序列未来多步预测-递归预测 目录 时序预测 | MATLAB实现LSTM时间序列未来多步预测-递归预测基本介绍程序设计参考资料 基本介绍 MATLAB实现LSTM时间序列未来多步预测-递归预测。LSTM是一种含有LSTM区块(blocks)或其他的一种类神经网络,文献或其他资料中LSTM区块可能被描述成智能网络单元,因为

给数据库的表添加字段

周五有一个需求是这样的: 原来数据库有一个表B,现在需要添加一个字段C,我把代码中增删改查部分进行了修改, 比如insert中也添入了字段C。 但没有考虑到一个问题,数据库的兼容性。因为之前的版本已经投入使用了,再升级的话,需要进行兼容处理,当时脑子都蒙了,转不过来,后来同事解决了这个问题。 现在想想,思路就是,把数据库的表结构存入文件中,如xxx.sql 实时更新该文件: CREAT

vue项目集成CanvasEditor实现Word在线编辑器

CanvasEditor实现Word在线编辑器 官网文档:https://hufe.club/canvas-editor-docs/guide/schema.html 源码地址:https://github.com/Hufe921/canvas-editor 前提声明: 由于CanvasEditor目前不支持vue、react 等框架开箱即用版,所以需要我们去Git下载源码,拿到其中两个主

java中查看函数运行时间和cpu运行时间

android开发调查性能问题中有一个现象,函数的运行时间远低于cpu执行时间,因为函数运行期间线程可能包含等待操作。native层可以查看实际的cpu执行时间和函数执行时间。在java中如何实现? 借助AI得到了答案 import java.lang.management.ManagementFactory;import java.lang.management.Threa

android一键分享功能部分实现

为什么叫做部分实现呢,其实是我只实现一部分的分享。如新浪微博,那还有没去实现的是微信分享。还有一部分奇怪的问题:我QQ分享跟QQ空间的分享功能,我都没配置key那些都是原本集成就有的key也可以实现分享,谁清楚的麻烦详解下。 实现分享功能我们可以去www.mob.com这个网站集成。免费的,而且还有短信验证功能。等这分享研究完后就研究下短信验证功能。 开始实现步骤(新浪分享,以下是本人自己实现