跳转到主要内容

42P11 — 无效游标定义

PostgreSQL SQLSTATE 42P11:来源与诊断参考。

42P11 — 无效游标定义

速览

42P11invalid_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 SCROLLASENSITIVE/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 源码,目录存在范围不等于每条消息或功能都从该版本开始。

来源

源码消息、行号和证据边界见 作者证据