PostgreSQL兼容性函数的实现

有不少人问兼容实现的问题,其他数据库上的应用在向PG迁移的过程中,会发现有很多函数上的差异,比如Sybase的datediff、dateadd,Oracle的add_month、nvl、decode。

以nvl为例,阅读文档和运行验证都可以确定,Oracle函数的输入参数决定着返回值的类型,并且类型间有很好的适配和默认转换体系,可以说nvl这类函数可以接受任意类型的参数输入。反观PG,输入和返回类型是在定义时确定的,不可能像Oracle一样灵活调用,如果应用需要,只有靠枚举入参的方式。

数据在PG内部的类型是datum,本质是指针类型,根据数据类型有不同访问方式,比如 intervel 它表示的是指针,而对于int它直接保存了值。于是对于函数返回值,如果不提前知道它返回什么类型,根本无从知道改怎么处理。datum可以进一步扩展,如果使用JVM表示类型的方式,无疑会更加灵活强大,题外话。

PG函数体系允许可变参数,但入参类型是提前知晓的,finfo没有传递类型,只有datum和isnull,部分特殊情况可以不考虑。decode的实现就是一个例子,枚举是不可行的,除非在迁移过程中一边发现一边创建。

此外anyelment参数问题,看起来很好,但它要求出现在调用时的参数都必须同一种类型,anyelement func(anyelement, anyelement) 三个参数要么全是int,要么全是 text,其实也根本无法灵活的使用。

兼容先要定义目标,兼容哪些,到什么程度,琐碎无聊却又很不容易的工作,以什么为依据确定呢?

想完整实现函数兼容,需要先修改这个呆板的函数调用体系,或者适应它,选择部分兼容。

如果允许,尽量根据现有应用使用情况选择部分兼容吧。

 

太复杂,展开了写估计没法完成,泛泛而谈没什么意义,就当是一个老家伙的啰嗦吧。

转载于:https://my.oschina.net/quanzl/blog/3071440

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值