1.变量的明使用declare,一句declare只声明一个变量,变量必须先声明后使用
2.变量具有数据类型和长度,与mysql的SQL数据类型保持一致,因此甚至还能指定默认值、字符集和排序规则等
3.变量可以通过set来赋值,也可以通过select into的方式赋值
4.变量需要返回,可以使用select语句,如:select变量名
5.变量是有作用域的,作用范围在begin与end块之间,end结束变量的作用范围即结束。
6.需要多个块之间传递值,可以使用全局变量,即放在所有代码块之前。
见:链接
declare condition_name CONDTION FOR condtion_value
例子
#方法一:使用sqlstate_value
DECLARE can_not_find CONDITION FOR sqlstate '42S02';
#方法二:使用mysql_error_code
DECLARE can_not_find CONDITION FOR 1146;
DECLARE handler_type HANDLER FOR condition_value[,...] sp_statement
DECLARE CONTINUE HANDLER FOR SQLSTATE *23000' SET @x2 = 1;
CREATE PROCEDURE testa(IN `my_uid` int)
BEGIN
#声明一个存储过程变量
DECLARE my_uname VARCHAR(32) DEFAULT '';
#把变量的值设置为hxf
SET my_uname='hxf';
#将users表中id为myuid的那一条的uname的值赋给该变量my_uname
SELECT uname INTO my_uname FROM users WHERE uid=my_uid;
#返回一个变量my_uname
select my_uname;
END;
1.传参变量是全局的,可以在多个之间起作用。
2.传入参数:类型为IN,表示该参数的值必须在调用存储过程时指定,如果不显式指定为IN,那么默认就是IN类型。
3.IN类型参数一般只用于传入,在调用存储过程中一般不作修改和返回。
CREATE PROCEDURE testa(IN `my_uid` int,OUT `my_uname` varchar(32))
BEGIN
SELECT uname INTO my_uname FROM users WHERE uid=my_uid;
END;
1.如果调用存储过程中需要修改和返回值,可以使用OUT类型参数。
2.传出参数:在调用存储过程中,可以改变其值,并可返回
3.OUT是传出参数,不能用于传入参数值
4.调用存储过程时,OUT参数也需要指定,但必须变量,不能是常量
CREATE PROCEDURE testa(INOUT `my_uid` int)
BEGIN
SELECT uid INTO my_uidFROM users WHERE uid=1;
END;
1.如果既需要传入,同时又需要传出,则可以使用INOUT类型参数
2.调用时可传入值,在调用过程中,可修改其值,同时也可返回值。
3.INOUT参数集合了IN和OUT类型的参数功能
4.INOUT调用时传入的是变量,而不是常量
BEGIN
#Routine body goes here...
DECLARE my_uname VARCHAR(32) DEFAULT '';
if(my_uid%2=0)
THEN
SELECT uname INTO my_uname FROM users WHERE uid=my_uid;
SELECT my_uname;
ELSE
SELECT my_uid;
end if;
END
if(condtion)
then
//add some code
else
//add some code
end if
2.if表达式可以是任意判断返回真或者假的表达式
3.多条件判断结构
if(condtion)
then
//add some code
else if(condtion)
then
//add some code
else
//add some code
end if
BEGIN
#Routine body goes here...
DECLARE i int DEFAULT 0;
WHILE(condtion) DO
BEGIN
//add some code
END;
END WHILE;
END
BEGIN
#Routine body goes here...
DECLARE i int DEFAULT 0;
repeat
BEGIN
//add some code
END;
until condtion
end repeat
END
drop procedure [if exists] sp_name
//查看存储过程的状态
show procedure status like 'name'\G
//查看存储过程的定义
show create procedure name \G
//通过information_schema.Routines就可以获得存储过程的名称的信息
select * from routines where ROURINE_NAME='name' \G
1.SQL SECURITY特性说明子程序运行使用创建者的许可才执行,还是使用调用者(invoker)的许可来执行,默认值是DEFINER。
2.可以使没有更新权限的只读用户来执行有更新语句的存储函数。