mysql > SELECT 'Hello World' into @x; mysql > SELECT @x; +-------------+ | @x | +-------------+ | Hello World | +-------------+ mysql > SET @y='Goodbye Cruel World'; mysql > SELECT @y; +---------------------+ | @y | +---------------------+ | Goodbye Cruel World | +---------------------+ mysql > SET @z=1+2+3; mysql > SELECT @z; +------+ | @z | +------+ | 6 | +------+
在存储过程中使用用户变量:
1 2 3 4 5 6 7 8
mysql > CREATE PROCEDURE GreetWorld( ) SELECT CONCAT(@greeting,' World'); mysql > SET @greeting='Hello'; mysql > CALL GreetWorld( ); +----------------------------+ | CONCAT(@greeting,' World') | +----------------------------+ | Hello World | +----------------------------+
在存储过程间传递全局范围的用户变量:
1 2 3 4 5 6 7 8 9
mysql> CREATE PROCEDURE p1() SET @last_procedure='p1'; mysql> CREATE PROCEDURE p2() SELECT CONCAT('Last procedure was ',@last_procedure); mysql> CALL p1( ); mysql> CALL p2( ); +-----------------------------------------------+ | CONCAT('Last procedure was ',@last_proc | +-----------------------------------------------+ | Last procedure was p1 | +-----------------------------------------------+
6、存储过程的注释
MySQL 存储过程可使用两种风格的注释。
两个横杆–:该风格一般用于单行注释。
c 风格: 一般用于多行注释。
1 2 3 4 5 6 7 8 9 10 11 12 13 14
mysql > DELIMITER // mysql > CREATE PROCEDURE proc1 -- name存储过程名 -> (IN parameter1 INTEGER) -> BEGIN -> DECLARE variable1 CHAR(10); -> IF parameter1 = 17 THEN -> SET variable1 = 'birds'; -- 使用SET进行变量赋值,知识点很重要。 -> ELSE -> SET variable1 = 'beasts'; -> END IF; -> INSERT INTO table1 VALUES (variable1); -> END -> // mysql > DELIMITER ;
我们像知道一个数据库下面有那些表,我们一般采用 show tables; 进行查看。那么我们要查看某个数据库下面的存储过程,是否也可以采用呢?答案是,我们可以查看某个数据库下面的存储过程,但是是另一钟方式。
我们可以用以下语句进行查询:
1 2 3 4 5
select name from mysql.proc where db='数据库名'; 或者 select routine_name from information_schema.routines where routine_schema='数据库名'; 或者 showprocedure status where db='数据库名';
内部的变量在其作用域范围内享有更高的优先权,当执行到 end。变量时,内部变量消失,此时已经在其作用域外,变量不再可见了,应为在存储过程外再也不能找到这个申明的变量,但是你可以通过 out 参数或者将其值指派给会话变量来保存其值。
1 2 3 4 5 6 7 8 9 10 11 12
mysql > DELIMITER // mysql > CREATE PROCEDURE proc3() -> begin -> declare x1 varchar(5) default 'outer'; -> begin -> declare x1 varchar(5) default 'inner'; -> select x1; -> end; -> select x1; -> end; -> // mysql > DELIMITER ;
8.2、条件语句,if-then-else 语句
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
mysql > DELIMITER // mysql > CREATE PROCEDURE proc2(IN parameter int) -> begin -> declare var int; -> set var=parameter+1; -> if var=0 then -> insert into t values(17); -> end if; -> if parameter=0 then -> update t set s1=s1+1; -> else -> update t set s1=s1+2; -> end if; -> end; -> // mysql > DELIMITER ;
8.3、条件语句,case语句:
使用的语法,如下所示:
1 2 3 4 5 6 7
case when var=0then insert into t values(30); when var>0then when var<0then else endcase
使用的案例,如下所示:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
mysql > DELIMITER // mysql > CREATE PROCEDURE proc3 (in parameter int) -> begin -> declare var int; -> set var=parameter+1; -> case var -> when 0 then -> insert into t values(17); -> when 1 then -> insert into t values(18); -> else -> insert into t values(19); -> end case; -> end; -> // mysql > DELIMITER ;
8.4、循环语句while ···· end while
使用的语法,如下所示:
1 2 3
while 条件 do --循环体 end while
使用的案例,如下所示:
1 2 3 4 5 6 7 8 9 10 11 12
mysql > DELIMITER // mysql > CREATE PROCEDURE proc4() -> begin -> declare var int; -> set var=0; -> while var<6 do -> insert into t values(var); -> set var=var+1; -> end while; -> end; -> // mysql > DELIMITER ;
8.5、循环语句repeat···· end repeat
它在执行操作后检查结果,而 while 则是执行前进行检查。
使用的语法,如下所示:
1 2 3 4
repeat --循环体 until 循环条件 end repeat;
使用的案例,如下所示:
1 2 3 4 5 6 7 8 9 10 11 12 13
mysql > DELIMITER // mysql > CREATE PROCEDURE proc5 () -> begin -> declare v int; -> set v=0; -> repeat -> insert into t values(v); -> set v=v+1; -> until v>=5 -> end repeat; -> end; -> // mysql > DELIMITER ;
8.6、循环语句loop ·····endloop
loop 循环不需要初始条件,这点和 while 循环相似,同时和 repeat 循环一样不需要结束条件, leave 语句的意义是离开循环。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
mysql > DELIMITER // mysql > CREATE PROCEDURE proc6 () -> begin -> declare v int; -> set v=0; -> LOOP_LABLE:loop -> insert into t values(v); -> set v=v+1; -> if v >=5 then -> leave LOOP_LABLE; -> end if; -> end loop; -> end; -> // mysql > DELIMITER ;
8.7、循环语句LABLES 标号:
标号可以用在 begin repeat while 或者 loop 语句前,语句标号只能在合法的语句前面使用。可以跳出循环,使运行指令达到复合语句的最后一步。
ITERATE 通过引用复合语句的标号,来从新开始复合语句:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
mysql > DELIMITER // mysql > CREATE PROCEDURE proc10 () -> begin -> declare v int; -> set v=0; -> LOOP_LABLE:loop -> if v=3 then -> set v=v+1; -> ITERATE LOOP_LABLE; -> end if; -> insert into t values(v); -> set v=v+1; -> if v>=5 then -> leave LOOP_LABLE; -> end if; -> end loop; -> end; -> // mysql > DELIMITER ;