首批通过分布式安全可靠测评,为关键业务系统打造
OceanBase 数据库 Oracle 模式租户 package 私有 UDF,级联调用时报错 object info is null(ret=-4016 的原因及解决方法
更新时间:2025-05-13 08:41
问题现象
OceanBase 数据库 Oracle 模式租户 package 私有 UDF,级联调用时报错 -4016, Internal error。
obclient> create or replace package pkg0 is
-> type rd is record(c0 int,c1 int);
-> procedure p0;
-> end;
-> /
Query OK, 0 rows affected (0.04 sec)
obclient> create or replace package body pkg0 is function f0 return rd is r rd;
-> begin
-> select 1,2 into r from dual;
-> return r;
-> end;
-> procedure p0 is
-> begin
-> dbms_output.put_line(f0().c0);
-> end;
-> end;
-> /
ORA-00600: internal error code, arguments: -4016, Internal error
at line : 8, col : 24
关键日志信息。
[2024-12-01 17:12:04.506259] WDIAG [SQL] print (ob_raw_expr_printer.cpp:3359) [27336][T1004_L0_G0][T1004][xxxxx-xxxxx-xxxxx-xxxxx] [lt=13][errcode=-4016] object info is null(ret=-4016, expr={item_type:"T_FUN_UDF", result_type:{meta:{type:"EXT", collation:"invalid_type", coercibility:"INVALID"}, accuracy:{length:486539265, precision:1956, scale:0}, flag:0, calc_type:{type:"NULL", collation:"invalid_type", coercibility:"INVALID"}}, expr_info:["IS_FUNC", "IS_PL_UDF", "IS_CONST_EXPR", "CNT_FUNC", "CNT_PL_UDF"], rel_id:[], database:"", package_name:"PKG0", func:"F0", udf_id:2, pkg_id:18446744073709551615, type_id:18446744073709551615, subprogram_path:[], is_deterministic:false, is_udt_udf:false, is_return_sys_cursor:false, loc:0, udf_schema_version:-1, pkg_schema_version:-1, is_pkg_body_udf:true, is_return_sys_cursor:false, is_aggregate_udf:false, is_parallel_enable:false, is_aggr_udf_distinct:false, loc:0, is_udt_cons:false, params_desc_v2:[], children:[]}, tenant_id=1004)
[2024-12-01 17:12:04.506286] WDIAG [SQL] print (ob_raw_expr_printer.cpp:179) [27336][T1004_L0_G0][T1004][xxxxx-xxxxx-xxxxx-xxxxx] [lt=13][errcode=-4016] fail to print expr(ret=-4016)
[2024-12-01 17:12:04.506289] WDIAG [SQL] do_print (ob_raw_expr_printer.cpp:83) [27336][T1004_L0_G0][T1004][xxxxx-xxxxx-xxxxx-xxxxx] [lt=13][errcode=-4016] fail to print expr(ret=-4016)
问题原因
问题确认为产品缺陷,package 私有 UDF,级联调用时未能找到,导致创建时报错 -4016。
问题的风险及影响
创建 PL 报错。
影响租户
影响 OceanBase 数据库中的 Oracle 租户,对于 SYS 租户和 MySQL 租户无影响。
适用版本
OceanBase 数据库 V4.2.1 BP10(oceanbase-4.2.1.10-110000072024111216)之前版本。
解决方法
升级至问题已修复版本。目前已修复的版本包括 OceanBase 数据库 V4.2.3(oceanbase-4.2.3.0-100000052024041220)及之后版本。
规避方式
定义中间变量,不级联调用或将 UDF 在 package header 中申明。
本例可改为如下写法绕过。
