orafce
orafce
描述Greenplum数据库中的Oracle兼容SQL函数。 这些函数针对PostgreSQL,但也可以在Greenplum数据库中使用。
关于Greenplum数据库的Oracle兼容性函数
用于Greenplum数据库的Oracle兼容性函数基于https://github.com/orafce/orafce上的开源Orafce项目。
可以在Greenplum数据库开源项目的gpcontrib/orafce目录中找到经过修改的Greenplum数据库的Orafce源文件。 源文件包括Orafce 3.6.1版本和对3af70a28f6的其他提交。
以下函数默认情况下在Greenplum数据库中可用,并且不需要安装Oracle兼容性函数:
- sinh
- tanh
- cosh
- decode (更多信息请参考Oracle和Greenplum的实现差异。)
有关使用Oracle兼容性函数的信息,请参阅Orafce项目主页上的文档,网址为https://github.com/orafce/orafce。 Orafce项目中文档的源文件也包含在Greenplum数据库开源项目中。
安装Oracle兼容性函数
使用CREATE EXTENSION SQL命令在每个数据库中安装Oracle兼容性函数。
$ psql -d db_name -c 'CREATE EXTENSION orafce;'
ALTER DATABASE db_name SET search_path = "$user", public, oracle;
要卸载Oracle兼容性函数,请使用DROP EXTENSION SQL命令删除orafce扩展。
$ psql -d db_name -c 'DROP EXTENSION orafce;'
如果要从Greenplum数据库5.x发行版中卸载兼容性函数,请改用以下命令:
$ psql -d db_name -f $GPHOME/share/postgresql/contrib/uninstall_orafunc.sql
Oracle和Greenplum的实现差异
Greenplum数据库中兼容性函数的实现与Oracle实现之间存在一些差异。 如果使用验证脚本,则输出可能与Oracle中的输出不完全相同。 一些区别如下:
- Oracle执行十进制舍入,Greenplum数据库则不:
- 2.00在Oracle中变成2
- Greenplum数据库中的2.00仍为2.00
-
提供的Oracle兼容性函数以不同的方式处理隐式类型转换。
例如,使用decode函数:
decode(expression, value, return [,value, return]... [, default])
Oracle在比较之前自动将表达式和每个值转换为第一个值的数据类型。 Oracle自动将return转换为与第一个结果相同的数据类型。
Greenplum数据库实现将return和default限制为相同的数据类型。 如果可以将值的数据类型转换为表达式的数据类型,则表达式和值可以是不同的类型。 这是隐式完成的。 否则,decode将失败,并出现invalid input syntax错误。 例如:
SELECT decode('a','M',true,false); CASE ------ f (1 row) SELECT decode(1,'M',true,false); ERROR: Invalid input syntax for integer:"M" LINE 1: SELECT decode(1,'M',true,false);
-
bigint格式的数字在Oracle中以科学计数法显示,
但在Greenplum数据库中不是这样:
- 9223372036854775在Oracle中显示为9.2234E + 15
- 9223372036854775在Greenplum数据库中仍为9223372036854775
-
Oracle中的默认日期和时间戳格式与Greenplum数据库中的默认格式不同。
如果执行以下代码:
CREATE TABLE TEST(date1 date, time1 timestamp, time2 timestamp with time zone); INSERT INTO TEST VALUES ('2001-11-11','2001-12-13 01:51:15','2001-12-13 01:51:15 -08:00'); SELECT DECODE(date1, '2001-11-11', '2001-01-01') FROM TEST;
Greenplum数据库返回该行,但是Oracle不返回任何行。
Note: Oracle中返回该行的正确语法是:SELECT DECODE(to_char(date1, 'YYYY-MM-DD'), '2001-11-11', '2001-01-01') FROM TEST
以下是将Oracle兼容函数与PostgreSQL和Greenplum数据库结合使用的区别。
- 从Greenplum数据库Oracle兼容性函数中删除了decode()函数。 Greenplum数据库解析器将decode() - 函数调用转换为case语句。
- Oracle兼容性函数dbms_pipe软件包中的函数仅在Greenplum数据库master主机上执行。
- 没有为Greenplum数据库实现Oracle兼容性函数dbms_alert软件包中的函数。
- Orafce项目中的升级脚本不适用于Greenplum数据库。