↑ 關注“少安事務所”公眾號,歡迎?收藏,不錯過精彩內容~
前傾回顧
前面介紹了“光環”數據庫的基本情況和安裝辦法。
-
哈嘍,國產數據庫!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 / --

如果這篇文章為你帶來了靈感或啟發,就請幫忙點『贊』or『在看』or『轉發』吧,感謝!(??????)
本文由 mdnice 多平臺發布