首批通过分布式安全可靠测评,为关键业务系统打造
Oracle 租户创建 PACKAGE BODY 报错 4016 的原因及解决方法
更新时间:2026-05-29 08:46
问题现象
Oracle 租户创建包体失败,报错 4016。
create or replace package body pkg_2024112700105312380 as
function BITOR(c1 varchar2) return varchar2 as
begin
return c1;
end;
procedure p1 as
v varchar2(100);
v_map match_identifymap_type;
begin
v_map(BITOR('a')) := 'aaa';
end;
end;
/
ORA-600:internal error code,arguments:-4016,Internal error
关键日志信息。
-- 日志打印 BITOR 函数无效
[2024-12-09 11:15:51.716886] WDIAG [SQL] print (ob_raw_expr_printer.cpp:3361) [295946][T1002_L0_G0][T1002][xxxxx-xxxxx-xxxxx-xxxxx] [lt=7][errcode=-4016] object info is null(ret=-4016, expr={item_type:"T_FUN_UDF", result_type:{meta:{type:"NUMBER", collation:"binary", coercibility:"NUMERIC"}, accuracy:{length:32767, precision:-1, scale:-85}, flag:0, calc_type:{type:"NULL", collation:"invalid_type", coercibility:"INVALID"}}, expr_info:["IS_FUNC", "IS_STATE_FUNC", "IS_PL_UDF", "CNT_CONST_EXPR", "CNT_CONST", "CNT_FUNC", "CNT_STATE_FUNC", "CNT_PL_UDF", "UNKNOWN"], rel_id:[], database:"", package_name:"pkg_2024112700105312380", func:"BITOR", 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:[{type:0, id1:-1, id2:-1, id3:-1}, {type:0, id1:-1, id2:-1, id3:-1}], children:[{item_type:"T_OP_MUL", result_type:{meta:{type:"NUMBER", collation:"binary", coercibility:"NUMERIC"}, accuracy:{length:-1, precision:-1, scale:-85}, flag:0, calc_type:{type:"NUMBER", collation:"binary", coercibility:"NUMERIC"}}, expr_info:["IS_CONST_EXPR", "CNT_CONST", "UNKNOWN"], rel_id:[], children:[{item_type:"T_OBJ_ACCESS_REF", result_type:{meta:{type:"NUMBER", collation:"binary", coercibility:"NUMERIC"}, accuracy:{length:-1, precision:38, scale:0}, flag:0, calc_type:{type:"NULL", collation:"invalid_type", coercibility:"INVALID"}}, expr_info:["IS_CONST_EXPR", "UNKNOWN"], rel_id:[], children:[]}, {item_type:"T_INT", result_type:{meta:{type:"NUMBER", collation:"binary", coercibility:"NUMERIC"}, accuracy:{length:1, precision:-1, scale:-85}, flag:1, calc_type:{type:"NULL", collation:"invalid_type", coercibility:"INVALID"}}, expr_info:["IS_CONST", "CNT_CONST"], rel_id:[], value:{"NUMBER":"4"}}]}, {item_type:"T_FUN_SYS_ORA_TRUNC", result_type:{meta:{type:"NUMBER", collation:"binary", coercibility:"NUMERIC"}, accuracy:{length:-1, precision:-1, scale:-85}, flag:0, calc_type:{type:"NULL", collation:"invalid_type", coercibility:"INVALID"}}, expr_info:["IS_FUNC", "IS_CONST_EXPR", "CNT_CONST", "CNT_FUNC", "UNKNOWN"], rel_id:[], expr_info:["IS_CONST_EXPR", "UNKNOWN"], rel_id:[], children:[]}, {item_type:"T_INT", result_type:{meta:{type:"NUMBER", collation:"binary", coercibility:"NUMERIC"}, accuracy:{length:2, precision:-1, scale:-85}, flag:1, calc_type:{type:"NULL", collation:"invalid_type", coercibility:"INVALID"}}, expr_info:["IS_CONST", "CNT_CONST"], rel_id:[], value:{"NUMBER":"64"}}]}], enum_set_values:[], dblink_name:"", dblink_id:18446744073709551615}]}, tenant_id=1002)
[2024-12-09 11:15:51.716963] WDIAG [SQL] print (ob_raw_expr_printer.cpp:179) [295946][T1002_L0_G0][T1002][xxxxx-xxxxx-xxxxx-xxxxx] [lt=7][errcode=-4016] fail to print expr(ret=-4016)
触发条件
PACKAGE BODY 中 FUNCTION 如果没有在 HEADER 中申明,且在 BODY 中级联调用时会报 -4016。
问题原因
PACKAGE BODY 中定义了 BITOR 函数,并且在 BODY 中又调用了这个 BITOR 函数,在这种级联调用的情况下就会出现这个报错。
原生 Oracle 没有问题,在 V4.2.1 BP10 Hotfix2(oceanbase-4.2.1.10-110020012024120420)之前版本,存在 Oracle PL 兼容性问题
问题的风险及影响
创建 PACKAGE 报错 -4016。
影响租户
影响 OceanBase 数据库中的 Oracle 租户,对于 SYS 租户和 MySQL 租户无影响。
适用版本
OceanBase 数据库 V4.2.1 BP10 Hotfix2(oceanbase-4.2.1.10-110020012024120420)之前版本。
解决方法及规避方式
在包头中提前声明 BITOR 函数(将 FUNCTION 在 HEADER 中申明一下)。