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

举报
倔强的石头_ 发表于 2025/11/20 14:32:38 2025/11/20
【摘要】 引言最近我以开发者的身份参加了金仓数据库第 3 期 “Oracle 兼容深度体验” 活动,真切感受到金仓数据库在国产化替代进程中展现出的强大兼容性。接下来我会分两部分来分享:一是 “Windows 系统安装 KingbaseES V9R1C10” 的全过程,二是 “Oracle 兼容特性实战测评”。全文都会用通俗易懂的语言搭配详细操作步骤,就算是刚接触金仓数据库的小伙伴,跟着步骤做也能轻松上...

引言

最近我以开发者的身份参加了金仓数据库第 3 期 “Oracle 兼容深度体验” 活动,真切感受到金仓数据库在国产化替代进程中展现出的强大兼容性。接下来我会分两部分来分享:一是 “Windows 系统安装 KingbaseES V9R1C10” 的全过程,二是 “Oracle 兼容特性实战测评”。全文都会用通俗易懂的语言搭配详细操作步骤,就算是刚接触金仓数据库的小伙伴,跟着步骤做也能轻松上手。

文章目录


7ba121ff76294d6a204058322e9e2585.jpeg


一、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):

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

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

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

     授权类型: 开发版.
    输入 "help" 来获取帮助信息.
    
    test=#
    

    在这里插入图片描述

    1.3.3 执行简单 SQL 测试

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

    1. 创建测试表:
      CREATE TABLE test_user (id INT PRIMARY KEY, name VARCHAR(50));
      

    在这里插入图片描述

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

    在这里插入图片描述

    1. 查询数据:
      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 的安装路径:

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

        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. 咱们先来建一张包含间隔类型的表:

        -- 创建表,包含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 风格的间隔语法):

        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. 查询数据(验证一下间隔类型的计算效果):

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

        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 分区表(按月份分区):

        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. 插入跨月份的数据(这样就能触发分区自动分裂了):

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

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

        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. 先创建一张测试表:

        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 块哦):

        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 的,得手动打开):

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

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

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

      1. 创建主表和子表:

        -- 主表:部门表
        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 连接查询 “每个部门的最高薪资员工”:

        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. 执行结果出来了,正确关联了部门和最高薪资的员工:

        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. 给员工表创建个索引:

        CREATE INDEX idx_emp_dept_id ON emp(dept_id);
        
      2. 用 HINT 强制走索引查询:

        -- /*+ 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 有没有生效):

        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 生效了:

        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. 先修改一条数据(模拟一下误操作):

        -- 记录当前时间(假设为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. 用闪回恢复到修改前的时间点:

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

        SELECT emp_name, salary FROM emp WHERE emp_id = 101;
        
      4. 执行结果:

        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 块演示一下游标属性:

        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 的输出一致:

        员工:WangWu,薪资:7500.00
        员工:ZhaoLiu,薪资:8200.00
        研发部员工总数:2
        ANONYMOUS BLOCK EXECUTE
        

      2.3.2 自治事务(AUTONOMOUS_TRANSACTION)

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

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

        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. 定义一个自治事务过程:

        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. 测试一下主事务和自治事务:

        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. 执行结果出来了,自治事务提交了,主事务回滚了:

        日志记录数:1
        WangWu当前薪资:7500.00
        ANONYMOUS BLOCK EXECUTE
        

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

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

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

        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 的输出一样:

        员工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 的兼容性和稳定性已经过实践验证。希望这篇技术分享能给开发者们提供实实在在的参考,帮大家高效完成数据库迁移和应用适配工作。

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。