有不少人问兼容实现的问题,其他数据库上的应用在向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,其实也根本无法灵活的使用。
兼容先要定义目标,兼容哪些,到什么程度,琐碎无聊却又很不容易的工作,以什么为依据确定呢?
想完整实现函数兼容,需要先修改这个呆板的函数调用体系,或者适应它,选择部分兼容。
如果允许,尽量根据现有应用使用情况选择部分兼容吧。
太复杂,展开了写估计没法完成,泛泛而谈没什么意义,就当是一个老家伙的啰嗦吧。