42P11 — 无效游标定义
42P11 — 无效游标定义
速览
42P11(invalid_cursor_definition)游标选项和游标计划在定义阶段有明确约束。
| 字段 | 值 |
|---|---|
| SQLSTATE | 42P11 |
| 条件名 | invalid_cursor_definition |
| 状态 | 有效 |
| 已知存在于 | 7.4 |
| 锁定快照 | 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_INVALID_CURSOR_DEFINITION |
| 别名 | — |
含义
游标声明或 SPI 游标请求违反了定义阶段的规则。18.6 核心分别处理包含多个查询的 SPI 计划、互相冲突的 SCROLL/NO SCROLL 或 ASENSITIVE/INSENSITIVE 选项,以及 INSENSITIVE 游标与行锁子句同时出现的情况;后一种路径还会说明 INSENSITIVE 游标必须是 READ ONLY。
诊断
保留错误中点名的选项。确认来源是 DECLARE 还是 SPI 调用者,SPI 计划是否含多个语句,以及冲突的是 SCROLL/NO SCROLL 还是 ASENSITIVE/INSENSITIVE。对于 INSENSITIVE,还要检查行锁子句和 READ ONLY 契约;不要把它误诊为游标不存在。
处理
打开游标前拆分多查询 SPI 计划,只删除冲突选项;INSENSITIVE 需要只读时加上 READ ONLY 或移除行锁。若调用者使用 SPI,应修复计划构造,而不是改动游标提取逻辑。显式事务中的 ERROR 之后,下一条命令前要 ROLLBACK 或回滚到错误前的保存点;自动提交模式下连接可在返回空闲后重发修正请求。
消息
固定源码中的代表性消息包括:message: cannot open multi-query plan as cursor;message: DECLARE INSENSITIVE CURSOR ... %s is not valid; DETAIL: Insensitive cursors must be READ ONLY.;message: cannot specify both %s and %s。占位符由实际对象、列或参数填充。
版本
锁定目录显示该条件最早见于 PostgreSQL 7.4;行为说明固定在 PostgreSQL 18.6 源码,目录存在范围不等于每条消息或功能都从该版本开始。
相关
来源
源码消息、行号和证据边界见 作者证据。
src/backend/executor/spi.c:1600-1602(fixed source)src/backend/parser/analyze.c:3097-3104(fixed source)src/backend/parser/analyze.c:3040-3044(fixed source)src/backend/parser/analyze.c:3048-3052(fixed source)