3.3.6. 其他
3.3.6.1. GaussDB-Oracle
3.3.6.1.1. 权限加载生效
语法
FLUSH PRIVILEGES
警告
受配置参数控制,config/unisql.conf中unisql.replace.sql参数可配置需要替换的sql语句。
示例
-- 转换前MySQL SQL:
FLUSH PRIVILEGES;
-- 转换后GaussDB-Oracle SQL(unisql.replace.sql = 'select 1'):
SELECT 1;
3.3.6.1.2. 双竖线运算符
语法
双竖线(||)表示逻辑或运算
示例
-- 转换前MySQL SQL:
select 1 || -1;
INSERT INTO `tb_user_api_key` SELECT MD5(id) instance_id,id user_id,login_name user_name,
CASE WHEN (ISNULL(auth_password) = 1 ) || (LENGTH( trim(auth_password)) = 0 ) THEN MD5(id)
ELSE auth_password END api_key,TRUE STATUS;
-- 转换后GaussDB-Oracle SQL:
SELECT 1 OR -1;
INSERT INTO tb_user_api_key SELECT MD5(id) AS instance_id,id AS user_id,login_name AS user_name,
CASE WHEN (unisql.ISNULL(auth_password)=1) OR (LENGTH(trim(auth_password))=0) THEN MD5(id)
ELSE auth_password END AS api_key,TRUE AS STATUS;
警告
双竖线(||)表示逻辑或运算,表达式两侧需要使用括号包裹
3.3.6.1.3. 条件注释
语法
支持mysql/*!版本号 xxx*/ 条件注释语法,该情况仅语法实现,无实际功能;
仅支持/**/注释为独立一行存在,不包括嵌在其他sql语句中情况。
示例
-- 转换前MySQL SQL:
/*!40101 SET NAMES utf8 */
create table t1(id int primary key, name varchar(20), age text);
/*!40101 SET SQL_MODE=''*/alter table t1 add column sex varchar(10);
-- 转换后GaussDB-Oracle SQL:
CREATE TABLE t1 (id int PRIMARY KEY,name nvarchar2(20),age text);
ALTER TABLE t1 ADD sex nvarchar2(10);
3.3.6.1.4. 反单引号
语法
警告
支持mysql反单引号语法,默认将反单引号剔除。可通过配置文件参数(unisql.keyword.doublequotes)进行配置, 对象名如果匹配到了此配置参数中配置的关键字则使用双引号包裹,每个关键字之间用逗号分隔, 例如:unisql.keyword.doublequotes = name, age 表示name和age使用双引号包裹。
示例
-- 转换前MySQL SQL:
selecttb.`name`,tb.`instance_id`,e.`dest_instance_id`,e.`source_instance_id`
from tb_ci_concrete_collection e left join tb_ci_base_object tb on tb.instance_id = e.instance_id;
-- 转换后GaussDB-Oracle SQL:
SELECT tb.NAME,tb.instance_id,e.dest_instance_id,e.source_instance_id
FROM tb_ci_concrete_collection AS e LEFT JOIN tb_ci_base_object AS tb ON tb.instance_id=e.instance_id;
-- 配置unisql.keyword.doublequotes=name,转换后GaussDB-Oracle SQL:
SELECT tb."NAME",tb.instance_id,e.dest_instance_id,e.source_instance_id
FROM tb_ci_concrete_collection AS e LEFT JOIN tb_ci_base_object AS tb ON tb.instance_id=e.instance_id;
3.3.6.1.5. 转义字符 \
语法
警告
将参数unisql.mysql.backslash.escapes设置为1,将支持mysql 反斜杠 \
转义字符,当前仅支持对于单引号和反斜杠的转义组合,即 \'
和 \\
情况。
示例
create table t1(id int primary key, configurl text);
-- 转换前MySQL SQL:
insert into t1 values(1, '\content\'jres\' 1.0 encoding \\\UTF8');
insert into t1 values(2, '{\\\"nodelocator-server\\\" nodeNo=\\\"0 \\\ />\\r\\n\\r\\n\\t<plugins>\\"jres.logFactory \\\" load-level=\acm>}');
-- 转换后GaussDB-Oracle SQL:
INSERT INTO t1 VALUES (1,'content''jres'' 1.0 encoding \UTF8');
INSERT INTO t1 VALUES (2,'{\"nodelocator-server\" nodeNo=\"0 \ />\r\n\r\n\t<plugins>\"jres.logFactory \" load-level=acm>}');
3.3.6.1.6. 查看当前库所有表
语法
SHOW TABLES
示例
-- 转换前MySQL SQL:
SHOW TABLES;
-- 转换后GaussDB-Oracle SQL:
SELECT tablename FROM pg_tables WHERE schemaname=current_schema();
3.3.6.1.7. 锁表语句
语法
LOCK TABLES tbl_name READ | WRITE
UNLOCK TABLES
警告
UNLOCK TABLES受配置参数控制,config/unisql.conf中unisql.replace.sql参数可配置需要替换的sql语句。 GaussDB-Oracle必须在显式事务中使用LOCK TABLES语句,并且UNLOCK TABLES在事务的最后。 READ锁只阻塞并发事务的insert/delete/update/select。 WRITE锁只阻塞并发事务的insert/delete/update。
示例
-- 转换前MySQL SQL:
LOCK TABLES products READ;
LOCK TABLES products WRITE;
UNLOCK TABLES;
-- 转换后GaussDB-Oracle SQL(unisql.replace.sql = 'select 1'):
LOCK TABLES products IN ACCESS SHARE MODE;
LOCK TABLES products IN ACCESS EXCLUSIVE MODE;
SELECT 1;
3.3.6.1.8. 查看当前分区信息
语法
支持查询INFORMATION_SCHEMA.PARTITIONS来获取分区表信息,支持字段table_schema|table_name|partition_name|partition_method|partition_description
警告
GaussDB-Oracle默认存的小写,mysql大小写均可配置,所以大小写有差异, 可能导致结果不一致,目前不处理,所以建议均小写
hash分区范围值有差异,GaussDB-Oracle partition_description字段有范围值,mysql partition_description字段值为null
partition_method可能不一致,如mysql在分区键为字符串时,partition_method为RANGE COLUMNS(也有为NULL场景), GaussDB-Oracle只为RANGE
partition_description单引号差异,GaussDB-Oracle均为不带单引号,mysql在分区键为字符串时带单引号
默认查询顺序可能不一致,建议加上order by
示例
-- 转换前MySQL SQL:
select partition_description,partition_name from information_schema.partitions where table_schema = s1 and table_name = t1;
-- 转换后GaussDB-Oracle SQL
select partition_description,partition_name from unisql.partitions where table_schema = s1 and table_name = t1;
3.3.6.2. OceanBase-Oracle
3.3.6.2.1. 切换数据库
语法
use dbname;
警告
数据库名不支持大小写敏感,特殊字符,反引号大小写敏感
示例
-- 转换前MySQL SQL:
use dbname;
-- 转换后OceanBase-Oracle SQL:
ALTER SESSION SET CURRENT_SCHEMA = dbname;
3.3.6.3. GaussDB-Mysql
3.3.6.3.1. 查看当前库所有表名
语法
SHOW TABLES
警告
对于gaussdb-mysql 505.2 此版本已支持该语法(需要设置unisql.target.database.version = 5050200)
示例
-- 转换前MySQL SQL:
SHOW TABLES;
-- 转换后GaussDB-Oracle SQL:
-- 配置项:unisql.target.database.version = 5050200
SHOW TABLES