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兼容性函数:

有关使用Oracle兼容性函数的信息,请参阅Orafce项目主页上的文档,网址为https://github.com/orafce/orafce。 Orafce项目中文档的源文件也包含在Greenplum数据库开源项目中。

安装Oracle兼容性函数

Note: 始终使用Greenplum数据库版本随附的Oracle兼容性函数模块。 在升级到新的Greenplum数据库版本之前,请从每个数据库中卸载兼容性函数,然后,在升级完成后, 从新的Greenplum数据库版本中重新安装兼容性函数。 有关升级先决条件和步骤,请参阅Greenplum数据库发行说明。

使用CREATE EXTENSION SQL命令在每个数据库中安装Oracle兼容性函数。

$ psql -d db_name -c 'CREATE EXTENSION orafce;'
Note: 某些Oracle兼容性函数位于oracle模式中。 要访问它们,请为数据库设置搜索路径以包括oracle模式名称。 例如,此命令设置数据库的默认搜索路径以包括oracle模式:
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数据库实现将returndefault限制为相同的数据类型。 如果可以将值的数据类型转换为表达式的数据类型,则表达式和值可以是不同的类型。 这是隐式完成的。 否则,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数据库。