【金仓数据库产品体验官】Windows 安装 KingbaseES V9R1C10 与 Oracle 兼容特性实战

引言

最近我以开发者的身份参加了金仓数据库第 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)来执行安装操作,不要利用默认的管理账号(缩减权限相关风险),其具体步骤包含以下几个方面:

  1. 按下Win + R 键,接着输入 compmgmt.msc ,点击确定之后会打开【计算机管理】界面;
  2. 在左侧的导航栏里找到并点击【本地用户和组】,再点击其中的【用户】选项
  3. 右键点击【用户】,然后选择【新建用户】,这样就会跳出"新建用户"窗口
    • 用户名一栏填写 kingbase (此名称固定,便于后续操作)
    • 在设置密码时,输入一个复杂的密码,比如 Kingbase@2024 ,并且取消选中"用户需下次登录时更改密码"这个选项,然后勾选上"密码永不过期"
    • 最后点击【创建】按钮来创建该用户账户
  4. 创建好之后,右键点击刚才新建的 kingbase 用户,选择【属性】,在属性窗口中切换到【隶属于】标签页,点击【添加】按钮
  5. 在"请输入对象名称以执行选择"框内输入Administrators,点击【检查名称】,确认无误后再点击【确定】,从而把kingbase用户添加到Administrators组当中,进而保证其具有安装相关权限

1.2.3 创建安装目录并配置权限

为了规范管理,咱们自定义一个安装目录(不建议装在C盘,避免系统盘空间不足):

  1. 在D盘新建目录:D:\Kingbase\ES\V9
  2. 右键V9文件夹→【属性】→【安全】→【编辑】;
  3. 点击【添加】,输入kingbase,检查名称后确定;
  4. kingbase用户授予【完全控制】权限(避免安装时权限不足),点击【确定】保存。

1.2.4 运行安装程序(开启 Oracle 兼容模式)

  1. 回到之前的KES安装包下载路径,找到setup.bat

  2. 右键setup.exe→【以管理员身份运行】

  3. 弹出安装向导,点击【下一步】,注意尽量按照建议把该关的的程序关掉,文档保存退出

  4. 许可协议页面 :选择"我接受许可协议的条款",点击【下一步】;

  5. 添加授权文件 : 将刚刚下载好的授权文件添加

  6. 选择安装路径

    • 点击【浏览】,选择之前创建的D:\Kingbase\ES\V9
    • 系统会自动检查路径权限,确认无误后点击【下一步】;
  7. 安装类型选择

    • 1-完全安装(推荐新手,包含数据库服务器、运维工具、开发工具等所有组件);
    • 2-服务器安装(只装数据库服务,适合生产环境);
    • 3-定制安装(自选组件,适合熟悉的用户); 这里选【1-完全安装】,点击【下一步】;
  8. 安装预览 :确认安装类型、路径、组件等信息,没问题就点击【安装】;

  9. 等待安装 :安装过程需要5-10分钟(取决于硬件性能),期间不要关闭窗口,避免安装中断;

  10. 安装完成 :提示"安装成功"后,勾选"创建快捷方式"(方便后续启动),点击【完成】。

1.2.5 创建数据库实例(关键!不创建无法使用)

「金仓数据库管控工具」启动时,安装完毕后会自动开启该工具,亦可通过如下途径来打开可视化工具

  • 桌面快捷方式 :找到"金仓数据库管控工具"的图标并双击启动(若安装时选择了创建快捷方式)

  • 开始菜单 :点击 开始→所有程序→KingbaseES V9→金仓数据库管控工具

打开之后,左侧导航选择【单节点列表】(单节点部署时选择此选项,集群环境则选择"读写分离集群列表"),右侧会显示当前已有的实例(刚安装完毕时为空)。

点击「创建新实例」,会进入到配置向导当中,在【单节点列表】这个界面里面,要点击那个红色的按钮【创建新实例】,然后才能去设置实例相关的参数

弹出"创建数据库实例"窗口,按以下步骤填写:

如果需要调整内存、连接数等高级参数,勾选 【高级配置】 ;否则直接点击 【下一步】

进入"执行"页面,务必勾选两个关键选项:

  • 创建后立即执行:让系统自动初始化数据文件(如日志、表空间);
  • 创建后注册为系统服务 :将实例注册为Windows服务(如KingbaseES_V9_kes_dev),方便开机自启和管理。

点击 【执行】,等待进度条走完:

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

1.3 安装后验证:确保数据库能正常使用

1.3.1 启动 KingbaseES 服务

安装完毕之后,要验证服务是否已经启动,是否可以正常执行连接操作,从而防止在后续的开发过程中遭遇问题

4.1 启动KingbaseES服务

  1. 按下Win+R,输入services.msc,打开【服务】窗口;

  2. 在服务列表中找到刚刚创建的实例,名称就是你刚刚创建的实例名称,如果没改的话默认就是"kes_instance"

  3. 右键服务→【启动】(如果已启动则跳过);

    • 若启动失败,参考"常见问题"部分排查;
  4. 确认服务状态为"正在运行",启动类型为"自动"(避免重启后需手动启动)。

1.3.2 用 ksql 工具连接数据库

ksql是KingbaseES自带的命令行客户端,用来测试连接最方便:

  1. 打开【命令提示符】(以kingbase用户登录,或管理员身份);

  2. 进入ksql所在路径(安装目录下的Server\bin):

    cmd 复制代码
    cd /d D:\Kingbase\ES\V9\Server\bin
  3. 执行连接命令(默认管理员用户system,密码manager,数据库test,端口54321):

    cmd 复制代码
    ksql -U system -d test -h localhost -p 54321
  4. 输入密码(默认manager,如果安装时改了密码就输修改后的),按回车;

  5. 若出现以下提示,说明连接成功:

bash 复制代码
 授权类型: 开发版.
输入 "help" 来获取帮助信息.

test=#

1.3.3 执行简单 SQL 测试

连接成功后,咱们执行几条简单SQL,验证数据库功能正常:

  1. 创建测试表:

    sql 复制代码
    CREATE TABLE test_user (id INT PRIMARY KEY, name VARCHAR(50));
  1. 插入数据:

    sql 复制代码
    INSERT INTO test_user VALUES (1, '金仓数据库');
  1. 查询数据:

    sql 复制代码
    SELECT * FROM test_user;
  2. 若输出以下结果,说明数据库正常工作: id | name
    ----+------------ 1 | 金仓数据库 (1 row)

  1. 断开连接:输入\q并回车,退出ksql。

二、KingbaseES Oracle 兼容特性实战(ksql 操作演示)

这次实战操作,咱们就围绕活动要求的SQL 兼容、PL/SQL 兼容两大核心特性,用 ksql 工具来实际演示一下。所有操作都基于已经创建好的 Oracle 兼容模式实例。

2.1 前置准备:进入 ksql 环境

  1. 先打开命令提示符,进入 ksql 的安装路径:

    cmd 复制代码
    cd /d D:\Tools\Kingbase\ES\Server\bin
  2. 接着连接数据库(和 1.3.2 步骤一样):

    cmd 复制代码
    ksql -U system -d test -h localhost -p 54321
  3. 输入密码manager,就能进入test=#的交互模式,接下来就可以开始测试了。

2.2 SQL 兼容特性:与 Oracle 语法无缝衔接

金仓 ES V9R1C10 在 SQL 层面跟 Oracle 深度兼容,像数据类型、SQL 语句、调优功能这些都包含在内。下面咱们就来演示几个核心特性。

2.2.1 数据类型与对象兼容:yminterval、dsinterval 与分区表

Oracle 里的yminterval(年月间隔)和dsinterval(日时间隔)是常用的时间类型,金仓对这俩完全兼容。另外,它还支持 Oracle 风格的分区表和自动分裂功能。

演示 1:yminterval 与 dsinterval 类型使用
  1. 咱们先来建一张包含间隔类型的表:

    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
    );
  2. 插入数据(用的是 Oracle 风格的间隔语法):

    sql 复制代码
    INSERT 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秒
    );
  3. 查询数据(验证一下间隔类型的计算效果):

    sql 复制代码
    -- 计算"雇佣日期+服务年限"得到当前服务截止日期
    SELECT 
      id,
      hire_date,
      service_years,
      hire_date + service_years AS current_service_end, -- 间隔类型参与计算
      work_hours
    FROM oracle_interval_test;
  4. 执行结果是这样的,和 Oracle 的输出完全一致:

    plaintext 复制代码
    id | 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分区能自动分裂,不用咱们手动去创建新分区。

  1. 创建 interval 分区表(按月份分区):

    sql 复制代码
    CREATE 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'))
    );
  2. 插入跨月份的数据(这样就能触发分区自动分裂了):

    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);
  3. 看看分区信息(验证一下自动分裂有没有成功):

    sql 复制代码
    -- 金仓兼容Oracle的ALL_TAB_PARTITIONS视图
    SELECT partition_name, high_value 
    FROM ALL_TAB_PARTITIONS 
    WHERE table_name = 'ORACLE_PARTITION_TEST';
  4. 执行结果出来了,能看到自动创建的 p202402、p202403 分区:

    plaintext 复制代码
    partition_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(返回修改后的值)这些用法。

  1. 先创建一张测试表:

    sql 复制代码
    CREATE 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);
  2. 用 PL/SQL 块执行动态 SQL(ksql 支持直接运行 PL/SQL 块哦):

    sql 复制代码
    DECLARE
      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块结尾需加"/"触发执行
  3. 开启输出(ksql 默认是关闭 DBMS_OUTPUT 的,得手动打开):

    sql 复制代码
    SET SERVEROUTPUT ON; -- 开启输出
  4. 执行上面的 PL/SQL 块,结果是这样的,和 Oracle 输出一样:

    plaintext 复制代码
    修改前薪资:8000.00
    修改后薪资:8500.00
    ANONYMOUS BLOCK EXECUTE
演示 2:LATERAL 连接(多表关联的灵活查询)

Oracle 里的LATERAL连接允许子查询引用外部表的列,金仓在语法上完全兼容,这种连接在 "主表 + 子查询关联" 的场景里特别好用。

  1. 创建主表和子表:

    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);
  2. 用 LATERAL 连接查询 "每个部门的最高薪资员工":

    sql 复制代码
    SELECT 
      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连接条件
  3. 执行结果出来了,正确关联了部门和最高薪资的员工:

    plaintext 复制代码
    dept_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 */)。

  1. 给员工表创建个索引:

    sql 复制代码
    CREATE INDEX idx_emp_dept_id ON emp(dept_id);
  2. 用 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;
  3. 看看执行计划(验证一下 HINT 有没有生效):

    sql 复制代码
    EXPLAIN ANALYZE -- 金仓兼容的执行计划查看命令
    SELECT /*+ INDEX(emp idx_emp_dept_id) */ emp_name, salary 
    FROM emp 
    WHERE dept_id = 10;
  4. 执行结果能看到 "Index Scan using idx_emp_dept_id on emp",说明 HINT 生效了:

    plaintext 复制代码
    QUERY 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这种语法。

  1. 先修改一条数据(模拟一下误操作):

    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;
  2. 用闪回恢复到修改前的时间点:

    sql 复制代码
    -- 闪回表到修改前的时间(比当前时间早1分钟,需根据实际时间调整)
    FLASHBACK TABLE emp 
    TO TIMESTAMP TO_TIMESTAMP('2024-05-20 15:29:00', 'YYYY-MM-DD HH24:MI:SS');
  3. 验证一下恢复结果(薪资回到了修改前的 7500.00):

    sql 复制代码
    SELECT emp_name, salary FROM emp WHERE emp_id = 101;
  4. 执行结果:

    plaintext 复制代码
    emp_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(统计影响行数)这两个属性特别常用,金仓对它们完全兼容。

  1. 用 PL/SQL 块演示一下游标属性:

    sql 复制代码
    DECLARE
      -- 定义游标:查询研发部员工
      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;
    /
  2. 执行结果和 Oracle 的输出一致:

    plaintext 复制代码
    员工:WangWu,薪资:7500.00
    员工:ZhaoLiu,薪资:8200.00
    研发部员工总数:2
    ANONYMOUS BLOCK EXECUTE

2.3.2 自治事务(AUTONOMOUS_TRANSACTION)

Oracle 的自治事务允许 "子事务独立于主事务提交 / 回滚",金仓支持PRAGMA AUTONOMOUS_TRANSACTION这种语法。

  1. 创建一张日志表(用来记录自治事务的操作):

    sql 复制代码
    CREATE 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序列
  2. 定义一个自治事务过程:

    sql 复制代码
    CREATE 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;
    /
  3. 测试一下主事务和自治事务:

    sql 复制代码
    DECLARE
    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;
    /
  4. 执行结果出来了,自治事务提交了,主事务回滚了:

    plaintext 复制代码
    日志记录数:1
    WangWu当前薪资:7500.00
    ANONYMOUS BLOCK EXECUTE

2.3.3 系统包兼容:DBMS_XMLQUERY(XML 数据处理)

Oracle 的DBMS_XMLQUERY包用来把查询结果转换成 XML,金仓支持这个包的核心功能getXML

  1. DBMS_XMLQUERY.getXML生成员工的 XML 数据:

    sql 复制代码
    DECLARE
      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;
    /
  2. 执行结果生成了标准的 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 的兼容性和稳定性已经过实践验证。希望这篇技术分享能给开发者们提供实实在在的参考,帮大家高效完成数据库迁移和应用适配工作。

相关推荐
望获linux3 小时前
【Linux基础知识系列:第一百四十篇】理解SELinux与系统安全
linux·运维·服务器·数据库·chrome·macos
卷Java3 小时前
CSS模板语法修复总结
java·前端·css·数据库·微信小程序·uni-app·springboot
豆豆豆大王3 小时前
头歌Kingbase ES内连接、外连接查询
大数据·数据库·elasticsearch
muxin-始终如一4 小时前
MySQL与Redis面试问题详解
数据库·redis·mysql
歪歪1004 小时前
如何在SQLite中实现事务处理?
java·开发语言·jvm·数据库·sql·sqlite
瑶总迷弟4 小时前
静默安装 Oracle Database 21c on CentOS 7.6
数据库·oracle·centos
博睿谷IT99_5 小时前
SQL SELECT 语句怎么用?COMPANY 表查询案例(含条件 / 模糊 / 分页)
数据库·sql·mysql
浅拾光º6 小时前
mysql字符串截取,如何在MySQL备份文件中安全截取敏感字符串?
数据库·mysql·安全
鸠摩智首席音效师6 小时前
如何删除 MySQL 数据库中的所有数据表 ?
数据库·mysql·oracle