declare是用来
定义变量和常用处理、声明之类的关键字。在mysql存储过程出现之前declare是一块鸡肋,大家常用declare来定义局部变量,我习惯性的还是使用set来定义变量(虽然是全局的,但是来的方便)。 存储过程出现后declare的标准处理定义就变成了非常强大的工具,可以用来为存储过程添加一些非常强大的
错误处理机制。 首先需要提一点的是declare定义变量如果想定义varchar型的,必须注明参数最大长度,即declare varchar(20). 在这里我们不深究它用来定义参数的小细节 我们主要来研究DECLARE Condition 和 DECLARE Handler DECLARE Condition 和 DECLARE Handler可以说是为了处理错误而生的。 功能上讲DECLARE Condition出现的时间比较早,功能也比较简单,它可以通过错误编号或者SQLSTATE来触发一各名字,说明白一点就是当某个错误编号出现的时候替换一个名字给它。这样调用的时候,我们不用去记一大串错误编号了。 它的标准语法我们可以在mysql的附注中找到。 DECLARE condition_name CONDITION FOR condition_value condition_value:例子如下:DECLARE errname CONDITION FOR SQLSTATE '23000' 将返回SQLSTATE信息为23000的错误定名为errname 这个名字就可以被我们的绝对重头戏DECLARE Handler调用了,在DECLARE Handler中可以定义错误的处理办法,可以使用begin和end来标记语句块,可以单独使用rollback。处理的过程也可以定义为继续执行和中断存储过程。 标准语法:DECLARE handler_type HANDLER FOR condition_value[,...] sp_statement handler_type: 处理的过程。 CONTINUE 继续执行未完成的存储过程,直至结束。(常用,默认) | EXIT 出现错误即自动跳出所在的begin不再执行后面的语句。 condition_value: 处理的触发条件 SQLSTATE [VALUE] sqlstate_value 不用说了,最常用的错误定义,自己去查错误列表吧。 | condition_name 我们刚刚定义的那个名字errnmae就是用在这里的。 | SQLWARNING 这个太好用了,从错误编号01开始的错误。相当于错误的通配符。 | NOT FOUND 和上面差不多,从02开始。 | SQLEXCEPTION 上面两个中没有包括的错误它都可以用来触发,就是说你想定义只要出错就触发的话就定义出错条件为SQLWARNING+SQLEXCEPTION。 | mysql_error_code 错误编号,和第一个不一样,不过同样可以在错误列表从中查到,是我比较常用的。 例子DECLARE errname CONDITION FOR SQLSTATE '23000'给导致错误23000的错误定义名字为errname DECLARE continue handler for errname 当errname发生时作下面的处理 BEGIN 语句开始 set @x=1设置@x=1MySQL存储过程中,定义变量有两种方式:
1.使用set或select直接赋值,变量名以 @ 开头.
例如:set @var=1
可以在一个会话的任何地方声明,作用域是整个会话,称为会话变量。
2.以 DECLARE 关键字声明的变量,只能在存储过程中使用,称为存储过程变量,例如:
DECLARE var1 INT DEFAULT 0
主要用在存储过程中,或者是给存储传参数中。
两者的区别是:
在调用存储过程时,以DECLARE声明的变量都会被初始化为 NULL。而会话变量(即@开头的变量)则不会被再初始化,在一个会话内,只须初始化一次,之后在会话内都是对上一次计算的结果,就相当于在是这个会话内的全局变量。
在存储过程中,使用动态语句,预处理时,动态内容必须赋给一个会话变量。
例:
set @v_sql= sqltext
PREPARE stmt FROM @v_sql
EXECUTE stmt
DEALLOCATE PREPARE stmt
SELECT USER_INDEX into DUS_USER_ID
FROM TABLE_SHOW_USER
WHERE USER_NAME=IN_DUS_USER_NAME
评论列表(0条)