【openGauss】openGauss补完计划一之ORACLE兼容函数

一、前言

2021年12月23号到2021年12月24号的数据技术嘉年华直播中,不少国产数据库厂商都在说兼容oracle的语法到了百分之多少。我想着,既然都说兼容,那我能不能直接把我之前写的一些奇奇怪怪的功能给移植到这些数据库上去?
稍微研究了一下这些国产数据库,发现很多都是基于mysql或者postgresql。也就是说,理论上,只要某个基于postgresql的数据库做了兼容oracle的相关对象,那么理论上也应该能移植到另一个基于postgresql的数据库上去。
但一个人去对比这么多数据库扣那几百上千个对象的代码,工程量巨大,还不如自己针对某一个数据库,挑几个它缺的写写。
刚好近期有报道,openGauss进入了国家计算机等级考试
重磅消息,openGauss纳入全国计算机等级考试!

所以我开了这个新坑,打算给openGauss写写兼容oracle的sql的函数及过程。

另外,由于不清楚是否有人在做和我同样的事,如果有,为避免重复造轮子,请及时和我联系。

注意,本计划目的为个人学习,不涉及商业行为,可能最后无法100%完成。

二、分析

首先,openGauss官方有提供ORACLE语法的兼容包compat-tools,包含了oracle里有的静态视图及大部分函数,还有几个dbms包。
compat-tools开源地址https://gitee.com/enmotech/compat-tools

所以,我可以参考着这个项目的写法,补上一些我以前有用过但compat-tools里没有的东西。

但是要注意的是,这种兼容包的目的是sql兼容,原理只是使用plsql代码,利用现有pg数据库内自带的函数进行转换,在逻辑上符合oracle输出的结果,是没有底层的专用优化算法的,所以查询效率不一定会快。要效率快,不能仅仅是在plsql层面来模拟逻辑,而应该在数据库进行内置(即全局可用的那种函数,而非仅仅是一个模式下的对象)或者用C函数。刚刚才开始看pg的内容,我暂时还做不到那个层面。

我在本地docker里开了个openGauss,然后打上compat-tools,查询dba_objects中的所有function名称,导出成表格。然后从oracle官网的21c-sql参考文档,把function名称全部复制下来,放到xlsx表格里,用vlookup函数匹配oracle有但openGauss没有的函数。

在比较过程中发现,有些postgresql自带的函数,在dba_objects中查不到,比如cast、least、greast、nullif、nvl等,所以需要剔除了这些函数后再进行比较。一比,发现有两百个函数在openGauss中是缺少的。然后我逐个去看这些函数,

  1. 一堆json和xml的相关处理函数,这些需要统一分析,先排除,
  2. 一堆近似算法的函数,这个属于底层机制,不能在plsql层面上实现,所以也剔除
  3. 有很多oracle内部对象的专用处理函数,这些在openGauss里也用不上
  4. 有很多机器学习的函数,但openGauss里有另一套机制,所以也用不上

经过一系列排除后,得到以下清单

ANY_VALUE
ASCIISTR
BFILENAME
BIN_TO_NUM
COSH
KURTOSIS_POP
KURTOSIS_SAMP
LNNVL
NUMTOYMINTERVAL
RATIO_TO_REPORT
ROUND_TIES_TO_EVEN (number)
SINH
SKEWNESS_POP
SKEWNESS_SAMP
SOUNDEX
STANDARD_HASH
SYSTIMESTAMP
TANH
UNISTR

可以发现,这些函数里有不少是我的系列文章“收集一些较为少见但很有用的SQL函数及写法”中有提到的

这里面有不少函数要全新写逻辑会相当复杂,所以我会先从简单的开始写起。

另外,还有对dbms包的兼容,这个会更麻烦,之后会另起一篇文章进行介绍。

三、计划进度

如果本计划进度有更新,会优先在本文的原文地址先更新

函数名称功能描述进度完成日期
ANY_VALUE聚合函数,取任意值完成20220101
ASCIISTR获得字符串的ascii码完成20211229
BFILENAME获得操作系统上的一个文件作为对象
BIN_TO_NUM二进制转数字完成20211229
COSH双曲余弦完成20211230
KURTOSIS_POP总体峰态完成20220103
KURTOSIS_SAMP样本峰态完成20220103
LNNVL避免表达式中有空值导致统计遗漏的一个函数完成20220101
NUMTOYMINTERVAL将数字转换成年月INTERVAL完成20211230
RATIO_TO_REPORT分析函数,取本值占分组的百分比
ROUND_TIES_TO_EVEN (number)区别于round的另一种四舍五入完成20211229
SINH双曲正弦完成20211230
SKEWNESS_POP总体偏度完成20220103
SKEWNESS_SAMP样本偏度完成20220103
SOUNDEX发音相似完成20211230
STANDARD_HASH标准哈希完成20211229
SYSTIMESTAMP当前时间戳完成20211229
TANH双曲正切完成20211230
UNISTR将unicode编码转换成文字字符串完成20211229
以下为相较于第一版的新增部分
BIT_AND_AGG位与聚合完成20211231
BIT_OR_AGG位或聚合完成20211231
BIT_XOR_AGG位异或聚合完成20211231
REMAINDER取任何数相除的余数(和mod不一样,不会进行floor)完成20220102
BITOR位或完成20211231
BITXOR位异或完成20211231

项目代码下载

https://gitee.com/darkathena/opengauss-oracle

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

DarkAthena

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值