作者:王颖泽
从事国产数据库产品管理、内核研发工作多年
获得PostgreSQL社区MVP
红象数据库是由RedElephant2020团队在开源PostgreSQL的基础上研发的一款以去O为目标的数据库产品。
这款产品的设计初衷是将应用程序使用的各类Oracle数据库对象及数据平滑地迁移至红象数据库,并利用PostgreSQL生态中经过大规模部署、使用和验证的接口、工具、扩展、方案等,在进行二次开发基础上为用户提供专业化的数据库服务,从而达到替换Oracle的目的。
下面将对红象数据库支持Oracle兼容的内核部分进行详细介绍:
数据类型
支持以下兼容Oracle的数据类型:
类型分类 | 描述 |
字符类型 | CHAR、VARCHAR、VARCHAR2(支持CHAR或BYTE)、LONG |
数值类型 | NUMBER、BINARY_FLOAT、BINARY_DOUBLE |
日期类型 | DATE |
时间戳类型 | TIMESTAMP、TIMESTAMP WITH TIME ZONE、TIMESTAMP WITH LOCAL TIME ZONE |
间隔类型 | INTERVAL YEAR TO MONTH、INTERVAL DAY TO SECOND |
大对象类型 | CLOB、BLOB |
二进制类型 | RAW、LONG RAW |
其他 | ROWID、UROWID |
红象数据库实现了兼容Oracle的大部分内置数据类型,不仅实现类型的输入、输出函数,还实现了转换、比较、操作符等函数。
内置函数
支持以下兼容Oracle内置函数:
内置函数分类 | 描述 |
正则表达式函数 | regexp_substr、regexp_replace、regexp_like、regexp_count、regexp_count、regexp_match、regexp_extract |
操作符 | .,+,?,*,{m},{m,},{m,n},[...],[^...],|,(...),\n,\,^,$,[:class],[.element.],[=character=] |
转换函数 | to_char、to_date、to_timestamp、to_timestamptz、to_number、to_yminterval、to_dsinterval、rawtohex、rowidtochar、chartorowid、numtoyminterval、numtodsinterval |
聚集函数 | max、min、avg、sum |
数学函数 | stddev、stddev_pop、stddev_samp、var_pop、var_samp、variance |
字符串函数 | substrb、replace、instrb、length、lengthb、substr、instr |
日期时间函数 | date_part、round、trunc、from_tz、sys_extract_utc、sysdate、sessiontimezone、current_date、current_timestamp、systimestamp、localtimestamp、last_day、add_month、next_day、new_time、tz_offset、months_between |
其他 | decode、nvl、nvl2、wmsys.wm.concat、nlssort |
系统视图
支持以下兼容Oracle的数据系统视图:
all_all_tables all_cons_columns all_constraints all_ind_columns all_indexes all_sequences all_synonyms all_view_columns all_tab_columns all_tables all_triggers all_types all_views | dba_all_tables all_objects dba_cons_columns dba_constraints dba_ind_columns dba_indexes dba_role_privs dba_roles dba_sequences dba_synonyms dba_view_columns dba_tab_columns dba_tables dba_triggers dba_types dba_views dba_objects | user_all_tables user_cons_columns user_constraints user_ind_columns user_indexes user_objects user_role_privs user_sequences user_synonyms user_tab_columns user_tables user_triggers user_types user_view_columns user_views user_tab_comments user_tab_cols user_col_comments col |
系统包
支持如下系统包:
DBMS_OUTPUT、DBMS_RANDOM、DBMS_ROWIDDBMS_OBFUSCATION_TOOLKIT、DBMS_STATS、DBMS_UTILITY、DBMS_PIPE、DBMS_METADATA、DBMS_ALERT、UTL_FILE
NLS_*参数
支持以下兼容Oracle的NLS_*参数,并可使用PostgreSQL的SET/SHOW语法进行设置和查看:
nls_date_format、mls_timestamp_format、nls_timestamp_tz_format、nls_length_semantics
兼容CREATE语法
兼容Oracle以下数据库系统对象的CREATE语法:
表空间、模式、表/分区表/全局、同义词、索引、序列、约束、视图、物化视图、DBLINK、函数、存储过程、触发器、自定义包、自定义类型等。
兼容伪表/伪列
包括DUAL、ROWNUM、ROWID、INSTANCE、LEVEL。
用户、模式、权限
实例中的每个数据库都默认带有sys和system用户,数据库的系统对象存放在sys模式下
创建用户时,会自动创建所对应的模式
对象属主为对象模式所对应的用户、
支持ANY权限
红象数据库中的库级用户与Oracle中的用户相对应。
高级功能
支持MERGE INTO、CONNECT BY、外连接操作符(+)、全局临时表、自定义包、自定义类型(不支持继承)、DBLINK、语句级回滚、索引启用/禁用、、约束启用/禁用、DDL自动提交、同义词、SQL语句中支持中文空格和括号、数据库编码支持GBK/GB18030、用户锁定和解锁等
PL/SQL功能
支持动态SQL(SELECT…INTO…USING…)、动态SQL的DML语句、游标、集合类型(嵌套表、关联数组、动态数组)及其方法、RECORD类型、%type、%rowtype、sys_refcursor、PLS/INTEGER、存储过程/函数语法、匿名块、函数IN OUT、OUT参数和结果集、匿名块IN、OUT、IN OUT参数的传参、标签Label、Label的多段引用、GOTO、内联函数或嵌套子过程、BULK COLLECT INTO、FORLOOP、FORALL、自定义异常、异常处理RAISE/RASE_APPLICATION_ERROR、Prgma EXCEPTION_INIT、函数/存储过程/包中的SUBTYPE、自治事务、PL/SQL中的语句级回滚、触发器内的占位符(:old、:new),referencing语法,statement判断(inserting、deleting、updating)、包中的公有/私有的类型、变量、函数/存储过程,支持Package Body中的BEGIN、END块、自定义类型中的构造函数、静态函数、方法等、按参数名绑定参数、参数占位符等
后续计划
为了能够实现平滑地替换Oracle这一目标,RedElephant2020团队在开源PostgreSQL的基础上进行了大小上百个功能点的开发。
接下来我们将逐步完善Oracle兼容的其他常用特性:
INSERT FIRST/ALL
PIPELINE函数
CLOB/BLOB/BFILE
VPD(Virtual Private Database)
常用系统包(DBMS_SQL、DBMS_JOB、DBMS_RLS等)
常用系统视图
常用内置函数
TABLE表达式
CURSOR表达式
……
数据库试用下载地址:https://gitee.com/redelephant2020/packages/tree/master/red-pg

了解更多,请点击“阅读原文”