HALO数据库对Oracle RECORD 类型的兼容
在企业核心系统从 Oracle 向国产数据库迁移的浪潮中,PL/SQL 兼容性是决定迁移成本、风险与工期的核心命脉。
RECORD 作为 Oracle 自定义复合类型,能将多字段封装为结构体,广泛用于存储过程、函数、游标与参数传递,是金融、政务、电信等传统 Oracle 场景的高频语法。迁移过程中,若国产数据库无法兼容 RECORD,将面临大量代码重构、业务逻辑改写、测试回归量暴增等问题。今天我们就聚焦国产HALO数据库对 Oracle RECORD 类型的兼容能力!
前置准备(所有用例通用)
创建一张测试表,插入一条数据:
CREATE TABLE emp_test( empno NUMBER(4), ename VARCHAR2(20), sal NUMBER(10,2) );INSERT INTO emp_test VALUES(7369, 'SMITH', 8000);
测试用例 1:基础自定义 RECORD
验证:是否支持 TYPE IS RECORD、字段赋值、输出
DECLARE-- 自定义RECORDTYPE emp_rec IS RECORD (id NUMBER,name VARCHAR2(20),salary NUMBER);v_emp emp_rec;BEGIN-- 赋值v_emp.id := 1001;v_emp.name := '测试姓名';v_emp.salary := 9999;-- 输出DBMS_OUTPUT.PUT_LINE('ID: ' || v_emp.id);DBMS_OUTPUT.PUT_LINE('姓名: ' || v_emp.name);DBMS_OUTPUT.PUT_LINE('工资: ' || v_emp.salary);END;/
测试结果截图
测试用例 2:% ROWTYPE 最核心兼容性
Oracle 开发中使用率最高,不兼容则迁移成本巨大
DECLARE-- 基于表自动定义RECORDv_emp emp_test%ROWTYPE;BEGINSELECT * INTO v_emp FROM emp_test WHERE empno=7369;DBMS_OUTPUT.PUT_LINE('姓名:' || v_emp.ename);DBMS_OUTPUT.PUT_LINE('工资:' || v_emp.sal);END;/
测试结果截图
测试用例 3:RECORD 作为存储过程参数
验证数据库是否支持业务系统最常用场景
-- 1. 定义RECORD类型CREATE OR REPLACE PROCEDURE proc_record_testISTYPE emp_rec IS RECORD (empno NUMBER,ename VARCHAR2(20));v_emp emp_rec;-- 2. 接收RECORD作为参数的子程序PROCEDURE print_emp(p_emp IN emp_rec)ISBEGINDBMS_OUTPUT.PUT_LINE('子程序打印:' || p_emp.ename);END;BEGINv_emp.empno := 7369;v_emp.ename := 'SMITH';-- 传入RECORDprint_emp(v_emp);END;/-- 执行CALL proc_record_test();
测试结果截图:
测试用例 4:游标 + RECORD
验证游标遍历场景兼容性
DECLARECURSOR cur_emp IS SELECT * FROM emp_test;v_emp emp_test%ROWTYPE;BEGINOPEN cur_emp;FETCH cur_emp INTO v_emp;WHILE cur_emp%FOUND LOOPDBMS_OUTPUT.PUT_LINE('游标读取:' || v_emp.ename);FETCH cur_emp INTO v_emp;END LOOP;CLOSE cur_emp;END;/
测试结果截图:
测试用例 5:RECORD 嵌套 + 集合
DECLARE-- 内层RECORDTYPE addr_rec IS RECORD (city VARCHAR2(20),zip VARCHAR2(10));-- 外层RECORD(嵌套)TYPE user_rec IS RECORD (id NUMBER,name VARCHAR2(20),addr addr_rec);-- 定义RECORD集合TYPE user_tab IS TABLE OF user_rec INDEX BY BINARY_INTEGER;v_users user_tab;BEGINv_users(1).id := 100;v_users(1).name := '测试';v_users(1).addr.city := '北京';v_users(1).addr.zip := '100000';DBMS_OUTPUT.PUT_LINE('城市:' || v_users(1).addr.city);END;/
测试结果截图:
总结:
通过以上RECORD 类型基础语法、% ROWTYPE 适配、存储过程传参、游标结合、嵌套与集合等场景的测试用例执行结果可以看出,HALO数据库对 Oracle RECORD 的支持能力已基本全面覆盖,从简单定义到复杂业务场景均能稳定运行,无需代码改造即可支撑原有 PL/SQL 逻辑平滑迁移。这不仅体现了HALO数据库在Oracle 兼容能力上的成熟度,也充分证明其能够满足企业业务系统从 Oracle 迁移过程中对存储过程、复合类型、业务逻辑复用的要求,为国产化替代提供了可靠、高效、低风险的技术支撑。