暂无图片
暂无图片
2
暂无图片
暂无图片
暂无图片

【金仓数据库产品体验官】KingbaseES(Oracle兼容版)兼容性测试

原创 飞天 2025-08-31
400

前言

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;

image.png
结论:执行结果一致,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;

8516086769f146748511f1871f258e0a.png
结论:执行结果一致,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;

image.png
image.png
结论:执行结果一致,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; /

image.png
结论:执行结果一致,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');

image.png
image.png
结论:执行结果一致,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; /

image.png
image.png
结论:执行结果一致,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
如有任何疑问,欢迎大家留言,共同探讨~~~

最后修改时间:2025-08-31 11:27:03
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论