本节介绍 TDSQL PG 数据库在 Oracle 兼容方面的特性。
TDSQL PG 数据库基本兼容了 Oracle 的数据类型、SQL 功能、数据库对象(如:同义词、包)。在 PL(过程化语言)方面也做了很多细致兼容工作,用户应用迁移基本不需要改动业务代码。
TDSQL PG 对如下功能做了兼容:
数据类型
内建函数
SQL 语法
PL/SQL
系统视图
系统包
数据库对象管理
Oracle 配置参数
使用 Oracle 兼容模式
TDSQL PG 内核引擎会根据数据库类型来区分 Oracle 兼容模式与 PG 模式。
在创建数据库的时候使用
sql mode
db_mode
关键字即可创建一个指定模式的数据库,db_mode 可选 oracle 或 postgresql。不指定即默认 PostgreSQL 模式。示例:
tdsql=# create database ora sql mode oracle;CREATE DATABASEtdsql=# \\lList of databasesName | Owner | Encoding | Sqlmode | Collate | Ctype | Access privileges---------------+-------+----------+----------+------------+------------+-------------------ora | tbase | UTF8 | oracle | zh_CN.utf8 | zh_CN.utf8 |postgres | tbase | UTF8 | postgres | zh_CN.utf8 | zh_CN.utf8 |tbase_db | tbase | UTF8 | postgres | zh_CN.utf8 | zh_CN.utf8 |tdsql | tbase | UTF8 | postgres | zh_CN.utf8 | zh_CN.utf8 |template0 | tbase | UTF8 | postgres | zh_CN.utf8 | zh_CN.utf8 | =c/tbase +| | | | | | tbase=CTc/tbasetemplate0_ora | tbase | UTF8 | oracle | zh_CN.utf8 | zh_CN.utf8 | =c/tbase +| | | | | | tbase=CTc/tbasetemplate1 | tbase | UTF8 | postgres | zh_CN.utf8 | zh_CN.utf8 | =c/tbase +| | | | | | tbase=CTc/tbasetemplate1_ora | tbase | UTF8 | oracle | zh_CN.utf8 | zh_CN.utf8 | =c/tbase +| | | | | | tbase=CTc/tbaseuser1 | user1 | UTF8 | postgres | zh_CN.utf8 | zh_CN.utf8 |(9 rows)
可以看到
ora
数据库的 Sqlmode
列显示 oracle
,即表示 ora
数据库当前为 Oracle 模式。而
tdsql
数据库的 Sqlmode
列显示 postgres
,即表示 tdsql
数据库当前为 PostgreSQL 模式。SQL 数据类型
内建函数
SQL 语法
TDSQL PG 支持语法说明:
序号 | Oracle 数据库 | TDSQL PG 数据库 | 说明 |
1 | SELECT | 支持 | 支持单表和多表连接;支持多种 JOIN 连接方式(内连接、外连接);支持子查询;支持层次查询;支持多种窗口函数等。 支持多种集合操作:UNION、UNION ALL、INTERSECT、EXCEPT、MINUS 等。 支持 EXPLAIN 打印计划。 支持 PIVOT、UNPIVOT |
2 | INSERT | 支持 | 支持 VALUES 插入一行或者多行;支持分区表插入; 支持 INSERT ... SELECT 插入数据支持同时插入多个目标表(INSERT ALL/FIRST) |
3 | UPDATE | 支持 | SET 支持一次更新多列数据 |
4 | DELETE | 支持 | 支持删除表数据 |
5 | TRUNCATE | 支持 | 支持清空表数据 |
6 | 并行查询 | 支持 | 支持并行 INSERT 和 UPDATE |
7 | Hint | 支持 | 支持 Hint |
PL/SQL
TDSQL PG 支持 PLSQL 语法说明:
序号 | Oracle 数据库 | TDSQL PG 数据库 | 说明 |
1 | 数据类型 | 支持 | 支持 sql 类型数据类型 支持集合和记录类型 支持 object 类型 支持 oracle 兼容的 pls_integer 和 binary_integer |
2 | 流程控制 | 支持 | 支持循环控制逻辑 支持条件控制逻辑 支持顺序执行逻辑 |
3 | 集合类型与记录类型 | 支持 | 支持嵌套表 支持关联数组 支持可变数组 支持记录类型 |
4 | 静态 SQL | 支持 | 支持静态 SQL |
5 | 动态 SQL | 支持 | 支持动态 SQL |
6 | 子过程 | 支持 | 支持包内子过程 支持 OBJECT 类型子过程 支持创建 FUNCTION 和P ROCEDURE |
7 | 触发器 | 支持 | 支持 insert/update/delete/truncate4种类型 DML 触发器 支持 alter/drop/create 且出发目标是 database/schema 的 ddl 触发器 支持 befor/after/instead of 三种触发时机的触发器 |
8 | 异常处理 | 支持 | PL/SQL 中支持异常块,可以便捷地检查和处理错误 |
9 | PACKAGE 对象 | 支持 | 支持定义包对象,用来封装一组成员变量和成员函数 |
10 | 自定义类型 | 支持 | 支持使用 CREATE TYPE 创建自定义类型 |
11 | 游标 | 支持 | 支持隐式游标 支持显式游标 支持自定义游标类型 支持 SYS_REFCURSOR |
12 | 函数嵌套声明 | 支持 | 支持在函数/存储过程/匿名块中嵌套定义函数或者存储过程 |
13 | PL 系统包 | 支持 | 包括 DBMS_OUTPUT、DBMS_LOB、DBMS_ASSERT、DBMS_ALERT、DBMS_LOCK、DBMS_METADATA、DBMS_RANDOM、DBMS_SESSION 等 |
注意:
NOCOPY 仅仅语法兼容 Oracle,内核没有实现 OUT 参数按照 By Reference 来传递。
不支持条件编译、PL 的编译优化级别(PLSQL_OPTIMIZE_LEVEL)。
系统视图
系统包
数据库对象管理
序号 | 数据库对象 | TDSQL PG 数据库 | 说明 |
1 | 表 | 支持 | 支持创建表,包括临时表和全局临时表。创建表可以指定约束、索引等信息。 支持修改表定义。通过 ALTER TABLE 来添加列,修改列类型,增加或者删除默认值、约束等。 支持删除表定义。 |
2 | 约束 | 支持 | 支持 CHECK、UNIQUE、NOT NULL 约束。 支持 PRIMARY KEY 约束。 支持 FOREIGN KEY 约束。 支持 ALTER TABLE 对约束进行启用、禁用。 |
3 | 分区表 | 支持 | 支持 TDSQL PG 语法创建一级和多级分区;不支持用 Oracle 语法方式创建分区表 支持 RANGE、LIST、HASH 分区 支持分区表的局部索引 支持分区表的基本维护: 分区表添加 分区表删除 分区表分裂、合并 |
4 | 索引 | 支持 | 支持 BTREE、HASH、BRIN 索引。支持 gist、gin、spgist 索引。 支持索引的创建和删除 |
5 | 视图 | 支持 | 支持创建和删除视图 支持 FORCE VIEW 支持简单视图的 DML 操作。不支持多表视图的 DML |
6 | 序列 | 支持 | 支持序列的创建和删除 支持 NOCACHE、NOORDER 序列 |
7 | 同义词 | 支持 | 支持同义词的创建和删除 支持对表、视图、同义词等对象创建同义词 |
8 | DBLINK | 支持 | TDSQL PG 支持创建、删除 DBLINK 支持用 DBLINK 读和写 Oracle 数据库 |