0Z002 — stacked_diagnostics_accessed_without_active_handler
0Z002
速览
SQLSTATE 0Z002 在 PL/pgSQL 代码试图使用堆叠异常状态、但不存在拥有该状态的活动异常处理器时报告。PostgreSQL 18.6 已确认两条路径:GET STACKED DIAGNOSTICS cannot be used outside an exception handler 和 RAISE without parameters cannot be used outside an exception handler,两者均为 ERROR。
| 字段 | 值 |
|---|---|
| SQLSTATE | 0Z002 |
| 条件名 | stacked_diagnostics_accessed_without_active_handler |
| 状态 | 有效 |
| 已知存在于 | 9.2.0 |
| 锁定快照 | 9.2.24, 9.3.25, 9.4.26, 9.5.25, 9.6.24, 10.23, 11.22, 12.22, 13.23, 14.24, 15.19, 16.15, 17.11, 18.6, 19beta3 |
| 宏 | ERRCODE_STACKED_DIAGNOSTICS_ACCESSED_WITHOUT_ACTIVE_HANDLER |
| 别名 | — |
含义
第一条路径保护 GET STACKED DIAGNOSTICS;第二条路径保护本应重新抛出当前异常的无参数 RAISE。共同边界是 PL/pgSQL 的 EXCEPTION 处理器,而不是 SQL 的 BEGIN/COMMIT 事务块。该成员码比 0Z000 类别更具体。
消息
固定消息是 GET STACKED DIAGNOSTICS cannot be used outside an exception handler 和 RAISE without parameters cannot be used outside an exception handler。
诊断
定位失败的 PL/pgSQL 语句及最近的 EXCEPTION 块。GET STACKED DIAGNOSTICS 读取正在处理的异常,无参数 RAISE 重新抛出该异常;处理器外不存在可用的堆叠状态。保留准确消息和 routine context,因为事务状态错误或新的显式 RAISE 属于不同原因。
处理
把诊断读取或重新抛出移到活动异常处理器中;如果当前没有正在处理的异常,就使用带明确条件/消息的 RAISE。处理器应保持足够窄,并在离开前保留 RETURNED_SQLSTATE、消息、detail 和 hint。该路径支持的是代码修正,而不是事务重试。
版本
锁定目录将该条件的已知下界记为 PostgreSQL 9.2.0。事实块列出已发布快照;源码路径状态仅限于下方固定的 PostgreSQL 18.6 资料。
相关
来源
固定的 PL/pgSQL 执行器源码报告 GET STACKED DIAGNOSTICS 变体,RAISE 路径报告无参数变体。PL/pgSQL 诊断文档说明堆叠字段。 详见结构化证据记录,其中记录固定源码路径、扫描范围和未解决的运行边界。