MySql数据库等级考试学习分享3(Day8)

题目解析

题目:以下关于局部变量的叙述中,错误的是( )。
选项:

  • A、局部变量只能在 BEGIN...END 之间声明
  • B、使用 SET 语句能够为局部变量赋值
  • CDECLARE 能够在声明局部变量的同时指定默认值
  • D、使用 SELECT INTO 能够将数据表中一列的所有值赋值给局部变量

0基础知识点总结

1. 局部变量(Local Variables)的定义与特性
  • 定义:局部变量是在存储过程、函数或触发器的 BEGIN...END 代码块中定义的变量,仅在其所属代码块内有效。
  • 生命周期:从声明位置开始生效,到代码块结束时销毁。
  • 核心规则
    1. 必须用 DECLARE 声明:声明时需要指定数据类型(如 INTVARCHAR(20))。
    2. 可指定默认值:通过 DEFAULT 关键字初始化(如 DECLARE age INT DEFAULT 18;)。
    3. 赋值方式:通过 SET 或 SELECT INTO 赋值。
2. 选项分析
  • A. 正确
    • 局部变量必须在使用前通过 DECLARE 在 BEGIN...END 块内声明,否则会报错。
    • 示例

      CREATE PROCEDURE test() BEGIN DECLARE x INT; -- 正确声明位置 SET x = 10; END;

  • B. 正确
    • SET 是局部变量赋值的标准方式,语法为 SET 变量名 = 值;
    • 示例

      DECLARE total INT; SET total = 100;

  • C. 正确
    • DECLARE 支持通过 DEFAULT 设置默认值。
    • 示例

      DECLARE status VARCHAR(10) DEFAULT 'active';

  • D. 错误
    • 错误原因SELECT INTO 只能将单行查询结果的某列值赋给变量。若查询返回多行,会触发错误。
    • 正确用法

      SELECT salary INTO @salary FROM employees WHERE id = 1; -- 单行赋值

    • 错误示例

      SELECT salary INTO @salary FROM employees; -- 多行会报错

3. 扩展知识:局部变量与用户变量
  • 局部变量
    • 作用域限定在 BEGIN...END 块内。
    • 必须通过 DECLARE 声明。
  • 用户变量(@变量名)
    • 作用域为当前会话,跨代码块有效。
    • 无需声明,直接赋值即可使用(如 SET @total = 100;)。
4. 多行赋值的正确方法

若需将表中一列所有值存入变量,需通过游标(Cursor)临时表处理:

DECLARE done INT DEFAULT FALSE; DECLARE cur CURSOR FOR SELECT salary FROM employees; DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE; OPEN cur; read_loop: LOOP FETCH cur INTO @salary; IF done THEN LEAVE read_loop; -- 处理单个值(如累加) END LOOP; CLOSE cur;

关键结论

  • 局部变量核心规则:声明位置受限(BEGIN...END)、必须显式声明、支持默认值。
  • 常见误区:混淆 SELECT INTO 的单行赋值与多行操作。

学习建议:通过编写存储过程练习局部变量的声明、赋值及条件判断(如 IFLOOP),加深对作用域和生命周期的理解。


题目解析:

题目:设有如下存储过程:

DELIMITER SS CREATE PROCEDURE inout _param(INOUT p_inout INT) BEGIN SELECT p_inout; SET p_inout = p_inout + 1; SELECT p_inout; END $s DELIMITER ; SET @p_inout = 1; CALL inout_param(@p_inout); SELECT @p_inout;

关于上述代码,以下正确的描述是( )。
选项
A. 语法有错,不存在INOUT参数类型,IN和OUT参数的使用应该分开
B. 在执行CALL语句前后,@p_inout的值是不一样的
C. 语法有错,应该使用RETURN语句返回值,而不是通过过程的参数
D. 该存储过程的定义和调用过程中存在语法错误,无法正常执行

知识点总结(针对0基础):

1. 存储过程的基本语法
  • DELIMITER命令
    • 作用:修改SQL语句的结束符(默认为;),避免与存储过程中的分号冲突。
    • 正确用法:DELIMITER 新符号(如DELIMITER $$),存储过程结束后需恢复默认符号。
    • 题目错误
      • DELIMITER SS后,存储过程结束符应为SS,但代码中用了END $s$sSS不一致)。
      • 恢复默认符号时错误地写成DELIMITER ;(应为DELIMITER ;)。
  • 存储过程名称
    • 命名规则:不能包含空格,如inout _param中的空格是非法的,正确名称应为inout_param
  • 参数类型
    • INOUT是MySQL支持的参数类型,允许参数既作为输入又作为输出(选项A错误)。
2. 存储过程的执行流程
  • INOUT参数特性
    • 若存储过程语法正确,INOUT参数会在过程内部修改后传递回调用者(如选项B描述的情况)。
    • 示例
      DELIMITER $$ CREATE PROCEDURE demo(INOUT p INT) BEGIN SET p = p + 1; END $$ DELIMITER ; SET @p = 1; CALL demo(@p); -- 执行后@p变为2
  • 返回值机制
    • 存储过程通过OUTINOUT参数返回值,不支持RETURN语句(选项C错误)。
3. 题目代码的语法错误分析
  • 错误1DELIMITER SSEND $s不匹配
    • 定义存储过程时,结束符应为SS,但代码中使用了END $s,导致语法解析失败。
  • 错误2:存储过程名称包含空格
    • inout _param中的空格非法,MySQL会报错“You have an error in your SQL syntax”。
  • 错误3:恢复默认分隔符的语句错误
    • DELIMITER ;应直接写为DELIMITER ;,无需其他符号。
4. 修正后的代码示例
DELIMITER $$ CREATE PROCEDURE inout_param(INOUT p_inout INT) BEGIN SELECT p_inout; SET p_inout = p_inout + 1; SELECT p_inout; END $$ DELIMITER ; SET @p_inout = 1; CALL inout_param(@p_inout); -- 执行后@p_inout变为2 SELECT @p_inout;

关键区分点:

  • 语法错误 vs. 逻辑错误
    • 题目代码因语法错误无法执行,而非逻辑设计问题。
    • 若语法正确,INOUT参数会使@p_inout的值从1变为2(选项B的描述成立)。

你可能感兴趣的:(学习,数据库,mysql)