Halo Tech

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  -- 自定义RECORD  TYPE 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;/

测试结果截图

Image

测试用例 2:% ROWTYPE 最核心兼容性

Oracle 开发中使用率最高,不兼容则迁移成本巨大

DECLARE  -- 基于表自动定义RECORD  v_emp emp_test%ROWTYPE;BEGIN  SELECT * INTO v_emp FROM emp_test WHERE empno=7369;  DBMS_OUTPUT.PUT_LINE('姓名:' || v_emp.ename);  DBMS_OUTPUT.PUT_LINE('工资:' || v_emp.sal);END;/

测试结果截图

Image

测试用例 3:RECORD 作为存储过程参数

验证数据库是否支持业务系统最常用场景

-- 1. 定义RECORD类型CREATE OR REPLACE PROCEDURE proc_record_testIS  TYPE emp_rec IS RECORD (      empno NUMBER,      ename VARCHAR2(20)  );  v_emp emp_rec; -- 2. 接收RECORD作为参数的子程序 PROCEDURE print_emp(p_emp IN emp_rec)  IS  BEGIN    DBMS_OUTPUT.PUT_LINE('子程序打印:' || p_emp.ename);  END;BEGIN  v_emp.empno := 7369;  v_emp.ename := 'SMITH';  -- 传入RECORD  print_emp(v_emp);END;/-- 执行CALL proc_record_test();

测试结果截图:

Image

测试用例 4:游标 + RECORD

验证游标遍历场景兼容性

DECLARE  CURSOR cur_emp IS SELECT * FROM emp_test;  v_emp emp_test%ROWTYPE;BEGIN  OPEN cur_emp;  FETCH cur_emp INTO v_emp;  WHILE cur_emp%FOUND LOOP      DBMS_OUTPUT.PUT_LINE('游标读取:' || v_emp.ename);      FETCH cur_emp INTO v_emp;  END LOOP;  CLOSE cur_emp;END;/

测试结果截图:

Image

测试用例 5:RECORD 嵌套 + 集合

DECLARE  -- 内层RECORD  TYPE 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;BEGIN  v_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;/

测试结果截图:

Image

总结:

    通过以上RECORD 类型基础语法、% ROWTYPE 适配、存储过程传参、游标结合、嵌套与集合等场景的测试用例执行结果可以看出,HALO数据库对 Oracle RECORD 的支持能力已基本全面覆盖,从简单定义到复杂业务场景均能稳定运行,无需代码改造即可支撑原有 PL/SQL 逻辑平滑迁移。这不仅体现了HALO数据库在Oracle 兼容能力上的成熟度,也充分证明其能够满足企业业务系统从 Oracle 迁移过程中对存储过程、复合类型、业务逻辑复用的要求,为国产化替代提供了可靠、高效、低风险的技术支撑。