在 MySQL 存储过程中,DECLARE 语句用于声明一个局部变量。这些局部变量只在存储过程内部可见,并且在存储过程执行完成后会被销毁。
DECLARE 语句用于定义程序的各种局部变量:
(1)本地变量
(2)条件和处理程序
(3)游标
注意:
(1)DECLARE 语句只允许在 BEGIN ... END 复合语句中使用,而且必须在其开始部分,即其他语句之前。
(2)DECLARE 语句声明必须遵循一定的顺序,游标声明必须出现在处理程序声明之前,变量和条件声明必须先于游标或处理程序声明。
要声明局部变量,请使用 DECLARE 语句,语法:
DECLARE var_name [, var_name] ... type [DEFAULT value]
上述 DECLARE 语句用来在存储程序中声明局部变量,其中:
var_name 是局部变量名称
type 为局部变量的数据类型,如:varchar(10)、int 等。
DEFAULT 为局部变量提供默认值,DEFAULT 子句可以是一个表达式,也可以是一个常量。如果缺少 DEFAULT 子句,初始值就是 NULL。
例如:
CREATE PROCEDURE p_demo() BEGIN -- 未设置默认值,默认为 NULL DECLARE username VARCHAR(50); -- 设置默认值 DECLARE address VARCHAR(100) DEFAULT '成都市'; SELECT username,address; END
调用存储过程:
mysql> call p_demo(); +----------+---------+ | username | address | +----------+---------+ | NULL | 成都市 | +----------+---------+ 1 row in set Query OK, 0 rows affected
在数据类型和溢出检查方面,本地变量的处理方式与存储例程参数相同。
变量声明必须出现在游标或处理程序声明之前。例如:
BEGIN -- 下面语句非法的,错误如下: -- 1337 - Variable or condition declaration after cursor or handler declaration DECLARE CONTINUE HANDLER FOR SQLSTATE '23000' BEGIN /* 空代码块 */ END; -- 未设置默认值,默认为 NULL DECLARE username VARCHAR(50); -- 设置默认值 DECLARE address VARCHAR(100) DEFAULT '成都市'; -- 声明了一个处理器()合法的 --DECLARE CONTINUE HANDLER FOR SQLSTATE '23000' BEGIN /* 空代码块 */ END; -- 输出 username 和 address 变量的值 SELECT USERNAME,ADDRESS; END
局部变量名称不区分大小写。允许使用的字符和引号规则与其他标识符相同。例如:
BEGIN -- 未设置默认值,默认为 NULL DECLARE username VARCHAR(50); -- 设置默认值 DECLARE address VARCHAR(100) DEFAULT '成都市'; -- 输出 username 和 address 变量的值 SELECT USERNAME,ADDRESS; END
变量可以直接使用set语句进行赋值。语法:
SET variable = expr [, variable = expr] ... variable: { user_var_name | param_name | local_var_name | {GLOBAL | @@GLOBAL.} system_var_name | [SESSION | @@SESSION. | @@] system_var_name }
可以使用 SELECT ... INTO var_list 或打开游标并使用 FETCH ... INTO var_list 将查询结果检索到局部变量中。
不允许为存储过程或函数参数或存储程序局部变量赋值 DEFAULT(例如,使用 SET var_name = DEFAULT 语句),在 MySQL 5.7 中,这会导致语法错误。