跳转到主要内容

P0002 — no_data_found

PostgreSQL SQLSTATE P0002 的源码与诊断参考。

P0002

速览

P0002 是 PL/pgSQL 专用的 no_data_found。固定源码确认它既有 PL/pgSQL 查询契约中的 ERROR,也有核心 tablespace 路径中的 NOTICE;不能把它等同于所有返回零行的 SELECT。

字段
SQLSTATE P0002
条件名 no_data_found
状态 有效
已知存在于 8.2.0
锁定快照 9.0.23, 9.1.24, 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_NO_DATA_FOUND
别名

含义

在 PL/pgSQL 固定路径中,受检查的查询没有返回行时会报告 query returned no rows,若启用 strict 参数打印还会附带 parameters: %s detail。另一个固定路径在 tablespace 没有匹配 relation 时以 NOTICE 使用同一 SQLSTATE。

诊断

先确认完整 message 和 severity,再定位操作。PL/pgSQL 路径要检查目标赋值、严格单行契约和 print_strict_params;tablespace NOTICE 则检查目标 tablespace 与匹配 relation。普通查询返回零行本身不会自动等于 P0002。

处置

对 PL/pgSQL 严格查询,修正查询预期、目标赋值或显式处理无行分支;也可以在明确业务允许时改用不要求单行的逻辑。对 tablespace NOTICE,先核对没有匹配 relation 是否符合预期;如果这是正常结果,无需修复,否则再修正目标后继续。不要仅因零行就自动重试。

版本

锁定目录从 8.2.0 记录该条件,并在列出的正式快照及 19beta3 中出现;固定源码还显示它可以是 ERROR 或 NOTICE。

P0003, P0004, 02000

来源

可直接阅读固定的 pl_exec.ctablecmds.c 路径;完整范围见结构化证据记录