§ GreatSQL 高兼容


GreatSQL 实现 100% 完全兼容 MySQL 及 Percona 用法,支持大多数常见 Oracle 用法,包括 数据类型兼容函数兼容SQL 语法兼容存储程序兼容 等众多兼容扩展用法。

§ Oracle 兼容设计思路概述

GreatSQL 对 Oracle 兼容处理的优先原则如下:

  • GreatSQL 风格的 SQL 和存储程序可以直接在默认 SQL MODE 模式下工作。
  • 与 GreatSQL 风格的 SQL 和存储程序不冲突的 Oracle 兼容功能也可以直接在默认 SQL MODE 模式下工作。
  • 与 GreatSQL 风格的 SQL 和存储程序存在语法或语义冲突的功能,需要用户显式切换到 Oracle MODE 模式下才能工作。

GreatSQL 对 Oracle 的兼容主要通过以下三种不同方案来实现:

  • 原生模式:Oracle、GreatSQL 都支持或部分支持通用的 SQL 标准,对于部分简单语句,无需调整即可兼容。
  • 兼容扩展:GreatSQL 对于部分 Oracle 独有的函数和语法,在 GreatSQL 的 Server 层实现对其扩展,如:MERGE INTOCONNECT BY,这些类型的兼容特性无需额外设定 SQL MODE,直接使用即可。
  • 兼容模式:在 GreatSQL 中设置 SET sql_mode = ORACLE; 即可将当前会话切换到 Oracle 兼容模式。在该模式下,当 Oracle 语法与 GreatSQL 语法存在语法或语义上的冲突时,GreatSQL 会自行选择 Oracle 兼容模式。

更多关于 Oracle 兼容模式的说明请查看文档:Oracle mode

§ 数据类型兼容

在 GreatSQL 中,采用映射方式实现数据类型兼容,这属于 扩展兼容(无需设定 sql_mode 方案。具体实现方式为:简单别名,即:在解析阶段将关键词进行替换。例如:如果使用 CLOB 创建的表,在系统内会被转换成 LONGTEXT。

具体实现的映射包括:

Oracle 类型 GreatSQL 类型 兼容程度
CLOB LONGTEXT 简单别名
NUMBER DECIMAL 简单别名
VARCHAR2 VARCHAR 简单别名
PLS_INTEGER INT 简单别名

示例:

greatsql> CREATE TABLE t1(
id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, 
c1 CLOB NOT NULL DEFAULT '', 
c2 VARCHAR2(30) NOT NULL DEFAULT '');
ERROR 1101 (42000): BLOB, TEXT, GEOMETRY or JSON column 'c1' can't have a default value

greatsql> CREATE TABLE t1(
id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, 
c1 CLOB NOT NULL, 
c2 VARCHAR2(30) NOT NULL DEFAULT '');
Query OK, 0 rows affected (0.25 sec)

greatsql> SHOW CREATE TABLE t1\G
*************************** 1. row ***************************
       Table: t1
Create Table: CREATE TABLE `t1` (
  `id` int unsigned NOT NULL AUTO_INCREMENT,
  `c1` longtext NOT NULL,
  `c2` varchar(30) NOT NULL DEFAULT '',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
1 row in set (0.01 sec)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22

更详细信息请参考 数据类型兼容

§ SQL 语法兼容

§ 扩展兼容支持的 SQL 语法

下面是在 GreatSQL 中无需设定 sql_mode = ORACLE 就能支持的 SQL 语法:

§ 兼容模式支持的 SQL 语法

下面是在 GreatSQL 中需要先设定 sql_mode = ORACLE 才能支持的 SQL 语法:

§ 函数兼容

§ 扩展兼容支持的函数

下面是在 GreatSQL 中无需设定 sql_mode = ORACLE 就能支持的函数:

§ 兼容模式支持的函数

下面是在 GreatSQL 中需要先设置 sql_mode = ORACLE 才能支持的函数:

注意:以上函数在设定 sql_mode = ORACLE 后,行为与 Oracle 会更加接近;反之则保持 GreatSQL 的原生行为。

§ 存储程序兼容

GreatSQL 支持 Oracle 风格的存储程序使用方式,部分存储程序在 ORACLE 模式下做了基础结构改造,详见:存储程序基础结构改造说明

§ 扩展兼容支持的存储程序

下面是在 GreatSQL 中,无论 sql_mode 采用 DEFAULT 还是 ORACLE,都能支持 CREATE OR REPLACE 扩展,但是在不同模式下的表现也有所区别。

§ 兼容模式支持的存储程序

下面是需要先设定 sql_mode = ORACLE 才能支持 Oracle 兼容的存储程序用法(部分用法在 sql_mode = DEFAULT 模式下也支持,但不具备 Oracle 兼容特性)

示例:

  • Oracle 环境下的存储程序用法:
CREATE OR REPLACE EDITIONABLE FUNCTION f0(delta INT DEFAULT 0) RETURN TIMESTAMP AS
    cnt INT := 10;
BEGIN
    RETURN SYSDATE + delta*cnt;
END;

SELECT f0(2) FROM DUAL ;
SELECT f0() FROM DUAL ;
1
2
3
4
5
6
7
8
  • GreatSQL 原生模式下的存储程序用法:
CREATE OR REPLACE FUNCTION f1(delta INT) RETURNS TIMESTAMP
BEGIN
    DECLARE cnt INT DEFAULT 10;
    SET delta = cnt * delta;
    RETURN DATE_ADD(SYSDATE(), INTERVAL delta DAY);
END;

SELECT f0(2) FROM DUAL ;
1
2
3
4
5
6
7
8
  • GreatSQL 兼容模式 下存储程序用法:
SET sql_mode = ORACLE;

CREATE OR REPLACE FUNCTION f0(delta INT DEFAULT 0) RETURN TIMESTAMP AS
    cnt INT := 10;
BEGIN
    RETURN SYSDATE + delta*cnt;
END;

SELECT f0(2) FROM DUAL ;
SELECT f0() FROM DUAL ;
1
2
3
4
5
6
7
8
9
10

Oracle 兼容常见问题详见:Oracle 兼容常见问题

扫码关注微信公众号

greatsql-wx