DBX

PL/SQL 调试

在对象树中选择过程、函数或包成员,打开调试 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. 阅读执行风险并确认,选择开始调试。

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

需要时显式编译调试信息

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 保留会话身份及恢复入口,不会只清空界面就宣称结束,也不会允许新操作绕过未知执行。客户端失联后服务端会按租约尝试有界清理;失联本身不证明程序已经停止或事务已经回滚。

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