文档 / SQL 状态码 / Class 20 未找到 Case
20000 case_not_found
ERROR 源码确认 参考 未实测
- 条件名
case_not_found- 宏名称
ERRCODE_CASE_NOT_FOUND- 启用版本
- 8.4
- 状态
- 活跃
版本覆盖
速览
SQLSTATE 20000 在 PL/pgSQL 的 CASE 语句没有匹配任何 WHEN 且没有 ELSE 时报告。PostgreSQL 18.6 的消息是 case not found,hint 为 CASE statement is missing ELSE part.。该条件属于过程式 CASE 语句路径,不是普通查询返回零行的结果。
含义
执行器路径位于 src/pl/plpgsql/src/pl_exec.c 的 exec_stmt_case。它执行搜索式或简单过程式 CASE 语句,在到达缺失 ELSE 的分支时报告 20000。SQL CASE 表达式语义不同,因此应先确认语句形式和例程源码,再修改查询。
消息
固定消息是 case not found;hint 为 CASE statement is missing ELSE part.。
报文模板
源码里的格式串,不是某一次运行的输出。%s 之类是占位符,实际报文会填入对象名与取值。适用范围一栏是核验时留下的原始英文记录,未经翻译。
case not found
CASE statement is missing ELSE part.
诊断
找到 routine context 指出的 PL/pgSQL 例程和 CASE 语句。列出选择值或谓词的可能结果,确认每个预期路径都有 WHEN,再检查是否遗漏 ELSE。不要用行数检查或 SELECT INTO STRICT 的诊断替代这个条件。
处理
增加实现预期回退行为的 ELSE 分支,或使 WHEN 谓词覆盖所有可能值,并用代表性选择值验证例程。如果缺失分支代表无效业务输入,应由该分支有意报告应用条件。修改例程后,只有确认周围事务的副作用已回滚或业务操作具备幂等性时,才重新执行事务。
版本
锁定目录将该条件的已知下界记为 PostgreSQL 8.4.0。事实块列出已发布快照;源码路径状态仅限于下方固定的 PostgreSQL 18.6 资料。
来源
- 上游源码 src/backend/utils/errcodes.txt 第 152 行
- 上游源码 src/pl/plpgsql/src/pl_exec.c
- 核验材料 raw/calls/REL_18_6.jsonl
证据
断言
每条断言都写明了是怎么核实的,以及它不覆盖什么。这一层是核验时留下的原始英文记录,照原样呈现,未经翻译。
-
20000 is case_not_found in SQLSTATE Class 20.
-
The fixed PostgreSQL 18.6 source contains the report path and message context described on the page.
-
The locked release definitions establish catalogue presence from the known 8.4.0 boundary; they do not establish a precise introducing release or runtime use.
同类 SQL 状态码
| 状态码 | 条件名 | 宏名称 | 严重等级 | 版本 |
|---|---|---|---|---|
| 20000 | case_not_found | ERRCODE_CASE_NOT_FOUND |
ERROR | 8.4 |
| PL/pgSQL 的 CASE 无匹配分支且缺少 ELSE。 | 活跃 | |||