一、兼容开关
kingbase用户可通过设置相关的数据库兼容开关,部分或全部启用Oracle 兼容特性。
- 在数据库实例data 目录下的kingbase.conf 文件中配置。
- 在数据库初始化时设置。
- 在用户会话中设置
V8R6 和V8R3 兼容特性开关一览表
| 兼容特性开关 | V8R6 | V8R3 | 用途说明 |
|---|---|---|---|
| char_default_type | 不支持(oracle 兼容模式下默认就是兼容类型的设置) | 支持 | 设置字符串类型的长度单位(char 或 byte),它和 Oracle 参数 NLS_LENGTH_SEMANTICS 的含义一致(会话级参数,缺省值是 char)。 |
| ora_func_style | 不支持(oracle 兼容模式下默认就是兼容类型的设置)移植时人为去掉设置该参数的 sql | 支持 | 开关开启时兼容 oracle 函数及 sequence 序列(会话级参数,缺省值是 true)。 |
| default_with_oids | 支持 | 支持 | 开关开启时,新创建的表将包含 OID 伪列。此外,如果创建的表没有 OID 伪列,那么这个表也没有 ROWID 伪列。如果创建加密表时,必须指定 WITH OID。 |
| ora_input_emptystr_isnull | 支持 | 支持 | 开关开启时,系统将输入的空串当做 NULL 处理(会话级参数,缺省值是 true)。 |
| ora_date_style | 支持(KingbaseES 使用此开关设置 date 数据类型格式时,需要先打开 ora_style_nls_date_format 开关,且 ora_date_style 默认时间格式为 'YYYY-MM-DD HH24:mi:ss') | 支持 | 开关开启时,date 类型的输出格式兼容 oracledate 类型输入格式(会话级参数,缺省值是 false)。 |
| ora_format_style | 不支持(可以使用 Oracle 模式替代)移植时人为去掉设置该参数的 sql | 支持 | 开关开启时,格式化输出(to_char,to_timestamp...)兼容 oracle(会话级参数,缺省值是 false)。 |
| nls_timestamp_format | 支持 | 支持 | 开关开启时,time stamp 类型 to_char 默认输出格式兼容 oracle(会话级参数,缺省值是 YYYY-MM-DDHH:MI:SS)。 |
| nls_length_semantics | 支持 | 不支持 | 设置字符串类型的长度单位(char 或 byte),它和 Oracle 参数 NLS_LENGTH_SEMANTICS 的含义一致(会话级参数,缺省值是 char) |
| ora_numop_style | 支持 | 支持 | 开关开启时,integers 操作符当做 numeric 操作符。 |
| extra_float_digits | 支持(默认值为 1) | 支持(默认值为 0) | 设置浮点值显示的位数。 |
二、模式和对象
1、扩展数据类型
金仓数据库兼容Oracle模式,扩展number、varchar(2)、char(n)和date类型。
V8R6 与V8R3 数值数据类型对比表
| 数据类型名 | V8R6 | V8R3 |
|---|---|---|
| bool | 不支持 bool 到 text 的隐式转换,(比如 like 等操作需要此隐式转换,可修改应用增加显示转换绕过此问题.) | 支持 bool 到 int 的隐式转换支持 bool 到 text 的隐式转换. |
| time,timetz | 不支持 time 和 timetz 到 timestamptz 类型的隐式转换(Oracle 中不存在 time 和 timetz 类型,在不影响 Oracle 兼容性的基础上保留了原型的处理逻辑。可通过修改应用增加显示转换来绕过此问题。) | 支持 time 和 timetz 到 timestamptz 类型的隐式转换 |
| abstime | 不支持 | 内部使用的较低精度类型 |
| reltime | 不支持 | 内部使用的较低精度类型 |
| tinterval | 不支持 | 支持 |
2、模式
bash
#V8R3:
test=# show search_path ;
search_path
-----------------
"$USER", PUBLIC
(1 行记录)
#V8R6:
test=# show search_path ;
search_path
-----------------
"$user", public
(1 行记录)
3、大小写敏感
bash
#V8R3:
test=# show case_sensitive ;
case_sensitive
-----------
on
(1 行记录)
#V8R6:
test=# show enable_ci;
enable_ci
-----------
off
(1 行记录)
4、序列
查看select * from sequencename;
select * FROM all_sequences WHERE sequence_name=UPPER('sequencename') ;
bash
#V8R3(返回十列):
test=# CREATE SEQUENCE serial START 1;
test=# select * from serial;
sequence_owner | sequence_name | min_value | max_value | increment_by | cycle_flag | order_flag | cache_size | last_number | start_value
----------------+---------------+-----------+---------------------+--------------+------------+------------+------------+-------------+-------------
system | SERIAL | 1 | 9223372036854775807 | 1 | N | Y | 1 | | 1
#V8R6(返回四列):
test=# CREATE SEQUENCE serial START 1;
test=# \ds
关联列表
架构模式 | 名称 | 类型 | 拥有者
----------+--------+--------+--------
public | serial | 序列数 | system
(1 行记录)
test=# select * from serial ;
last_value | next_value | log_cnt | is_called
------------+------------+---------+-----------
1 | 1 | 0 | f
(1 行记录)
test=# select * FROM all_sequences WHERE sequence_name=UPPER('serial');
sequence_owner | sequence_name | min_value | max_value | increment_by | cycle_flag | order_flag | cache_size | last_number | start_value
----------------+---------------+-----------+---------------------+--------------+------------+------------+------------+-------------+-------------
system | SERIAL | 1 | 9223372036854775807 | 1 | N | Y | 1 | | 1
5、同义词
V8R6 找同义词时,对于同义词指向的对象,首先依然作为同义词进行递归查找和成环检测,而不是把同义词指向的对象首先按照普通对象查找,这个处理顺序和V8R3 不同。
6、分区
V8R6 分区支持的兼容V8R3,支持分区的alter,支持全局索引,支持interval 分区,不支持reference 分区。
7、全局临时表
V8R3 支持本地临时表,不支持全局临时表。
V8R6 支持本地临时表和全局临时表。
三、SQL语句
1、支持create table with oids写法
- R3:oid = 系统伪列(不属于表字段,不存储在表行里)
- R6:
WITH OIDS生成的 oid = 隐含的普通字段,是表的一列,物理存到每条记录里。
bash
test=# create table a1 (a int) with oids;
test=# create table a11 (a int);
test=# select oid,relname from sys_class where relname='a11';
oid | relname
-------+---------
16392 | a11
(1 行记录)
2、select * from 序列名; 写法
已解释。
3、sys_guid函数
bash
#R6默认输出为name类型,想输出为bytea/name型,需在配置文件中添加:
guid_default_return_type='bytea/name'
#重启数据库:
select alter_sys_guid();
4、get_byte(bit, int)函数
-
R6:不支持
-
R3:test=# SELECT GET_BYTE(X'164da53ef', 4);
5、操作符
V8R6 中禁用的自定义操作符有10 个,包括:"!=+","!=-","=+","=-","||+","||-","+","-"," |+"," |-"。这样也是为了尽可能保证处理逻辑与原型一致的基础上,还可以兼容Oracle 的操作符。
四、PL/SQL语言
1、嵌套表的char类型长度
嵌套表定义char类型省略长度,赋值超长,V8R3会截断/V8R6直接报错
解决:
bash
#嵌套表定义char类型省略长度,要赋值正确。
DO $$DECLARE
TYPE type_name10 IS TABLE OF CHAR NOT NULL;
nttypeelement10 type_name10:=type_name10('AAAA'); #V8R3写法
nttypeelement10 type_name10:=type_name10('A'); #V8R6写法
BEGIN
RAISE NOTICE 'nttypeelement10(1)=%', nttypeelement10(1);
EXCEPTION
WHEN VALUE_ERROR THEN
RAISE NOTICE 'VALUE_ERROR';
END
$$;
2、create package
create package 中文名的包 as a int end; V8R3创建成功/V8R6创建失败
解决:
V8R6:create package 中文名的包 as a int; end;
五、V8R6新功能
| 分类 | 功能增强 | 实现完整性 |
|---|---|---|
| 数据库对象类型 | 支持全局临时表 | 完整实现 |
| 数据库对象类型 | Oracle directory | 不完整,不包括授权 |
| 数据库对象类型 | 支持 Generated columns; | 完整实现 |
| 数据库对象类型 | 支持分区 | 完整实现 |
| 数据库对象类型 | 兼容 oracle 默认是大写存储的行为 | 不完整,不支持 oracle 中大写对象和小写对象同时存在 |
| 数据库对象类型 | 支持兼容 oracle 的 Force View | 完整实现 |
| 数据库对象类型 | 服务器编码新增支持 GBK、GB18030 | 完整实现 |
| 数据库对象类型 | 支持自动任务调度 | 完整实现 |
| 数据库对象类型 | 支持同义词 | 完整实现 |
| 内置数据库对象 | 支持 XML 函数 | 完整实现 |
| 内置数据库对象 | 支持 postgis 2.5.2 和 3.0 | 支持 linux |
| 内置数据库对象 | 支持 oracle 系统视图 | 完整实现 |
| 内置数据库对象 | 支持兼容 Oracle 数据类型:Number、字符类型、日期时间型、同时支持相关的操作符、索引、函数,支持类型转换。 | 完整实现 |
| 内置数据库对象 | 支持 BLOB、CLOB、NCLOB 等大对象数据类型,同时支持了相关的函数、接口。 | 完整实现 |
| SQL 操作 | 支持表表达式 coalesce | 完整实现 |
| SQL 操作 | 支持不指定 group by 情况下进行聚集操作 | 完整实现 |
| SQL 操作 | 支持 Merge into | 完整实现 |
| SQL 操作 | 支持 dml 语句使用 return 指定返回结果集 | 完整实现 |
| SQL 操作 | 支持子查询自动生成别名 | 完整实现 |
| SQL 操作 | 支持中文的逗号和空格 | 完整实现 |
| SQL 操作 | 新增约束的禁用启用 | 完整实现 |
| SQL 操作 | 支持在 create table 时指定列为 not null | 完整实现 |
| SQL 操作 | 支持在 create user 时指定 lock 和 unlock | 完整实现 |
| SQL 操作 | 支持在线重建 index | 完整实现 |
| SQL 操作 | 支持内嵌 WITH recursive 查询; | 完整实现 |
| SQL 操作 | 支持 SQL/JSON PATH 特性; | 完整实现 |
六、客户端编程接口兼容性
| 接口类型 | V8R3 和 V8R6 的兼容性 |
|---|---|
| JDBC | 读写分离集群增加一个必填参数:nodelist,其它方面使用一致。 |
| Activiti | 直接使用 PG 的配置方式,使用 JDBC 的 PG 形态驱动包。 |
| Hibernate | 一致 |
| OCI | 一致 |
| Mybatis | 一致 |
| ODBC | 一致 |
| NET NDP | 一致 |
| NET EF | 一致 |
| PHP PDO | 一致 |
| Perl PDI | 一致 |
| Nodejs | 一致 |
| Golang | 一致 |
| Python | 一致 |
| QT | 一致 |