前言
KingbaseES(Oracle兼容版)V9R2C12版本新增了对抽象数据类型的支持,可支持更丰富的日期时间函数;新增对Oracle数据类型、函数、系统表、系统视图、系统包、SQL语句和PLSQL语句用法的兼容。在客户端编程接口(JDBC 、OCI、OCCI、Pro*C)层面优化参数定义、参数绑定、错误码处理、复杂数据类型处理和字符集编码设置等内容,深入优化数据库系统性能和安全等能力。
本文主要是做KingbaseES(Oracle兼容版)和 Oracle数据库兼容性测试。
KingbaseES(Oracle兼容版)单机部署
请参考前一篇文章:KingbaseES(Oracle兼容版)单机部署
KingbaseES(Oracle兼容版)和 Oracle数据库兼容性测试
SQL兼容
构造表数据:
create table DEPT
(
deptno NUMBER(2) not null,
dname VARCHAR2(14),
loc VARCHAR2(13)
);
create table EMP
(
empno NUMBER(4) not null,
ename VARCHAR2(10),
job VARCHAR2(9),
mgr NUMBER(4),
hiredate DATE,
sal NUMBER(7,2),
comm NUMBER(7,2),
deptno NUMBER(2)
);
insert into dept (DEPTNO, DNAME, LOC) values ('10', 'ACCOUNTING', 'NEW YORK');
insert into dept (DEPTNO, DNAME, LOC) values ('20', 'RESEARCH', 'DALLAS');
insert into dept (DEPTNO, DNAME, LOC) values ('30', 'SALES', 'CHICAGO');
insert into dept (DEPTNO, DNAME, LOC) values ('40', 'OPERATIONS', 'BOSTON');
insert into emp (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)
values ('7369', 'SMITH', 'CLERK', '7902', to_date('17-12-1980', 'dd-mm-yyyy'), '800', null, '20');
insert into emp (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)
values ('7499', 'ALLEN', 'SALESMAN', '7698', to_date('20-02-1981', 'dd-mm-yyyy'), '1600', '300', '30');
insert into emp (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)
values ('7521', 'WARD', 'SALESMAN', '7698', to_date('22-02-1981', 'dd-mm-yyyy'), '1250', '500', '30');
insert into emp (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)
values ('7566', 'JONES', 'MANAGER', '7839', to_date('02-04-1981', 'dd-mm-yyyy'), '2975', null, '20');
insert into emp (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)
values ('7654', 'MARTIN', 'SALESMAN', '7698', to_date('28-09-1981', 'dd-mm-yyyy'), '1250', '1400', '30');
insert into emp (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)
values ('7698', 'BLAKE', 'MANAGER', '7839', to_date('01-05-1981', 'dd-mm-yyyy'), '2850', null, '30');
insert into emp (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)
values ('7782', 'CLARK', 'MANAGER', '7839', to_date('09-06-1981', 'dd-mm-yyyy'), '2450', null, '10');
insert into emp (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)
values ('7788', 'SCOTT', 'ANALYST', '7566', to_date('13-06-0187', 'dd-mm-yyyy'), '3000', null, '20');
insert into emp (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)
values ('7839', 'KING', 'PRESIDENT', null, to_date('17-11-1981', 'dd-mm-yyyy'), '5000', null, '10');
insert into emp (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)
values ('7844', 'TURNER', 'SALESMAN', '7698', to_date('08-09-1981', 'dd-mm-yyyy'), '1500', '0', '30');
insert into emp (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)
values ('7876', 'ADAMS', 'CLERK', '7788', to_date('13-06-0187', 'dd-mm-yyyy'), '1100', null, '20');
insert into emp (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)
values ('7900', 'JAMES', 'CLERK', '7698', to_date('03-12-1981', 'dd-mm-yyyy'), '950', null, '30');
insert into emp (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)
values ('7902', 'FORD', 'ANALYST', '7566', to_date('03-12-1981', 'dd-mm-yyyy'), '3000', null, '20');
insert into emp (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)
values ('7934', 'MILLER', 'CLERK', '7782', to_date('23-01-1982', 'dd-mm-yyyy'), '1300', null, '10');
commit;
1、ROWNUM 伪列
select * from dept where rownum<4;

结论:执行结果一致,KingbaseES和Oracle的rownum是兼容的。
2、层次查询level伪列
SELECT LEVEL,
EMPNO,
ENAME,
JOB,
MGR,
LPAD(' ', 2*(LEVEL-1)) || ENAME AS tree
FROM emp
START WITH MGR IS NULL
CONNECT BY PRIOR EMPNO = MGR
ORDER SIBLINGS BY EMPNO;

结论:执行结果一致,KingbaseES和Oracle的层次查询level伪列是兼容的。
3、interval分区自动分裂
CREATE TABLE sales
(
id NUMBER,
sale_date DATE
)
PARTITION BY RANGE (sale_date)
INTERVAL (NUMTOYMINTERVAL(1, 'MONTH'))
(
PARTITION p1 VALUES LESS THAN (TO_DATE('2025-01-01', 'YYYY-MM-DD'))
);
INSERT INTO sales VALUES (1, TO_DATE('2024-01-19', 'YYYY-MM-DD'));
INSERT INTO sales VALUES (2, TO_DATE('2025-08-30', 'YYYY-MM-DD'));
INSERT INTO sales VALUES (2, TO_DATE('2025-12-30', 'YYYY-MM-DD'));
SELECT table_name, partition_name, high_value
FROM user_tab_partitions
WHERE table_name = 'SALES'
ORDER BY partition_name;


结论:执行结果一致,KingbaseES和Oracle的层次查询interval分区自动分裂是兼容的。
4、execute immediate语句into子句、using子句
set serveroutput on
\set SQLTERM / --kingbase要加这一行,否则不能作为一个整体匿名块执行。
DECLARE
v_ename emp.ename%TYPE;
v_sal emp.sal%TYPE;
BEGIN
EXECUTE IMMEDIATE
'SELECT ename, sal FROM emp WHERE empno = :1'
INTO v_ename, v_sal
USING 7369;
DBMS_OUTPUT.PUT_LINE('name is '||v_ename||', salary is '||v_sal);
END;
/

结论:执行结果一致,KingbaseES和Oracle的execute immediate …into …using子句是兼容的。
5、闪回FLASHBACK TABLE
金仓数据库(KingbaseES)的 Flashback功能允许你查询过去某个时间点或某个提交顺序号(CSN)对应的历史数据状态,常用于数据恢复、审计、或误操作回滚。
--kingbase需要开启参数
alter system set track_commit_timestamp = on; -- 记录提交时间戳
alter system set kdb_flashback.enable_flashback_query =on; -- 启用闪回查询
--确认参数已生效
SHOW track_commit_timestamp;
SHOW kdb_flashback.enable_flashback_query;
create table test1(id int);
alter table test1 enable row movement; --oracle中需要开启row movement属性
insert into test1 values(1);
insert into test1 values(2);
select * from test1;
--kingbase
select sysdate;
--oracle
select to_char(sysdate,'yyyymmdd hh24:mi:ss') from dual;
--删除数据
delete from test1 where id=1;
--kingbase闪回
SELECT * FROM test1 AS OF TIMESTAMP '时间';
FLASHBACK TABLE test1 TO TIMESTAMP '时间';
--oracle闪回
SELECT * FROM test1 AS OF TIMESTAMP TO_TIMESTAMP('时间', 'YYYY-MM-DD HH24:MI:SS');
FLASHBACK TABLE test1 TO TIMESTAMP TO_TIMESTAMP('时间', 'YYYY-MM-DD HH24:MI:SS');


结论:执行结果一致,KingbaseES和Oracle的闪回是兼容的。
PLSQL兼容–游标属性
create table emp2(id int,sal number(7,2));
insert into emp2 values(1,10000);
insert into emp2 values(2,20000);
insert into emp2 values(3,30000);
commit;
select * from emp2;
\set SQLTERM / --kingbase需要
DECLARE
CURSOR c1 IS
SELECT * FROM emp2 order by id;
emp_rec emp2%ROWTYPE;
BEGIN
OPEN c1;
LOOP
FETCH c1 INTO emp_rec;
EXIT WHEN c1%NOTFOUND;
UPDATE emp2
SET sal = sal+100
WHERE id = emp_rec.id;
COMMIT;
END LOOP;
END;
/


结论:执行结果一致,KingbaseES和Oracle的游标属性是兼容的。
总结
经过上述测试可见,KingbaseES(Oracle 兼容版)与 Oracle 的兼容性相当高,后续有时间再继续验证其他功能。
金仓数据库产品体验官活动链接
https://bbs.kingbase.com.cn/forumDetail?articleId=8a3fc929b40be1e5b6ad5bca3c9da3f9
关于作者
网名:飞天,墨天轮2024年度优秀原创作者,拥有 Oracle 10g OCM 认证、PGCE认证、MySQL 8.0 OCP认证以及OBCA、KCP、KCSM、ACP、磐维等众多国产数据库认证证书,目前从事Oracle、Mysql、PostgresSQL、磐维数据库管理运维工作,喜欢结交更多志同道合的朋友,热衷于研究、分享数据库技术。
微信公众号:飞天online
墨天轮:https://www.modb.pro/u/15197
如有任何疑问,欢迎大家留言,共同探讨~~~




