语法:
DECLARE var_name [, var_name] ... type [DEFAULT value]
描述
该语句用于该语句用于在存储过程中声明局部变量。 您可以使用关键字来指定变量的默认值。 变量的值允许是表达式(甚至是子查询),并且不要求是常量值。 如果未指定此默认值,则它不一定是常量。 如果未指定子句,则变量的初始值为 NULL。
局部变量与存储过程的参数类似,都会进行数据类型和溢出的相关检查。 请参阅 获取更多信息。
局部变量必须在 s、s 和 s 之前声明。
局部变量名不区分大小写。
局部变量的有效范围是在声明它的 BEGIN ... END 内。 如果代码块嵌套在代码块中,则嵌套代码可以引用上层变量,除非内部代码块定义的变量名与上层变量名相同。
类型/行类型
与 10.3
10.3 中引入了使用 TYPE OF 和 ROW TYPE OF 来锚定存储过程中的数据类型的功能。
锚定数据类型允许基于另一个对象(例如表中的行)定义数据类型,而无需在声明语句中专门设置它。 如果锚定对象的数据类型发生变化,则锚定对象本身也会发生变化。 这使得存储过程更易于维护。 当表中的数据类型改变时,存储过程中的变量类型也会自动改变。
使用 ROW TYPE OF 定义的变量隐含 ROW 变量,因此它们具有相同的特征。 ROW TYPE OF 不能在 LIMIT 子句中使用。
实时数据类型TYPE OF和ROW TYPE OF可以在调用存储过程开始时获取。 在存储过程中对锚定对象所在的表执行 ALTER TABLE 或 DROP TABLE 语句不会影响锚定变量的类型,即使该变量是在 ALTER TABLE 或 DROP TABLE 语句之后定义的(译者注:因为在存储过程,变量的类型在执行所有操作之前被锚定)。
ROW TYPE OF 变量的实时数据类型是在执行变量声明语句时获得的。 数据类型仅锚定一次,此后不会更改。 如果在循环中定义游标中的ROW TYPE OF变量,则在循环开始时获取数据类型,并且在后续循环中不会改变。
在调用存储过程的开始,检查由 TYPE OF 和 ROW TYPE OF 锚定的表是否存在。 但是,当您创建存储过程或函数时,不会检查变量引用的表是否存在。
例子
10.x 中的 TYPE OF 和 ROW TYPE OF:
DECLARE tmp TYPE OF t1.a; -- 基于表{{t1}}中的{{a}}列获取数据类型 DECLARE rec1 ROW TYPE OF t1; -- 锚定表{{t1}}中行数据类型 DECLARE rec2 ROW TYPE OF cur1; -- 基于游标{{cur1}}获取行数据类型
也可以看看