2.1.2-1、V8R3迁移到V8R6-Oracle兼容特性

一、兼容开关

​ 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 一致
相关推荐
geovindu2 小时前
sql:Search-Optimized SQL Queries using mysql 9.0
android·数据库·sql·mysql·数据库开发·数据库架构
for_ever_love__2 小时前
MySQL SELECT 与 WHERE 优化实战:可搜索条件、联合索引与执行计划
数据库·mysql·oracle·select·where·条件优化·查询优化技巧
2501_931803752 小时前
MySQL 锁机制详解
数据库·mysql
Nturmoils2 小时前
SQL 编辑器不只是写查询:我用 KStudio 排查一次订单异常
数据库
IvorySQL3 小时前
PostgreSQL 日报|逻辑解码 DDL 子事务缺陷修复(10 月 12 日)
数据库·postgresql
这个DBA有点耶3 小时前
研发规模/投入最大的国产数据库厂商是谁?拆解五个衡量维度
数据库·程序员·产品
葡萄城技术团队3 小时前
数据库里的数据明明是对的,为什么 BI 报表还是错?
数据库
野生数据人3 小时前
日志平台每日巡检我压成了一条命令链:从 SHOW BACKENDS 到扩缩容的完整步骤
大数据·数据库
bmxy小明同学4 小时前
2026-10-09-token与成本
java·前端·数据库