# 42P11 — 无效游标定义

> PostgreSQL SQLSTATE 42P11：来源与诊断参考。
---

# 42P11 — 无效游标定义

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

`42P11`（**invalid_cursor_definition**）游标选项和游标计划在定义阶段有明确约束。

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

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

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

## 含义 {#meaning}

游标声明或 SPI 游标请求违反了定义阶段的规则。18.6 核心分别处理包含多个查询的 SPI 计划、互相冲突的 `SCROLL`/`NO SCROLL` 或 `ASENSITIVE`/`INSENSITIVE` 选项，以及 `INSENSITIVE` 游标与行锁子句同时出现的情况；后一种路径还会说明 INSENSITIVE 游标必须是 READ ONLY。

## 诊断 {#diagnosis}

保留错误中点名的选项。确认来源是 DECLARE 还是 SPI 调用者，SPI 计划是否含多个语句，以及冲突的是 `SCROLL`/`NO SCROLL` 还是 `ASENSITIVE`/`INSENSITIVE`。对于 INSENSITIVE，还要检查行锁子句和 READ ONLY 契约；不要把它误诊为游标不存在。

## 处理 {#response}

打开游标前拆分多查询 SPI 计划，只删除冲突选项；INSENSITIVE 需要只读时加上 READ ONLY 或移除行锁。若调用者使用 SPI，应修复计划构造，而不是改动游标提取逻辑。显式事务中的 ERROR 之后，下一条命令前要 `ROLLBACK` 或回滚到错误前的保存点；自动提交模式下连接可在返回空闲后重发修正请求。

## 消息 {#messages}

固定源码中的代表性消息包括：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`。占位符由实际对象、列或参数填充。

## 版本 {#versions}

锁定目录显示该条件最早见于 PostgreSQL 7.4；行为说明固定在 PostgreSQL 18.6 源码，目录存在范围不等于每条消息或功能都从该版本开始。

## 相关 {#related}

- [`42P18`](../42p18/)
- [`42P02`](../42p02/)

## 来源 {#sources}

源码消息、行号和证据边界见 [作者证据](../../data/evidence/42p11.json)。

- `src/backend/executor/spi.c:1600-1602` ([fixed source](https://github.com/postgres/postgres/blob/724edf9bde9d356724ad384a2e196edc3c9f80f7/src/backend/executor/spi.c#L1600-L1602))
- `src/backend/parser/analyze.c:3097-3104` ([fixed source](https://github.com/postgres/postgres/blob/724edf9bde9d356724ad384a2e196edc3c9f80f7/src/backend/parser/analyze.c#L3097-L3104))
- `src/backend/parser/analyze.c:3040-3044` ([fixed source](https://github.com/postgres/postgres/blob/724edf9bde9d356724ad384a2e196edc3c9f80f7/src/backend/parser/analyze.c#L3040-L3044))
- `src/backend/parser/analyze.c:3048-3052` ([fixed source](https://github.com/postgres/postgres/blob/724edf9bde9d356724ad384a2e196edc3c9f80f7/src/backend/parser/analyze.c#L3048-L3052))
