---
title: PL 执行报错 -5542-OceanBase数据库使用指南
description: 了解OceanBase数据库在实际应用中关于PL 执行报错 -5542相关的常见问题和使用技巧，帮助您快速解决PL 执行报错 -5542的难题。
---
切换语言

- 中文站 - 简体中文
- International - English
- 日本站 - 日本語

划线反馈

# PL 执行报错 -5542

更新时间：2026-05-29 08:46

适用版本： V3.2.x 内容类型：Troubleshoot  

## 问题描述

OceanBase 数据库中 PL 执行报错 -5542。

示例如下。

1. 创建表。

   ```shell
   obclient [SYS]> create table t1(a int, b int);
   Query OK, 0 rows affected (0.029 sec)

   ```
 2. 插入数据。

   ```shell
   obclient [SYS]> insert into t1 values (1, 2);
   Query OK, 1 row affected (0.004 sec)

   ```
 3. 创建包头 pkg1 声明。

   ```shell
   obclient [SYS]> create or replace package pkg1 as
       function f1(param1 t1%rowtype) return number;
       end;
       /
   Query OK, 0 rows affected (0.024 sec)

   ```
 4. 创建包体 pkg1 实现包头所有声明。

   ```shell
   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)

   ```
 5. 在包 pkg2 中声明存储过程 p1。

   ```shell
   obclient [SYS]> create or replace package pkg2 as
        procedure p1;
        end;
        /
   Query OK, 0 rows affected (0.011 sec)

   ```
 6. 在包体 pkg2 中实现存储过程 p1。

   ```shell
   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)

   ```
 7. 调用包体 pkg2 中实现存储过程 p1。

   ```shell
   obclient [SYS]> call pkg2.p1();
   Query OK, 0 rows affected (0.072 sec)

   ```

   日志信息。

   ```shell
   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 可绕过。

上一篇

[Oracle 存储过程迁移到 OceanBase 数据库后执行报语法报错](https://www.oceanbase.com/knowledge-base/oceanbase-database-1000000000501938)

下一篇

[Oracle 模式下普通用户无法通过 dbms_metadata.get_ddl() 获取对象的 DDL，错误代码 ORA-00942](https://www.oceanbase.com/knowledge-base/oceanbase-database-20000000169) ![有帮助](https://gw.alipayobjects.com/mdn/ob_asset/afts/img/A*y6ocSqN8cqsAAAAAAAAAAAAAARQnAQ)![无帮助](https://gw.alipayobjects.com/mdn/ob_asset/afts/img/A*BG9IQJyLHF8AAAAAAAAAAAAAARQnAQ)![反馈](https://gw.alipayobjects.com/mdn/ob_asset/afts/img/A*eTWdQKCRKHwAAAAAAAAAAAAAARQnAQ)[AI](https://www.oceanbase.com/obi) 咨询热线
