# P0002 — no_data_found

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

# P0002

## 速览 {#at-a-glance}

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

<!-- BEGIN SQLSTATE FACTS: generated by scripts/generate.py; do not edit -->

| 字段 | 值 |
| --- | --- |
| 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` |
| 别名 | `—` |

<!-- source facts: data/errcodes/P0002.json -->
<!-- END SQLSTATE FACTS -->

## 含义 {#meaning}

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

## 诊断 {#diagnosis}

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

## 处置 {#response}

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

## 版本 {#versions}

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

## 相关条件 {#related}

[`P0003`](../p0003/), [`P0004`](../p0004/), [`02000`](../02000/)

## 来源 {#sources}

可直接阅读固定的 [pl_exec.c](https://github.com/postgres/postgres/blob/724edf9bde9d356724ad384a2e196edc3c9f80f7/src/pl/plpgsql/src/pl_exec.c#L4384-L4387) 与 [tablecmds.c](https://github.com/postgres/postgres/blob/724edf9bde9d356724ad384a2e196edc3c9f80f7/src/backend/commands/tablecmds.c#L17162-L17166) 路径；完整范围见结构化[证据记录](../../data/evidence/p0002.json)。
