Which two are true of Stored Routines?
A、Prepared statements must be declared before conditions
B、Variables must be declared before cursors.
C、Cursors must be opened before being accessed
D、Cursors are only for updating records, not retrieving records
E、Handlers must be declared before conditions
F、Handlers must be declared before cursors
正确答案:B 和 C
(变量在游标前声明,游标访问前须打开)
📌 核心考点
存储程序声明顺序(考试大纲 Section 10.1: Stored Routines)
(关联考点:执行流程控制、错误处理)
🔍 技术详解 & ⚠️ 易错点
✅ 正确选项解析

B. 变量在游标前声明 (√)
- 官方规则:MySQL 强制声明顺序:变量 → 条件 → 游标 → 处理程序
- ⚠️ 违反规则报错:
ER_DECLARE_ORDER(错误码 3500) - 示例错误:
CREATE PROCEDURE p()
BEGIN
DECLARE cur CURSOR FOR SELECT ...; -- 游标在前
DECLARE v INT; -- 报错:变量必须在游标前声明
END;
C. 游标访问前须打开 (√)
- 执行流程强制步骤:
DECLARE声明游标(仅定义)OPEN执行查询并创建结果集FETCH逐行读取数据CLOSE释放资源
- ⚠️ 跳过
OPEN直接FETCH报错:ER_SP_FETCH_NO_DATA(错误码 1339)
❌ 错误选项排除
A. 预处理语句在条件前声明 → 混淆概念
- 预处理语句 (
PREPARE/EXECUTE) 属于执行逻辑区(与声明顺序无关)
D. 游标仅用于更新 → 概念错误
- 游标默认为只读,需显式加
FOR UPDATE才能更新 - 核心用途:逐行处理查询结果(90% 场景是读取)
E. 处理程序在条件前声明 → 违反顺序
- 正确顺序:条件声明在处理程序之前
DECLARE condition_name CONDITION FOR ...; -- 先声明条件
DECLARE HANDLER FOR condition_name ...; -- 后声明处理程序
F. 处理程序在游标前声明 → 严重顺序错误
- 游标必须在处理程序前声明
- ⚠️ 否则报错:
ER_CURSOR_AFTER_HANDLER(错误码 1338)
🧠 记忆口诀
"变条游处" = 变量 → 条件 → 游标 → 处理程序
(中文谐音:便条邮储)

⚡ 实战验证代码
DELIMITER //
CREATE PROCEDURE valid_order()
BEGIN
-- 1. 变量声明(必须最先)
DECLARE done BOOL DEFAULT FALSE;
-- 2. 条件声明(在变量后,游标前)
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE; -- 实际是处理程序!
-- 修正:正确顺序
DECLARE cur CURSOR FOR SELECT id FROM t1; -- 游标声明
DECLARE CONTINUE HANDLER FOR NOT FOUND ...; -- 处理程序声明
OPEN cur; -- 必须先打开!
FETCH cur INTO ...;
END//
💡 考试技巧:
- 见
DECLARE顺序题 → 立即默念口诀 "便条邮储"- 游标操作题牢记三部曲:
DECLARE → OPEN → FETCH- 官方依据:MySQL 8.0 Manual §15.6.7.1 “DECLARE Order Enforcement”

最后修改时间:2025-06-26 11:37:26
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




