如何在MySQL 8.0存储过程中使用DECLARE和DEFAULT定义局部变量?
- 内容介绍
- 文章标签
- 相关推荐
本文共计959个文字,预计阅读时间需要4分钟。
局部变量只在其声明所在的存储过程或函数块内有效,并且必须在使用前声明。如果在《BEGIN...END》块内声明变量而未在《DECLARE》语句之前,任何其他语句(包括注释和空行)如果提前出现,都会导致错误《ERROR 1064 (42000)》。
常见错误现象:把SET、SELECT或IF写在DECLARE前面,MySQL直接拒绝解析整个过程体。
-
DECLARE不能出现在嵌套块外层未声明同名变量的情况下;嵌套块中重名会遮蔽外层变量,但不会报错 - 多个变量可合并声明:
DECLARE a INT DEFAULT 0, b VARCHAR(20) DEFAULT 'unknown'; - 类型必须是MySQL原生类型,如
INT、DECIMAL(10,2)、VARCHAR(64)、DATETIME,不支持自定义类型或别名
DEFAULT值可以是表达式,但不能含子查询以外的复杂逻辑
DEFAULT子句允许使用常量、函数调用(如NOW()、UUID())甚至标量子查询,但注意:标量子查询在DECLARE时**不会执行**——它只在后续SET或SELECT ... INTO中才求值。
本文共计959个文字,预计阅读时间需要4分钟。
局部变量只在其声明所在的存储过程或函数块内有效,并且必须在使用前声明。如果在《BEGIN...END》块内声明变量而未在《DECLARE》语句之前,任何其他语句(包括注释和空行)如果提前出现,都会导致错误《ERROR 1064 (42000)》。
常见错误现象:把SET、SELECT或IF写在DECLARE前面,MySQL直接拒绝解析整个过程体。
-
DECLARE不能出现在嵌套块外层未声明同名变量的情况下;嵌套块中重名会遮蔽外层变量,但不会报错 - 多个变量可合并声明:
DECLARE a INT DEFAULT 0, b VARCHAR(20) DEFAULT 'unknown'; - 类型必须是MySQL原生类型,如
INT、DECIMAL(10,2)、VARCHAR(64)、DATETIME,不支持自定义类型或别名
DEFAULT值可以是表达式,但不能含子查询以外的复杂逻辑
DEFAULT子句允许使用常量、函数调用(如NOW()、UUID())甚至标量子查询,但注意:标量子查询在DECLARE时**不会执行**——它只在后续SET或SELECT ... INTO中才求值。

