↑↓ 选择 ↵ 打开 ⌫ 改范围 完整检索页

pgsql.cc 提供对 postgresql.org 官网内容的中文翻译,由 Pigsty 团队维护。

百科 / SQL 状态码 / Class 24 无效的游标状态

24000 invalid_cursor_state

游标状态无效

ERROR 已实测 参考 实测通过

类别
Class 24 无效的游标状态
严重等级
ERROR
条件名
invalid_cursor_state
宏名称
ERRCODE_INVALID_CURSOR_STATE
最早已知存在
7.4
状态
有效

手册收录:8.1、8.2、8.3、8.4、9.0、9.1、9.2、9.3、9.4、9.5、9.6、10、11、12、13、14、15、16、17、18、19、20。此处仅表示同版本手册收录,运行证据仍以原核验构建为准。

版本覆盖

版本条依据已采样构建显示;灰色版本可能尚未采样,悬停可查看。手册链接随版本选择,源码和运行证据保持原核验构建。

24000 — 游标状态无效

速览 {#at-a-glance}

24000 表示游标或 portal 状态不满足当前操作。本案例声明了有效游标,却在 FETCH 定位前执行 WHERE CURRENT OF,因而报“游标未定位到行”。

含义 {#meaning}

WHERE CURRENT OF 要求游标来自可更新查询,并已通过 FETCH 选中当前行;声明本身不会定位。其他非 SELECT、已保持、不可更新或缺少 FOR UPDATE/SHARE 引用的游标也有不同 24000 模板。

诊断 {#diagnosis}

记录游标名和操作,检查声明、事务生命周期、FETCH 方向及可更新性。显式事务错误后本案例为 INERROR,回滚后回到 IDLE;本案例用主键直接更新修复,未测试重新 DECLARE/FETCH。

处理 {#response}

先 FETCH 定位再使用 CURRENT OF,或者使用确定性的键更新。保持游标和事务生命周期显式,失败事务先回滚。

实测诊断 {#messages}

18.6 (Homebrew) / latest:SQLSTATE 24000;primary cursor "item_cursor" is not positioned on a row;after_error INERROR;after_rollback IDLE。 10.21 (Debian 10.21-1.pgdg90+1) / pg10:SQLSTATE 24000;primary cursor "item_cursor" is not positioned on a row;after_error INERROR;after_rollback IDLE。

代表案例 {#case}

运行器从 verify/cases/24000/snippets.json(SHA-256 cafca57825378362df0527384614bf658bf86cd3101e1eb520ea0641819f2789)读取下列片段,并为临时 schema 替换表名;完整 setup、断言与清理见 案例导出。

-- create
CREATE TABLE items(id integer PRIMARY KEY, note text NOT NULL);
-- seed
INSERT INTO items VALUES (1, 'seed');
-- begin
BEGIN;
-- declare
DECLARE item_cursor CURSOR FOR SELECT id FROM items FOR UPDATE;
-- trigger
UPDATE items SET note = 'bad' WHERE CURRENT OF item_cursor;
-- rollback
ROLLBACK;
-- repair
UPDATE items SET note = 'repaired' WHERE id = 1;
-- verify
SELECT id, note FROM items;

本案例对应的 SQLSTATE、诊断、事务状态和修复断言均来自上述共享 registry;结构化证据 · 案例导出。

作者证据 ID:identity, current-of, runtime。选定运行记录:runtime.24000-batch1-latest2-20260909.latest, runtime.24000-batch1-pg10-20260909.pg10。

版本与边界 {#versions}

锁定目录在 7.4 已观察到该条件,并在列出的正式快照中均存在。选定运行覆盖 18.6 与 10.21 的 FETCH 前 CURRENT OF 路径;其他游标状态需要独立案例。

相关 {#related}

对比 25001 活动 SQL 事务、25P02 失败 SQL 事务 和 34000 无效游标名称。

来源 {#sources}

  • src.errcodes.18.6 (SHA-256 6e8de346643ba84aa3c9c6a73360acfc7b2dfb89162c06c08ce9bf5bcd5bbcba)
  • src.calls.REL_18_6 (SHA-256 9ee8a0e81d8f0825c5c1ae45583439859a26e602bdd4ce2f2a62aa278867ccbf)
  • src.execCurrent.18.6 (SHA-256 45c8e48b3a5dc46f1014482dc88e0a26c25c3a4c403372112474d9171253d8a9)
  • doc.declare.18.6 (SHA-256 f1d72befb9a989aa32123560aea784a8bccfcb3d3930804a101d8245e5a3cc95) · 官方文档
  • doc.update.18.6 (SHA-256 47dd724cd724bd77478215a4853aa1f985996a0e5bba9b2451a1ad1ebb6e51fc) · 官方文档

来源

证据

断言

每条断言都写明了是怎么核实的,以及它不覆盖什么。这一层是核验时留下的原始英文记录,照原样呈现,未经翻译。

运行记录

目标服务器版本结果覆盖案例
latest 18.6 (Homebrew) passed 案例:current_of_before_fetch
pg10 10.21 (Debian 10.21-1.pgdg90+1) passed 案例:current_of_before_fetch

报文模板

源码里的格式串,不是某一次运行的输出。%s 之类是占位符,实际报文会填入对象名与取值。适用范围一栏是核验时留下的原始英文记录,未经翻译。

主消息 cursor "%s" is not positioned on a row

来源: 来源:src/backend/executor/execCurrent.c @ REL_18_6

适用范围:The same template is also used by another CURRENT OF path; the cursor name is substituted at runtime.

可复现案例

在一次性实例上执行过的场景。其中 1 个附有可执行 SQL,正文相应小节里给出。

current_of_before_fetch PG 10 / 18 有 SQL

前置条件

  • A cursor is declared for a SELECT ... FOR UPDATE
  • The cursor has not fetched a row

触发

Use WHERE CURRENT OF before the cursor is positioned on a row.

断言

  • SQLSTATE is 24000
  • The connection recovers after rollback
  • A direct update succeeds afterward

处置

Fetch or otherwise position the cursor before CURRENT OF, or use a key-based update whose concurrency semantics are explicit.

清理

Drop the case schema with an owner connection.

同类 SQL 状态码

状态码 条件名 宏名称 严重等级 版本
Class 24 无效的游标状态 Invalid Cursor State 1 个 ↗
24000 invalid_cursor_state ERRCODE_INVALID_CURSOR_STATE ERROR 7.4 起已知
游标或 portal 状态不满足当前操作要求。 有效