# PL/SQL 调试

> 在 Oracle 和 OceanBase Oracle 模式中启动调试、检查停点和结果，并恢复原会话。

Source: https://dbxio.com/cn/docs/plsql-debug

Language: zh-CN

Relative links resolve against https://dbxio.com/cn/docs/plsql-debug.



在对象树中选择过程、函数或包成员，打开**调试 PL/SQL**。也可以在查询编辑器中选择一个匿名 PL/SQL 块，从右键菜单的**执行与结果**打开调试。桌面版和 Web 使用同一套调试工作区。

调试会实际执行程序。参数默认值、包初始化、构造器及目标程序可能写入数据、提交事务或执行 DDL。关闭调试器只能回滚仍可控制的未提交工作，不能撤销程序自行提交、DDL 或自治事务的结果；控制连接丢失后，程序也可能继续执行。

## 启动前确认目标和参数

连接需要能访问系统 `DBMS_DEBUG` 接口、目标程序及必要的元数据。权限不足时按具体错误处理；DBX 不会自动授权、修改网络配置或安装调试辅助包、表、类型及存储过程。使用与当前 DBX 匹配的 Oracle 或 OceanBase Oracle Agent；旧的 helper 调试协议不能代替原生调试接口。

1. 核对连接、Schema、对象及例程签名。有重载时，选择需要执行的签名。
2. 填写 `IN` 和 `IN OUT` 参数。明确区分输入值、`NULL` 和使用数据库默认值；`OUT` 参数在执行后读取。复杂参数按类型编辑器提供的结构输入，不能用任意 SQL 表达式代替数据值。
3. 需要复杂参数元数据时，选择**读取参数类型**。对象或源码变化后，先**刷新预览**，再核对参数。
4. 阅读执行风险并确认，选择**开始调试**。

签名过期、对象不明确、参数不完整或写保护未解除时，先处理错误，再重新预览。调试操作沿用连接的只读及[生产环境保护](/cn/docs/production-safety)。

## 需要时显式编译调试信息

DBX 不会在连接、预检或启动时静默重编译对象。命名程序需要补充调试信息时，在原启动对话框中操作；匿名块没有对象编译步骤。

`COMPILE DEBUG`

 是 DDL，可能隐式提交、使依赖对象失效并影响其他调用者。调试包成员时，编译范围是整个包体，包括其他成员和初始化代码，不是单个成员。

1. 选择**预览调试编译**。
2. 核对精确对象、生成的 SQL 和编译影响。
3. 勾选编译确认，再选择**编译调试信息**。
4. 查看原编译结果及当前字典读回。编译成功后，重新核对参数，单独确认并启动调试；编译不会自动启动程序。

DDL 已执行不代表对象已有效。对象仍为 `INVALID` 时，查看诊断并选择**编辑源码**；包成员会打开包体。修正后，在原查询编辑器中执行对应的 `CREATE OR REPLACE` 语句。确认执行成功，再返回启动对话框重新读取和确认。只保存 SQL 草稿不会修改数据库对象。诊断读取失败只表示验证未完成，不能据此重复执行 DDL。

当前字典状态与原编译回执分开显示。新读取的 `VALID` 不能证明某次响应丢失的编译已经成功；设置无法读取时显示待确认，也不会强制编译。数据库版本的语法差异由对应 Agent 处理，编译失败不会自动换一条 SQL 重试。

## 在停点检查和控制程序

工作区上方显示源码，下方显示变量、调用堆栈、断点、调试会话 SQL、逐行跟踪、日志、DBMS 输出及 OUT 参数／返回值。拖动中间分隔条调整空间。

* **继续执行**：运行到下一个适用停点。
* **单步进入／单步跳过／单步跳出**：按当前栈层和数据库原生事件推进。
* **忽略断点运行到结束**：继续目标程序，不在普通断点停下。
* **终止执行**：请求中止；以返回的执行结果为准。
* **关闭调试会话**：结束调试并收尾资源；释放确认后才可重新调试。

在源码行旁管理断点，在**断点**页编辑条件、忽略次数和消息。条件使用调试器支持的有限表达式，不是任意 SQL；条件读取或求值失败会保留错误，不会假装条件为假后继续。异常停点取决于引擎及版本，工作区会显示实际能力或限制。

在**调用堆栈**中选择帧后，变量和监视读取对应的原生上下文。源码、身份或帧映射无法核实时，保留未确认状态，不把文本名称当成已验证对象。数据库可能报告进入、返回或重复行事件，单步行号不保证单调增加。

修改变量或执行**调试会话 SQL**前，核对当前停点和引擎给出的上下文。能执行的操作使用原被调试会话，不借普通查询连接冒充；引擎无法提供的帧或会话操作会明确报错。继续、单步、赋值、SQL 和重新调试都可能产生写入，仍受写保护约束。

## 区分结果、完整性和资源释放

**DBMS 输出**与**OUT 参数／返回值**分别显示。正常结束、异常和中止可能得到不同的部分结果；读取错误、截断或超出预算时，按界面的完整性状态判断，不把已显示的前缀当成全部数据。

`NULL`、空字符串、读取失败、超出作用域和历史值有不同状态。单步、切帧或重新调试后，不再把上一停点的数据显示为当前值；结束后可保留已取得结果供检查。

## 断线后先恢复原会话

Web 短暂断线或刷新后，使用原用户和原客户端恢复原会话。若启动、写操作或关闭的回复未确认，先查询原操作状态，不重复点击来重新执行程序。

执行结束、事务结果和资源释放是不同事实。关闭失败或释放未知时，DBX 保留会话身份及恢复入口，不会只清空界面就宣称结束，也不会允许新操作绕过未知执行。客户端失联后服务端会按租约尝试有界清理；失联本身不证明程序已经停止或事务已经回滚。

服务进程重启后，新的服务实例可能无法核实旧会话的最新状态。此时保留原恢复标识，先核对原数据库执行结果，不把未知结果当成可以重新启动的许可。

