HaloDB 的 Oracle 兼容模式

HaloDB 的 Oracle 兼容模式

码农世界 2024-05-31 后端 74 次浏览 0个评论

↑ 关注“少安事务所”公众号,欢迎⭐收藏,不错过精彩内容~

前倾回顾

前面介绍了“光环”数据库的基本情况和安装办法。

  • 哈喽,国产数据库!Halo DB!
  • 三步走,Halo DB 安装指引

    HaloDB是基于原生PG打造的新一代高性能安全自主可控全场景通用型统一数据库。 业内首次创造性的提出插件式内核架构设计,通过配置的方式,适配不同的应用场景,打造全场景覆盖的能力,满足企业大部分数据存储处理需求。从而消除数据孤岛,降低系统复杂度,保护企业既有投资,降低企业成本。同时支持x86、arm等异构平台之间的混合部署。

    或许大家对 Halo DB 在 Oracle 和 MySQL 的兼容性支持方面也非常感兴趣。

    本文将介绍如何开启 HaloDB 的 Oracle 兼容模式,以及基础使用方法。

    HaloDB 的 Oracle 兼容模式

    那么,HaloDB 到底兼容哪些 Oracle 语法、视图、系统包呢?

    这里有一份(部分)清单,可供参考。

    Halo 数据库支持 Oracle 兼容语法:

    • 支持连接符
    • 支持带别名的 UPDATE
    • 支持匿名子查询
    • 支持窗口函数 DISTINCT 操作
    • 支持 DUAL 伪表
    • 支持 SYSDATE/SYSTIMESTAMP
    • 支持 ROWNUM
    • 支持 ROWID
    • 支持 MINUS 操作
    • 支持 DECODE 函数(不限制参数个数)
    • 支持 DBLINK 语法
    • 支持 Oracle 格式的数值输出
    • 支持 VARCHAR2/NUMBER/CLOB/BLOB 数据类型
    • 支持 START WITH/CONNECT BY 语法
    • 支持 IN 的特别语法(例: SELECT * FROM a_table WHERE a IN b)
    • 支持 Oracle 格式的日期类型及运算
    • 支持 LISTAGG/WM_CONCAT 函数
    • 支持 HAVING/GROUP BY 子句顺序互换(即 HAVING 子句可在GROUP BY 之前也可在 GROUP BY 之后)
    • 支持 NULL 与空串的等价转换
    • 支持 Oracle 语法的序列取值
    • 支持 Oracle 语法的 PROCEDURE/FUNCTION/PACKAGE 的创建
    • 支持 ORDER BY 子句中使用列别名
    • 支持 TABLE 函数
    • 支持 MERGE INTO 语法
    • 支持 WITHIN GROUP 语法
    • 支持 Q’ 转义语法
    • 支持 NLS_DATE_FORMAT 参数
    • 支持 Oracle 的常用视图

      Halo 数据库支持 Oracle 兼容的视图:

      • DBA_SEGMENTS
      • PRODUCT_COMPONENT_VERSION
      • USER_CON_COLUMNS
      • USER_CONSTRAINTS
      • USER_IND_COLUMNS
      • USER_OBJECTS
      • USER_PROCEDURES
      • USER_SOURCE
      • USER_TAB_COLUMNS
      • USER_TABLES

        Halo 数据库支持 Oracle 兼容的系统包:

        • DBMS_ALERT
        • DBMS_ASSERT
        • DBMS_OBFUSCATION_TOOLKIT
        • DBMS_OUTPUT
        • DBMS_PIPE
        • DBMS_RANDOM
        • DBMS_UTILITY
        • UTL_FILE
        • UTL_I18N

          等等。

          清单很长,这里就不再列举了,详情可留言,带你进《HaloDB产品吐槽群》。

          开启 HaloDB 的 Oracle 兼容模式

          修改配置文件

          如需开启 Oracle 兼容模式,需要先对数据库配置文件 postgresql.conf 进行调整。

          #database_compat_mode = 'postgresql' --> database_compat_mode = 'oracle'
          #standard_parserengine_auxiliary = 'on' --> standard_parserengine_auxiliary = 'on'
          #transform_null_equals = off --> transform_null_equals = off
          #oracle.use_datetime_as_date = false --> oracle.use_datetime_as_date = true

          其中,

          • database_compat_mode

            该参数表示:

            该参数为枚举类型,表示数据库运行模式。

            默认值为 postgresql,其它可取值包括 oracle 、 mysql 、 sybase 、 sqlserver 、 db2 等。

            • standard_parserengine_auxiliary

              该参数表示:

              是否需要标准编译引擎协同。默认值 on.

              • transform_null_equals

                该参数表示:

                由于针对NULL的任何操作都只会返回NULL,所以要判断一个值是否为NULL一般只能用IS NULL来判断。

                Halo提供了参数 transform_null_equals 来控制是否可以用“=”操作符来判断一个值是否为NULL。

                • oracle.use_datetime_as_date

                  该参数表示:

                  Oracle 的 date 类型带有日期和时间信息,这和Halo的默认设置不同。

                  默认情况下,Halo的date类型只包含日期,datetime类型才包含日期和时间信息。

                  如果想要实现和Oracle相同的date类型,可以将参数use_datetime_as_date设置为true (默认值是 off)。

                  重启 Halo 数据库

                  pg_ctl restart

                  创建 Oracle 扩展

                  针对需要启用 Oracle 解析引擎的数据库创建 Oracle 扩展:

                  需要注意的是:如需采用 oracle 模式,新建库要创建扩展才能使用 oracle 语法。

                  create extension aux_oracle cascade;

                  查看已安装的扩展:

                  halo0root=# \dx
                                                    List of installed extensions
                      Name    | Version |       Schema       |                    Description
                  ------------+---------+--------------------+----------------------------------------------------
                   aux_init   | 1.0     | information_schema | Init Supplementary Extension
                   aux_oracle | 1.8     | public             | Halo Oracle Supplementary Extension
                   pgcrypto   | 1.3     | public             | cryptographic functions
                   plorasql   | 1.0     | pg_catalog         | Oracle Compatibal SQL (PL/SQL) procedural language
                   plpgsql    | 1.0     | pg_catalog         | PL/pgSQL procedural language
                  (5 rows)

                  测试 HaloDB 的 Oracle 兼容模式

                  1. 查看组件产品的版本和状态信息。

                  halo0root=# table product_component_version;
                    product   |      version       |      status
                  ------------+--------------------+------------------
                   Halo 14.10 | 1.0.14.10 (231130) | 64bit Production
                   plpgsql    | 1.0.14.10 (231130) | 64bit Production
                   aux_init   | 1.0                | 64bit Production
                   plorasql   | 1.0                | 64bit Production
                   pgcrypto   | 1.3                | 64bit Production
                   aux_oracle | 1.8                | 64bit Production
                  (6 rows)

                  2. 测试 DBMS_ASSERT 系统包

                  该系统包用于对输入值的属性进行验证。

                  ENQUOTE_NAME 方法表示用双引号引用字符串,并检查其是否为合法的SQL标识符。

                  halo0root=# SELECT DBMS_ASSERT.ENQUOTE_NAME('Hello, HaloDB');
                    enquote_name
                  -----------------
                   "hello, halodb"
                  (1 row)

                  halo0root=# SELECT DBMS_ASSERT.ENQUOTE_NAME('Hello, HaloDB', false);
                    enquote_name
                  -----------------
                   "Hello, HaloDB"
                  (1 row)

                  3. 验证和Oracle相同的date类型

                  确认 oracle.use_datetime_as_date 参数已开启。

                  halo0root=# show oracle.use_datetime_as_date;
                   oracle.use_datetime_as_date
                  -----------------------------
                   on
                  (1 row)

                  验证步骤如下:

                  halo0root=# create table t (a date, b datetime);
                  CREATE TABLE
                  halo0root=# insert into t select now(),now();
                  INSERT 0 1
                  halo0root=# table t;
                            a          |          b
                  ---------------------+---------------------
                   2024-05-28 12:09:11 | 2024-05-28 12:09:11
                  (1 row)

                  总结

                  到此,我们介绍了如何开启 HaloDB 的 Oracle 兼容模式,并做了简单验证。

                  如果你也对这款“光环”数据库感兴趣,欢迎转发、留言。

                  🌻 往期精彩 ▼

                  • 哈喽,国产数据库!Halo DB!
                  • 从 PG 技术峰会南京站汲取的那些干货
                  • PG 扩展推荐:pgpasswd & PG 密碼長度
                  • 即将告别PG 12,建议升级到PG 16.3版本
                  • PG Style! 盘点几个常用的 Postgres 环境变量
                  • 后 EL 7 时代,PG 16 如何在 CentOS 7 上运行

                    -- / END / --

                    HaloDB 的 Oracle 兼容模式

                    如果这篇文章为你带来了灵感或启发,就请帮忙点『赞』or『在看』or『转发』吧,感谢!(๑˃̵ᴗ˂̵)

本文由 mdnice 多平台发布

转载请注明来自码农世界,本文标题:《HaloDB 的 Oracle 兼容模式》

百度分享代码,如果开启HTTPS请参考李洋个人博客
每一天,每一秒,你所做的决定都会改变你的人生!

发表评论

快捷回复:

评论列表 (暂无评论,74人围观)参与讨论

还没有评论,来说两句吧...

Top