本文为 mariadb 官方手册: DECLARE Variable 的译文
我提交到 MariaDB 官方手册的译文: https://mariadb.com/kb/zh-cn/declare-variable/
语法:
DECLARE var_name [, var_name] ... type [DEFAULT value]
描述
该语句用在该语句用来在存储程序 stored programs 中声明本地变量可以用 DEFAULT 关键字为变量指定默认值变量的值允许是一个表达式(甚至子查询), 并不要求它一定是一个常量值如果不指定 这个默认值也不一定是常量如果不指定 DEFAULT 子句, 则变量的初始值为 NULL
本地变量和存储过程的参数类似, 会对关于数据类型和溢出做相关检查更多信息参考 CREATE PROCEDURE
局部变量必须声明在 CONDITION s, CURSOR s 和 HANDLER s 之前
局部变量名不区分大小写
局部变量的生效范围是在声明它的 BEGIN ... END 之内如果代码块中嵌套代码块, 那嵌套中的代码可以引用上一级的变量, 除非内层代码块定义的变量名和上层变量名相同
TYPE OF / ROW TYPE OF
存储过程中使用 TYPE OF 和 ROW TYPE OF 锚定数据类型的功能是从 MariaDB 10.3 引入的
锚定数据类型时允许基于另一个对象来定义数据类型(例如表中行), 而无需专门在声明语句中设置如果锚定对象的数据类型改变, 则自身也随之改变这使得存储过程更容易维护, 表中数据类型改变时, 存储过程中的变量类型也自动随之改变
使用 ROW TYPE OF 定义的变量隐含了 ROW 变量, 因此它们有相同的特性无法在 LIMIT 子句中使用 ROW TYPE OF
TYPE OF 和
ROW TYPE OF table_name
的实时数据类型在调用存储过程的开头就可以获取到存储过程中对锚定对象所在表执行 ALTER TABLE 或 DROP TABLE 语句不会影响已锚定的变量类型, 即使该变量是定义在 ALTER TABLE 或 DROP TABLE 语句之后的(译者注: 因为在存储过程中, 执行所有动作之前, 变量的类型就已经锚定结束)
ROW TYPE OF cursor_name
变量的实时数据类型是在执行变量声明语句时才获取到的数据类型仅只锚定一次, 之后不再改变如果游标中的 ROW TYPE OF 变量是定义在一个循环之中, 则数据类型在循环的开头就已经获取, 且之后的循环不再改变
在调用存储过程的开头, 会检查 TYPE OF 和 ROW TYPE OF 所锚定的表是否存在但在创建存储过程 CREATE PROCEDURE 或函数 CREATE FUNCTION 时, 不会检查变量所引用的表是否存在
示例
DECLARE tmp TYPE OF t1.a; -- 基于表 {{t1}} 中的 {{a}} 列获取数据类型
DECLARE rec1 ROW TYPE OF t1; -- 锚定表 {{t1}} 中行数据类型
DECLARE rec2 ROW TYPE OF cur1; -- 基于游标 {{cur1}} 获取行数据类型
- See Also
- User-Defined variables
回到 Linux 系列文章大纲: http://www.cnblogs.com/f-ck-need-u/p/7048359.html
回到网站架构系列文章大纲: http://www.cnblogs.com/f-ck-need-u/p/7576137.html
回到数据库系列文章大纲: http://www.cnblogs.com/f-ck-need-u/p/7586194.html
来源: http://www.bubuko.com/infodetail-2536887.html