首批通过分布式安全可靠测评,为关键业务系统打造
PL 执行报错 -5542
更新时间:2026-05-29 08:46
问题描述
OceanBase 数据库中 PL 执行报错 -5542。
示例如下。
创建表。
obclient [SYS]> create table t1(a int, b int); Query OK, 0 rows affected (0.029 sec)插入数据。
obclient [SYS]> insert into t1 values (1, 2); Query OK, 1 row affected (0.004 sec)创建包头 pkg1 声明。
obclient [SYS]> create or replace package pkg1 as function f1(param1 t1%rowtype) return number; end; / Query OK, 0 rows affected (0.024 sec)创建包体 pkg1 实现包头所有声明。
obclient [SYS]> create or replace package body pkg1 as function f1(param1 t1%rowtype) return number as begin return param1.a + param1.b; end; end; / Query OK, 0 rows affected (0.016 sec)在包 pkg2 中声明存储过程 p1。
obclient [SYS]> create or replace package pkg2 as procedure p1; end; / Query OK, 0 rows affected (0.011 sec)在包体 pkg2 中实现存储过程 p1。
obclient [SYS]> create or replace package body pkg2 as procedure p1 as cursor cur is select * from t1; num number; begin for v in cur loop num := pkg1.f1(v); dbms_output.put_line(num); end loop; end; end; / Query OK, 0 rows affected (0.024 sec)调用包体 pkg2 中实现存储过程 p1。
obclient [SYS]> call pkg2.p1(); Query OK, 0 rows affected (0.072 sec)日志信息。
INFO holding_log_need_flush:0 [2748465][0][xxxxx-xxxxx-xxxxx-xxxxx] [lt=4] [dc=0] WARN [PL] analyze_package (ob_pl_compile.cpp:634) [2748465][xxxxx-xxxxx-xxxxx-xxxxx] [T] fail to exec resolver.resolve(parse_tree, package_ast)(ret=-5542) WARN [PL] compile_package (ob_pl_compile.cpp:699) [2748465][xxxxx-xxxxx-xxxxx-xxxxx] [T] fail to exec analyze_package(source, parent_ns, package_ast, package_info.is_for_trigger())(ret=-5542) WARN [PL] load_package_body (ob_pl_package_manager.cpp:877) [2748465][xxxxx-xxxxx-xxxxx-xxxxx] [T] fail to exec compiler.compile_package(package_body_info, &(package_spec_ast.get_body()->get_namespace()), package_body_ast, *package_body)(ret=-5542) WARN [PL] get_cached_package (ob_pl_package_manager.cpp:1070) [2748465][xxxxx-xxxxx-xxxxx-xxxxx] [T] fail to exec load_package_body(resolve_ctx, *package_spec_info, *package_body_info, package_body)(ret=-5542) WARN [PL] get_package_type (ob_pl_package_manager.cpp:478) [2748465][xxxxx-xxxxx-xxxxx-xxxxx] [T] get cached package failed(ret=-5542) WARN [PL] get_user_type (ob_pl_resolver.cpp:14299) [2748465][xxxxx-xxxxx-xxxxx-xxxxx] [T] fail to exec package_manager.get_package_type(*this, extract_package_id(type_id, tenant_id), type_id, user_type)(ret=-5542, type_id=19897778177)
适用版本
OceanBase 数据库 V3.2.3 BP7 (oceanbase-3.2.3.3-107000092023011911) 之前版本。
问题原因
for loop cursor 中 for 后面紧跟变量,作为参数直接传给其他 routine 时会报错。
解决方法
升级至问题已修复版本。
目前已修复的版本包括 OceanBase 数据库 V3.2.3 BP7 (oceanbase-3.2.3.3-107000092023011911) 及之后版本、V3.2.4 BP1 (oceanbase-3.2.4.1-101000052023010822) 及之后版本。
规避方法
定义一个临时变量 tmp,将 for 后面紧跟的变量赋值给 tmp,然后使用 tmp 可绕过。