当前位置: 首页 > news >正文

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

#数据库平替用金仓 #金仓产品体验官

引言

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

文章目录

    • 引言
    • 一、Windows 系统安装 KingbaseES V9R1C10(Oracle 兼容模式)
      • 1.1 环境准备:先把这些前提条件备齐
        • 1.1.1 硬件环境要求
        • 1.1.2 软件环境要求
        • 1.1.3 获取安装包与授权文件
      • 1.2 详细安装步骤:从解压到实例创建
        • 1.2.1 解压 ISO 安装包
        • 1.2.2 创建专属安装用户(避免权限问题)
        • 1.2.3 创建安装目录并配置权限
        • 1.2.4 运行安装程序(开启 Oracle 兼容模式)
        • 1.2.5 创建数据库实例(关键!不创建无法使用)
      • 1.3 安装后验证:确保数据库能正常使用
        • 1.3.1 启动 KingbaseES 服务
      • 4.1 启动KingbaseES服务
        • 1.3.2 用 ksql 工具连接数据库
        • 1.3.3 执行简单 SQL 测试
    • 二、KingbaseES Oracle 兼容特性实战(ksql 操作演示)
      • 2.1 前置准备:进入 ksql 环境
      • 2.2 SQL 兼容特性:与 Oracle 语法无缝衔接
        • 2.2.1 数据类型与对象兼容:yminterval、dsinterval 与分区表
          • 演示 1:yminterval 与 dsinterval 类型使用
          • 演示 2:Oracle 风格分区表与 interval 分区自动分裂
        • 2.2.2 SQL 语句兼容:execute immediate 与 LATERAL 连接
          • 演示 1:execute immediate 动态 SQL(into/using/returning into 子句)
          • 演示 2:LATERAL 连接(多表关联的灵活查询)
        • 2.2.3 其他功能兼容:HINT 调优与闪回(FLASHBACK)
          • 演示 1:Oracle 风格 HINT 调优
          • 演示 2:闪回查询(FLASHBACK QUERY)
      • 2.3 PL/SQL 兼容特性:游标、自治事务与系统包
        • 2.3.1 游标属性兼容(% FOUND、% ROWCOUNT)
        • 2.3.2 自治事务(AUTONOMOUS_TRANSACTION)
        • 2.3.3 系统包兼容:DBMS_XMLQUERY(XML 数据处理)
    • 三、结语

7ba121ff76294d6a204058322e9e2585.jpeg

一、Windows 系统安装 KingbaseES V9R1C10(Oracle 兼容模式)

这次安装选的是 KingbaseES V9R1C10 版本,特意开启了Oracle 兼容模式,为后面的兼容特性测试打好基础。我全程照着超详细的保姆级教程来操作,从环境准备到具体步骤再到最后的验证环节都有覆盖,能帮大家避开不少坑。

1.1 环境准备:先把这些前提条件备齐

安装之前,得先确认软硬件环境符不符合要求,不然可能会安装到一半卡住,或者后续运行出问题。

1.1.1 硬件环境要求

普通个人电脑或者服务器都能满足安装需求,具体参数看下面这张表:

组件最低要求推荐配置说明
CPUX86_64 架构(Intel/AMD)X86_64 架构其实鲲鹏、飞腾这些国产 CPU 也支持,这次我就以 X64 为例来讲
内存512MB2GB 及以上内存要是不够,服务启动会很慢,甚至可能卡顿
硬盘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的ymintervalwork_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:002 | 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 块哦):

    DECLAREv_salary NUMBER(10,2);       -- 接收查询结果v_id INT := 1;               -- 传入参数v_new_salary NUMBER(10,2) := 8500.00; -- 修改后的值
    BEGIN-- 1. using子句:传入参数v_id,into子句:接收salaryEXECUTE IMMEDIATE 'SELECT salary FROM oracle_dynamic_sql_test WHERE id = :1'INTO v_salaryUSING v_id;DBMS_OUTPUT.PUT_LINE('修改前薪资:' || v_salary); -- 输出修改前薪资-- 2. returning into子句:返回修改后的salaryEXECUTE 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_idSELECT 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;
    BEGINOPEN emp_cursor; -- 打开游标LOOPFETCH 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))
    ISPRAGMA 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 数据:

    DECLAREv_xml CLOB; -- 存储XML结果
    BEGIN-- 将“研发部员工”查询结果转换为XMLv_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 的兼容性和稳定性已经过实践验证。希望这篇技术分享能给开发者们提供实实在在的参考,帮大家高效完成数据库迁移和应用适配工作。

http://www.dtcms.com/a/410407.html

相关文章:

  • 阿里云建站流程集约化网站建设
  • Classic McEliece:后量子密码的“元老”与NIST标准化的启示
  • 【论健康】健康的不可能三角
  • 19C数据库提示ORA-65096: 公用用户名或角色名无效(详细操作版)
  • 软考中级习题与解答——第十三章_数据库分析与设计(2)
  • tomcat升级操作
  • 广州高端品牌网站建设后台管理便捷蜜雪冰城推广软文
  • 基于 SpringBoot+Logicflow 的轻流程任务执行
  • 基础组合计数(三道例题)
  • ShardingSphere 与分库分表:分布式数据库中间件实战指南
  • 《三重AI协作交易系统:从技术债泥潭到毫秒级响应的实战笔记》
  • AI 赋能楼宇自控 DDC 系统:重构智慧建筑的核心引擎
  • 更改wordpress密码上海关键词优化排名哪家好
  • 最好的设计师网站wordpress 实例
  • IDEA 实现SpringBoot热部署(HotSwap和DevTools混用)
  • 《IDEA 2025 长效使用指南:2099 年有效期配置实战之JetBrains全家桶有效》​
  • IntelliJ IDEA / Android Studio 里直接跑 Cursor(不用来回切窗口)
  • HarmonyOS应用前后台状态切换
  • 网站建设app销售好做吗哪里长沙网站开发
  • pdf文件根据页数解析成图片 js vue3
  • Http与WebSocket
  • AI 赋能 EMS 微电网能效管理平台:构建分布式能源的智能调控中枢
  • 内网信息收集与命令详解
  • 电茶炉方案开发,茶炉板MCU控制方案分析
  • React Zustand 学习笔记(对照Vue3)
  • PyTorch实现CIFAR-10图像分类:从数据加载到模型训练全流程
  • 鸿蒙应用内存优化全攻略:从泄漏排查到对象池实战
  • ReactUse 与ahook对比
  • 网站建设与维护属于什么岗位wordpress免费企业站主题
  • 长安网站设计仿照别的网站做