2.7.2.2. OceanBase-Oracle 目标库

本节描述 伪多发 OceanBase-Oracle 目标库的 SQL 兼容情况说明(按源库 MySQL 语法编写)。

目前兼容 OceanBase-Oracle 3.2.3 版本。

2.7.2.2.1. 通用兼容说明

以下范围以统一 SQL 的函数兼容能力为准,详细说明请参考 转换为 OceanBase-Oracle。 同时,多条 DML 语句存在通用约束,若语句中涉及相应功能,则视为不支持:

  1. 表达式中使用 DATE_ADD / DATE_SUB 函数。

  2. 含有 CLOBBLOB 字段的表不支持比对(目标端 OceanBase-Oracle 不支持此类表参与 UNION 操作)。

2.7.2.2.2. INSERT 语句

语法结构

INSERT [IGNORE]
[INTO] tbl_name
[(col_name [, col_name] ...)]
{ {VALUES | VALUE} (value_list) [, (value_list)] ... }
[ON DUPLICATE KEY UPDATE assignment_list]

INSERT [IGNORE]
[INTO] tbl_name
[(col_name [, col_name] ...)]
{ SELECT ... }
[ON DUPLICATE KEY UPDATE assignment_list]

INSERT
[INTO] tbl_name
[(col_name [, col_name] ...)]
with [RECURSIVE]
{new_tbl_name AS ({ SELECT ... }) [, new_tbl_name AS ({ SELECT ... })]}
{ SELECT ... }

value_list:
    value [, value] ...

assignment:
    col_name = values(col_name)

assignment_list:
    assignment [, assignment] ...

支持范围

  • 支持 INSERT [INTO] ... VALUES 单行与多行插入,支持 VALUE 单数形式。

  • 支持省略列列表或仅指定部分列。

  • 支持 INSERT ... SELECT 从查询结果插入。

  • 支持 VALUES 中使用表达式、DEFAULTNULL、函数与标量子查询。

  • 支持 INSERT IGNORE 忽略重复键冲突。

  • 支持 ON DUPLICATE KEY UPDATE 的简单写法(单列更新、VALUES(col) 形式、子查询赋值)。

  • 支持指定单个分区的插入。

不支持的语法特性

  1. LOW_PRIORITYHIGH_PRIORITY 修饰。

  2. INSERT SET 语法。

  3. INSERT ... RETURNING 子句(含列、表达式、函数、别名)。

  4. 指定多个分区的插入。

  5. ON DUPLICATE KEY UPDATE 的复杂写法(多列更新、表达式/函数中别名冲突等)。

  6. INSERT IGNORE 用于忽略数据截断或非法值。

  7. 含有 CLOBBLOB 字段的表执行 INSERT / INSERT IGNORE 在比对场景不支持(目标端无法使用 UNION 结合大字段)。

2.7.2.2.3. REPLACE 语句

语法结构

REPLACE [INTO] tbl_name
[(col_name [, col_name] ...)]
{ {VALUES | VALUE} (value_list) [, (value_list)] ...}

REPLACE
[INTO] tbl_name
[(col_name [, col_name] ...)]
{SELECT ...}

value:
{expr | DEFAULT}

value_list:
    value [, value] ...

assignment:
    col_name = value

assignment_list:
    assignment [, assignment] ...

支持范围

  • 支持 REPLACEREPLACE LOW_PRIORITY 的常规写法。

  • 支持 REPLACE ... VALUESREPLACE ... SELECT

  • 支持在 SELECT 中使用常见日期时间与字符串函数(如 STR_TO_DATEUNIX_TIMESTAMPFROM_UNIXTIMEDAYYEARWEEKOFYEARDAYOFWEEK)。

  • 支持在 SELECT 中使用二进制/大字段相关函数(如 BLOBTINYBLOB)。

不支持的语法特性

  1. 目标端不支持 schema.table 形式的对象引用。

  2. REPLACE ... SELECT 搭配 WITH CTE 的写法。

  3. REPLACE ... SELECT 中使用 LAST_INSERT_ID()

  4. schema 下对象的 REPLACE 语句。

2.7.2.2.4. UPDATE 语句

语法结构

单表更新:

UPDATE [IGNORE] tbl_name
SET assignment_list
[WHERE where_condition]
[ORDER BY {col_name | expr | position}
  [ASC | DESC], ...]
[LIMIT row_count]

多表更新:

UPDATE [IGNORE] table_references
SET assignment_list
[WHERE where_condition]

支持范围

  • 支持 UPDATE LOW_PRIORITYUPDATE IGNORE 与组合写法。

  • 支持单表与多表更新,支持表别名。

  • 支持多列赋值与以下赋值形式:常量、DEFAULTNULL、同表列、算术/字符串表达式、函数、CASE、标量子查询、自增/自减。

  • 支持常见 WHERE 条件:比较运算、IN/NOT INBETWEEN/NOT BETWEENLIKELIKE ... ESCAPEIS NULL/IS NOT NULLEXISTS/NOT EXISTSALL/ANY/SOME 子查询、逻辑组合(AND/OR/XOR/NOT)、括号分组。

  • 支持 ORDER BYLIMIT

  • 支持 JOIN、派生表与括号表引用的多表更新。

不支持的语法特性

  1. 指定分区的更新(单分区或多分区)。

  2. REGEXPNOT REGEXP 条件。

  3. UPDATE IGNORE 用于忽略数据转换错误或截断。

  4. SETWHERE 子查询直接引用被更新表的写法。

2.7.2.2.5. DELETE 语句

语法结构

单表删除:

DELETE [IGNORE]
FROM tbl_name [[AS] table_alias]
[WHERE where_condition]
[ORDER BY {col_name | expr} [ASC | DESC], ...]
[LIMIT row_count]

多表删除:

DELETE tbl_name[.*] [, tbl_name[.*]] ...
FROM table_references
[WHERE where_condition]

支持范围

  • 支持 DELETEDELETE IGNORE

  • 支持 ORDER BY ... LIMIT

  • 支持指定单个分区删除。

  • 支持多表删除(DELETE t1, t2 FROM ...)以及仅删除其中一张表的写法。

  • 支持常见 WHERE 条件:比较运算、IN/NOT INBETWEEN/NOT BETWEENLIKEIS NULL/IS NOT NULLEXISTS/NOT EXISTSALL/ANY 子查询、逻辑组合(AND/OR/NOT)、括号分组。

不支持的语法特性

  1. LOW_PRIORITYQUICK 修饰。

  2. 指定多个分区的删除。

  3. REGEXPNOT REGEXP 条件。

  4. XOR 逻辑运算。

  5. RETURNING 子句(含列、表达式、函数、别名)。

  6. 多表删除中的 USING 语法。

  7. HISTORY 相关删除与系统版本表(history 表)相关语句。