引言
最近我以开发者的身份参加了金仓数据库第 3 期 "Oracle 兼容深度体验" 活动,真切感受到金仓数据库在国产化替代进程中展现出的强大兼容性。接下来我会分两部分来分享:一是 "Windows 系统安装 KingbaseES V9R1C10" 的全过程,二是 "Oracle 兼容特性实战测评"。全文都会用通俗易懂的语言搭配详细操作步骤,就算是刚接触金仓数据库的小伙伴,跟着步骤做也能轻松上手。 @[toc]
一、Windows 系统安装 KingbaseES V9R1C10(Oracle 兼容模式)
这次安装选的是 KingbaseES V9R1C10 版本,特意开启了Oracle 兼容模式,为后面的兼容特性测试打好基础。我全程照着超详细的保姆级教程来操作,从环境准备到具体步骤再到最后的验证环节都有覆盖,能帮大家避开不少坑。
1.1 环境准备:先把这些前提条件备齐
安装之前,得先确认软硬件环境符不符合要求,不然可能会安装到一半卡住,或者后续运行出问题。
1.1.1 硬件环境要求
普通个人电脑或者服务器都能满足安装需求,具体参数看下面这张表:
组件 | 最低要求 | 推荐配置 | 说明 |
---|---|---|---|
CPU | X86_64 架构(Intel/AMD) | X86_64 架构 | 其实鲲鹏、飞腾这些国产 CPU 也支持,这次我就以 X64 为例来讲 |
内存 | 512MB | 2GB 及以上 | 内存要是不够,服务启动会很慢,甚至可能卡顿 |
硬盘 | 11GB 空闲空间 | 20GB 及以上 | 得预留足够空间存数据和日志文件 |
临时目录 | C:\tmp 目录 10GB 空闲空间 | 15GB 空闲空间 | 安装过程中会生成临时文件,空间不够会报错 |
1.1.2 软件环境要求
我自己实测过这些 Windows 系统版本都很稳定,推荐给大家:
- 服务器版:Windows Server 2019、Windows Server 2022
- 桌面版:Windows 10(64 位)、Windows 11(64 位)
- 另外还有些注意事项:得确保系统装了.NET Framework 4.5 及以上版本,因为有些组件要依赖它;防火墙最好关掉,或者把 54321 端口开放了,这是 Kingbase 的默认端口
1.1.3 获取安装包与授权文件
安装包和授权文件都得从金仓官网上下载,记得一定要确认版本是 V9R1C10 哦:
KingbaseES安装包可以通过以下渠道获取: 官方渠道 :访问官方下载渠道
如下图所示,可以选择下载版本,本次要下载的是最新兼容版V9R1C10 然后选择安装包 如下图所示,选择X64_Windows版本
下载时间会稍微有点长,文件3.4GB左右
官方授权文件获取👉点击链接 或者在刚刚的安装包下载界面,点击授权文件
授权文件说明:
KingbaseES数据库授权文件分为开发版、标准版、专业版和企业版。根据版本定位不同,以数据库首次启动为首日开始计算:
开发版:时长限制为365天
标准版、专业版、企业版:时长限制为90天

根据需要选择相应的授权文件,这里选择开发版,点击开发版-365天
进行下载
妥善安排授权文件存储路径,等会安装的时候要用到
1.2 详细安装步骤:从解压到实例创建
1.2.1 解压 ISO 安装包
下载的KingbaseES安装包是.iso格式的镜像文件,需要使用解压工具进行解压。
1.2.2 创建专属安装用户(避免权限问题)
KingbaseES推荐采用专门的用户(比如kingbase)来执行安装操作,不要利用默认的管理账号(缩减权限相关风险),其具体步骤包含以下几个方面:
- 按下
Win + R 键
,接着输入compmgmt.msc
,点击确定之后会打开【计算机管理】界面; - 在左侧的导航栏里找到并点击【本地用户和组】,再点击其中的【用户】选项
- 右键点击【用户】,然后选择【新建用户】,这样就会跳出"新建用户"窗口
- 用户名一栏填写 kingbase (此名称固定,便于后续操作)
- 在设置密码时,输入一个复杂的密码,比如 Kingbase@2024 ,并且取消选中"用户需下次登录时更改密码"这个选项,然后勾选上"密码永不过期"
- 最后点击【创建】按钮来创建该用户账户
- 创建好之后,右键点击刚才新建的 kingbase 用户,选择【属性】,在属性窗口中切换到【隶属于】标签页,点击【添加】按钮
- 在"请输入对象名称以执行选择"框内输入Administrators,点击【检查名称】,确认无误后再点击【确定】,从而把kingbase用户添加到Administrators组当中,进而保证其具有安装相关权限
1.2.3 创建安装目录并配置权限
为了规范管理,咱们自定义一个安装目录(不建议装在C盘,避免系统盘空间不足):
- 在D盘新建目录:
D:\Kingbase\ES\V9
; - 右键
V9
文件夹→【属性】→【安全】→【编辑】; - 点击【添加】,输入
kingbase
,检查名称后确定; - 给
kingbase
用户授予【完全控制】权限(避免安装时权限不足),点击【确定】保存。
1.2.4 运行安装程序(开启 Oracle 兼容模式)
-
回到之前的KES安装包下载路径,找到
setup.bat
; -
右键
setup.exe
→【以管理员身份运行】 -
弹出安装向导,点击【下一步】,
注意尽量按照建议把该关的的程序关掉,文档保存退出
-
许可协议页面 :选择"我接受许可协议的条款",点击【下一步】;
-
添加授权文件 : 将刚刚下载好的授权文件添加
-
选择安装路径
- 点击【浏览】,选择之前创建的
D:\Kingbase\ES\V9
; - 系统会自动检查路径权限,确认无误后点击【下一步】;
- 点击【浏览】,选择之前创建的
-
安装类型选择:
- 1-完全安装(推荐新手,包含数据库服务器、运维工具、开发工具等所有组件);
- 2-服务器安装(只装数据库服务,适合生产环境);
- 3-定制安装(自选组件,适合熟悉的用户); 这里选【1-完全安装】,点击【下一步】;
-
安装预览 :确认安装类型、路径、组件等信息,没问题就点击【安装】;
-
等待安装 :安装过程需要5-10分钟(取决于硬件性能),期间不要关闭窗口,避免安装中断;
-
安装完成 :提示"安装成功"后,勾选"创建快捷方式"(方便后续启动),点击【完成】。
1.2.5 创建数据库实例(关键!不创建无法使用)
「金仓数据库管控工具」启动时,安装完毕后会自动开启该工具,亦可通过如下途径来打开可视化工具
-
桌面快捷方式 :找到"金仓数据库管控工具"的图标并双击启动(若安装时选择了创建快捷方式)
-
开始菜单 :点击 开始→所有程序→KingbaseES V9→金仓数据库管控工具。
打开之后,左侧导航选择【单节点列表】(单节点部署时选择此选项,集群环境则选择"读写分离集群列表"),右侧会显示当前已有的实例(刚安装完毕时为空)。
点击「创建新实例」,会进入到配置向导当中,在【单节点列表】这个界面里面,要点击那个红色的按钮【创建新实例】,然后才能去设置实例相关的参数
弹出"创建数据库实例"窗口,按以下步骤填写:

如果需要调整内存、连接数等高级参数,勾选 【高级配置】 ;否则直接点击 【下一步】 。
进入"执行"页面,务必勾选两个关键选项:
- ✅ 创建后立即执行:让系统自动初始化数据文件(如日志、表空间);
- ✅ 创建后注册为系统服务 :将实例注册为Windows服务(如
KingbaseES_V9_kes_dev
),方便开机自启和管理。

点击 【执行】,等待进度条走完:
- 步骤会显示"初始数据库实例→设置参数→运行实例→注册服务",全部"成功"才算完成;
- 如果失败,看下方执行日志排查(常见原因:端口被占、数据目录权限不足、内存不足)。

1.3 安装后验证:确保数据库能正常使用
1.3.1 启动 KingbaseES 服务
安装完毕之后,要验证服务是否已经启动,是否可以正常执行连接操作,从而防止在后续的开发过程中遭遇问题
4.1 启动KingbaseES服务
-
按下
Win+R
,输入services.msc
,打开【服务】窗口; -
在服务列表中找到刚刚创建的实例,名称就是你刚刚创建的实例名称,如果没改的话默认就是"kes_instance"
-
右键服务→【启动】(如果已启动则跳过);
- 若启动失败,参考"常见问题"部分排查;
-
确认服务状态为"正在运行",启动类型为"自动"(避免重启后需手动启动)。
1.3.2 用 ksql 工具连接数据库
ksql是KingbaseES自带的命令行客户端,用来测试连接最方便:
-
打开【命令提示符】(以
kingbase
用户登录,或管理员身份); -
进入ksql所在路径(安装目录下的Server\bin):
cmdcd /d D:\Kingbase\ES\V9\Server\bin
-
执行连接命令(默认管理员用户
system
,密码manager
,数据库test
,端口54321):cmdksql -U system -d test -h localhost -p 54321
-
输入密码(默认
manager
,如果安装时改了密码就输修改后的),按回车; -
若出现以下提示,说明连接成功:
bash
授权类型: 开发版.
输入 "help" 来获取帮助信息.
test=#

1.3.3 执行简单 SQL 测试
连接成功后,咱们执行几条简单SQL,验证数据库功能正常:
-
创建测试表:
sqlCREATE TABLE test_user (id INT PRIMARY KEY, name VARCHAR(50));

-
插入数据:
sqlINSERT INTO test_user VALUES (1, '金仓数据库');

-
查询数据:
sqlSELECT * FROM test_user;
-
若输出以下结果,说明数据库正常工作: id | name
----+------------ 1 | 金仓数据库 (1 row)

- 断开连接:输入
\q
并回车,退出ksql。
二、KingbaseES Oracle 兼容特性实战(ksql 操作演示)
这次实战操作,咱们就围绕活动要求的SQL 兼容、PL/SQL 兼容两大核心特性,用 ksql 工具来实际演示一下。所有操作都基于已经创建好的 Oracle 兼容模式实例。
2.1 前置准备:进入 ksql 环境
-
先打开命令提示符,进入 ksql 的安装路径:
cmdcd /d D:\Tools\Kingbase\ES\Server\bin
-
接着连接数据库(和 1.3.2 步骤一样):
cmdksql -U system -d test -h localhost -p 54321
-
输入密码
manager
,就能进入test=#
的交互模式,接下来就可以开始测试了。
2.2 SQL 兼容特性:与 Oracle 语法无缝衔接
金仓 ES V9R1C10 在 SQL 层面跟 Oracle 深度兼容,像数据类型、SQL 语句、调优功能这些都包含在内。下面咱们就来演示几个核心特性。
2.2.1 数据类型与对象兼容:yminterval、dsinterval 与分区表
Oracle 里的yminterval
(年月间隔)和dsinterval
(日时间隔)是常用的时间类型,金仓对这俩完全兼容。另外,它还支持 Oracle 风格的分区表和自动分裂功能。
演示 1:yminterval 与 dsinterval 类型使用
-
咱们先来建一张包含间隔类型的表:
sql-- 创建表,包含yminterval(年月间隔)和dsinterval(日时间隔) CREATE TABLE oracle_interval_test ( id INT PRIMARY KEY, hire_date DATE, service_years INTERVAL YEAR TO MONTH, -- 对应Oracle的yminterval work_hours INTERVAL DAY TO SECOND -- 对应Oracle的dsinterval );
-
插入数据(用的是 Oracle 风格的间隔语法):
sqlINSERT INTO oracle_interval_test VALUES ( 1, TO_DATE('2020-01-15', 'YYYY-MM-DD'), -- Oracle日期函数TO_DATE兼容 INTERVAL '3-6' YEAR TO MONTH, -- 3年6个月 INTERVAL '15 8:30:00' DAY TO SECOND -- 15天8小时30分钟 ); INSERT INTO oracle_interval_test VALUES ( 2, TO_DATE('2022-05-20', 'YYYY-MM-DD'), INTERVAL '1-2' YEAR TO MONTH, -- 1年2个月 INTERVAL '5 2:15:30' DAY TO SECOND -- 5天2小时15分钟30秒 );
-
查询数据(验证一下间隔类型的计算效果):
sql-- 计算"雇佣日期+服务年限"得到当前服务截止日期 SELECT id, hire_date, service_years, hire_date + service_years AS current_service_end, -- 间隔类型参与计算 work_hours FROM oracle_interval_test;
-
执行结果是这样的,和 Oracle 的输出完全一致:
plaintextid | hire_date | service_years | current_service_end | work_hours ----+------------+---------------+---------------------+------------- 1 | 2020-01-15 | 0-6 | 2023-07-15 | 15 08:30:00 2 | 2022-05-20 | 1-2 | 2023-07-20 | 05 02:15:30 (2 rows)
演示 2:Oracle 风格分区表与 interval 分区自动分裂
金仓支持 Oracle 的分区表语法,而且interval
分区能自动分裂,不用咱们手动去创建新分区。
-
创建 interval 分区表(按月份分区):
sqlCREATE TABLE oracle_partition_test ( order_id INT PRIMARY KEY, order_date DATE, amount NUMBER(10,2) ) PARTITION BY RANGE (order_date) -- 按日期范围分区 INTERVAL (NUMTOYMINTERVAL(1, 'MONTH')) -- 每月自动分裂一个分区 ( -- 初始分区:2024年1月 PARTITION p202401 VALUES LESS THAN (TO_DATE('2024-02-01', 'YYYY-MM-DD')) );
-
插入跨月份的数据(这样就能触发分区自动分裂了):
sql-- 插入2024年1月数据(落入初始分区p202401) INSERT INTO oracle_partition_test VALUES (1, TO_DATE('2024-01-10', 'YYYY-MM-DD'), 1500.50); -- 插入2024年2月数据(自动创建p202402分区) INSERT INTO oracle_partition_test VALUES (2, TO_DATE('2024-02-15', 'YYYY-MM-DD'), 2800.00); -- 插入2024年3月数据(自动创建p202403分区) INSERT INTO oracle_partition_test VALUES (3, TO_DATE('2024-03-20', 'YYYY-MM-DD'), 950.75);
-
看看分区信息(验证一下自动分裂有没有成功):
sql-- 金仓兼容Oracle的ALL_TAB_PARTITIONS视图 SELECT partition_name, high_value FROM ALL_TAB_PARTITIONS WHERE table_name = 'ORACLE_PARTITION_TEST';
-
执行结果出来了,能看到自动创建的 p202402、p202403 分区:
plaintextpartition_name | high_value ---------------+------------------------------------ P202401 | TO_DATE(' 2024-02-01 00:00:00', ...) SYS_P1001 | TO_DATE(' 2024-03-01 00:00:00', ...) -- 自动分裂的2月分区 SYS_P1002 | TO_DATE(' 2024-04-01 00:00:00', ...) -- 自动分裂的3月分区 (3 rows)
2.2.2 SQL 语句兼容:execute immediate 与 LATERAL 连接
Oracle 里的动态 SQL(execute immediate
)和LATERAL
连接都是经常会用到的操作,金仓在语法上完全兼容它们。
演示 1:execute immediate 动态 SQL(into/using/returning into 子句)
execute immediate
用来执行动态生成的 SQL,支持into
(接收查询结果)、using
(传入参数)、returning into
(返回修改后的值)这些用法。
-
先创建一张测试表:
sqlCREATE TABLE oracle_dynamic_sql_test ( id INT PRIMARY KEY, username VARCHAR(50), salary NUMBER(10,2) ); INSERT INTO oracle_dynamic_sql_test VALUES (1, 'ZhangSan', 8000.00); INSERT INTO oracle_dynamic_sql_test VALUES (2, 'LiSi', 9500.00);
-
用 PL/SQL 块执行动态 SQL(ksql 支持直接运行 PL/SQL 块哦):
sqlDECLARE v_salary NUMBER(10,2); -- 接收查询结果 v_id INT := 1; -- 传入参数 v_new_salary NUMBER(10,2) := 8500.00; -- 修改后的值 BEGIN -- 1. using子句:传入参数v_id,into子句:接收salary EXECUTE IMMEDIATE 'SELECT salary FROM oracle_dynamic_sql_test WHERE id = :1' INTO v_salary USING v_id; DBMS_OUTPUT.PUT_LINE('修改前薪资:' || v_salary); -- 输出修改前薪资 -- 2. returning into子句:返回修改后的salary EXECUTE IMMEDIATE 'UPDATE oracle_dynamic_sql_test SET salary = :1 WHERE id = :2 RETURNING salary INTO :3' USING v_new_salary, v_id RETURNING INTO v_salary; DBMS_OUTPUT.PUT_LINE('修改后薪资:' || v_salary); -- 输出修改后薪资 COMMIT; END; / -- 注意:PL/SQL块结尾需加"/"触发执行
-
开启输出(ksql 默认是关闭 DBMS_OUTPUT 的,得手动打开):
sqlSET SERVEROUTPUT ON; -- 开启输出
-
执行上面的 PL/SQL 块,结果是这样的,和 Oracle 输出一样:
plaintext修改前薪资:8000.00 修改后薪资:8500.00 ANONYMOUS BLOCK EXECUTE
演示 2:LATERAL 连接(多表关联的灵活查询)
Oracle 里的LATERAL
连接允许子查询引用外部表的列,金仓在语法上完全兼容,这种连接在 "主表 + 子查询关联" 的场景里特别好用。
-
创建主表和子表:
sql-- 主表:部门表 CREATE TABLE dept (dept_id INT PRIMARY KEY, dept_name VARCHAR(50)); INSERT INTO dept VALUES (10, '研发部'); INSERT INTO dept VALUES (20, '销售部'); -- 子表:员工表 CREATE TABLE emp (emp_id INT PRIMARY KEY, emp_name VARCHAR(50), dept_id INT, salary NUMBER(10,2)); INSERT INTO emp VALUES (101, 'WangWu', 10, 7500.00); INSERT INTO emp VALUES (102, 'ZhaoLiu', 10, 8200.00); INSERT INTO emp VALUES (201, 'QianQi', 20, 9000.00);
-
用 LATERAL 连接查询 "每个部门的最高薪资员工":
sqlSELECT d.dept_name, e.emp_name, e.salary FROM dept d LEFT JOIN LATERAL ( -- 子查询引用外部表dept的dept_id SELECT emp_name, salary FROM emp WHERE dept_id = d.dept_id ORDER BY salary DESC LIMIT 1 -- 取最高薪资员工 ) e ON 1=1; -- LATERAL连接条件
-
执行结果出来了,正确关联了部门和最高薪资的员工:
plaintextdept_name | emp_name | salary -----------+----------+--------- 研发部 | ZhaoLiu | 8200.00 销售部 | QianQi | 9000.00 (2 rows)
2.2.3 其他功能兼容:HINT 调优与闪回(FLASHBACK)
演示 1:Oracle 风格 HINT 调优
HINT 是 Oracle 里用来指导优化器选择执行计划的语法,金仓支持常见的 HINT(比如/*+ INDEX */
、/*+ FULL */
)。
-
给员工表创建个索引:
sqlCREATE INDEX idx_emp_dept_id ON emp(dept_id);
-
用 HINT 强制走索引查询:
sql-- /*+ INDEX(emp idx_emp_dept_id) */ :强制使用idx_emp_dept_id索引 SELECT /*+ INDEX(emp idx_emp_dept_id) */ emp_name, salary FROM emp WHERE dept_id = 10;
-
看看执行计划(验证一下 HINT 有没有生效):
sqlEXPLAIN ANALYZE -- 金仓兼容的执行计划查看命令 SELECT /*+ INDEX(emp idx_emp_dept_id) */ emp_name, salary FROM emp WHERE dept_id = 10;
-
执行结果能看到 "Index Scan using idx_emp_dept_id on emp",说明 HINT 生效了:
plaintextQUERY PLAN ------------------------------------------- Index Scan using idx_emp_dept_id on emp (cost=0.15..8.17 rows=2 width=58) (actual time=0.02..0.03 rows=2 loops=1) Index Cond: (dept_id = 10) Planning Time: 0.12 ms Execution Time: 0.05 ms (4 rows)
演示 2:闪回查询(FLASHBACK QUERY)
Oracle 的闪回查询能查询 "过去某个时间点的数据",金仓支持FLASHBACK TABLE ... TO TIMESTAMP
这种语法。
-
先修改一条数据(模拟一下误操作):
sql-- 记录当前时间(假设为2024-05-20 15:30:00) SELECT CURRENT_TIMESTAMP FROM dual; -- 修改员工101的薪资(模拟误操作) UPDATE emp SET salary = 10000.00 WHERE emp_id = 101; COMMIT; -- 查看修改后的数据 SELECT emp_name, salary FROM emp WHERE emp_id = 101;
-
用闪回恢复到修改前的时间点:
sql-- 闪回表到修改前的时间(比当前时间早1分钟,需根据实际时间调整) FLASHBACK TABLE emp TO TIMESTAMP TO_TIMESTAMP('2024-05-20 15:29:00', 'YYYY-MM-DD HH24:MI:SS');
-
验证一下恢复结果(薪资回到了修改前的 7500.00):
sqlSELECT emp_name, salary FROM emp WHERE emp_id = 101;
-
执行结果:
plaintextemp_name | salary ----------+--------- WangWu | 7500.00 (1 row)
2.3 PL/SQL 兼容特性:游标、自治事务与系统包
PL/SQL 是 Oracle 的核心编程语言,金仓支持 PL/SQL 的游标属性、集合类型、自治事务,还有常用的系统包(比如DBMS_XMLQUERY
)。
2.3.1 游标属性兼容(% FOUND、% ROWCOUNT)
Oracle 游标里的%FOUND
(判断是否找到数据)和%ROWCOUNT
(统计影响行数)这两个属性特别常用,金仓对它们完全兼容。
-
用 PL/SQL 块演示一下游标属性:
sqlDECLARE -- 定义游标:查询研发部员工 CURSOR emp_cursor IS SELECT emp_name, salary FROM emp WHERE dept_id = 10; v_emp_name emp.emp_name%TYPE; v_salary emp.salary%TYPE; BEGIN OPEN emp_cursor; -- 打开游标 LOOP FETCH emp_cursor INTO v_emp_name, v_salary; -- 提取数据 EXIT WHEN emp_cursor%NOTFOUND; -- %NOTFOUND:无数据时退出 -- 输出员工信息 DBMS_OUTPUT.PUT_LINE('员工:' || v_emp_name || ',薪资:' || v_salary); END LOOP; -- %ROWCOUNT:输出总查询行数 DBMS_OUTPUT.PUT_LINE('研发部员工总数:' || emp_cursor%ROWCOUNT); CLOSE emp_cursor; -- 关闭游标 END; /
-
执行结果和 Oracle 的输出一致:
plaintext员工:WangWu,薪资:7500.00 员工:ZhaoLiu,薪资:8200.00 研发部员工总数:2 ANONYMOUS BLOCK EXECUTE
2.3.2 自治事务(AUTONOMOUS_TRANSACTION)
Oracle 的自治事务允许 "子事务独立于主事务提交 / 回滚",金仓支持PRAGMA AUTONOMOUS_TRANSACTION
这种语法。
-
创建一张日志表(用来记录自治事务的操作):
sqlCREATE TABLE oracle_autonomous_log ( log_id INT PRIMARY KEY, log_content VARCHAR(100), log_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP ); CREATE SEQUENCE seq_log_id START WITH 1 INCREMENT BY 1; -- 日志ID序列
-
定义一个自治事务过程:
sqlCREATE OR REPLACE PROCEDURE add_autonomous_log(p_content VARCHAR(100)) IS PRAGMA AUTONOMOUS_TRANSACTION; -- 声明自治事务 v_log_id INT; BEGIN -- 获取序列值 SELECT seq_log_id.NEXTVAL INTO v_log_id FROM dual; -- 插入日志 INSERT INTO oracle_autonomous_log (log_id, log_content) VALUES (v_log_id, p_content); COMMIT; -- 自治事务独立提交 END; /
-
测试一下主事务和自治事务:
sqlDECLARE BEGIN -- 1. 主事务:修改员工薪资 UPDATE emp SET salary = salary + 500 WHERE dept_id = 10; -- 2. 调用自治事务:插入日志(独立提交) add_autonomous_log('研发部员工薪资增加500'); -- 3. 主事务回滚 ROLLBACK; -- 4. 查看日志(自治事务已提交,日志存在) DBMS_OUTPUT.PUT_LINE('日志记录数:' || (SELECT COUNT(*) FROM oracle_autonomous_log)); -- 5. 查看员工薪资(主事务回滚,薪资未变) DBMS_OUTPUT.PUT_LINE('WangWu当前薪资:' || (SELECT salary FROM emp WHERE emp_id = 101)); END; /
-
执行结果出来了,自治事务提交了,主事务回滚了:
plaintext日志记录数:1 WangWu当前薪资:7500.00 ANONYMOUS BLOCK EXECUTE
2.3.3 系统包兼容:DBMS_XMLQUERY(XML 数据处理)
Oracle 的DBMS_XMLQUERY
包用来把查询结果转换成 XML,金仓支持这个包的核心功能getXML
。
-
用
DBMS_XMLQUERY.getXML
生成员工的 XML 数据:sqlDECLARE v_xml CLOB; -- 存储XML结果 BEGIN -- 将"研发部员工"查询结果转换为XML v_xml := DBMS_XMLQUERY.getXML( 'SELECT emp_name, salary FROM emp WHERE dept_id = 10' ); -- 输出XML结果 DBMS_OUTPUT.PUT_LINE('员工XML数据:'); DBMS_OUTPUT.PUT_LINE(v_xml); END; /
-
执行结果生成了标准的 XML 格式,和 Oracle 的输出一样:
plaintext员工XML数据: <?xml version="1.0"?> <ROWSET> <ROW> <EMP_NAME>WangWu</EMP_NAME> <SALARY>7500.00</SALARY> </ROW> <ROW> <EMP_NAME>ZhaoLiu</EMP_NAME> <SALARY>8200.00</SALARY> </ROW> </ROWSET> ANONYMOUS BLOCK EXECUTE
三、结语
通过这次实战操作,我们已经在 Windows 系统上装好了 KingbaseES V9R1C10(用的是 Oracle 兼容模式),而且验证了 SQL、PL/SQL 层面的核心 Oracle 兼容特性。从yminterval
时间类型到execute immediate
动态 SQL,从游标属性到自治事务,金仓数据库都做到了和 Oracle 无缝衔接,这为国产化替代提供了可靠的兼容性保障。
作为国产化数据库的重要选择,KingbaseES 的兼容性和稳定性已经过实践验证。希望这篇技术分享能给开发者们提供实实在在的参考,帮大家高效完成数据库迁移和应用适配工作。