6.+----------------------------+
7.| Hello World |
8.+----------------------------+
. 在存储过程间传递全局范围的用户变量
1.mysql> CREATE PROCEDURE p1() SET @last_procedure='p1';
2.mysql> CREATE PROCEDURE p2() SELECT CONCAT('Last procedure was ',@last_proc);
3.mysql> CALL p1( );
4.mysql> CALL p2( );
5.+-----------------------------------------------+
6.| CONCAT('Last procedure was ',@last_proc |
7.+-----------------------------------------------+
8.| Last procedure was p1 |
9.+-----------------------------------------------+
注意:
①用户变量名一般以@开头
②滥用用户变量会导致程序难以理解及管理
(5). 注释
MySQL存储过程可使用两种风格的注释
双模杠:--
该风格一般用于单行注释
c风格: 一般用于多行注释
例如:
1.mysql > DELIMITER //
2.mysql > CREATE PROCEDURE proc1 --name存储过程名
3.-> (IN parameter1 INTEGER)
4.-> BEGIN
5.-> DECLARE variable1 CHAR(10);
6.-> IF parameter1 = 17 THEN
7.-> SET variable1 = 'birds';
8.-> ELSE
9.-> SET variable1 = 'beasts';
10.-> END IF;
11.-> INSERT INTO table1 VALUES (variable1);
12.-> END
13.-> //
14.mysql > DELIMITER ;
4. MySQL存储过程的调用
用call和你过程名以及一个括号,括号里面根据需要,加入参数,参数包括输入参数、输出参数、输入输出参数。具体的调用方法可以参看上面的例子。
5. MySQL存储过程的查询
我们像知道一个数据库下面有那些表,我们一般采用show tables;进行查看。那么我们要查看某个数据库下面的存储过程,是否也可以采用呢?答案是,我们可以查看某个数据库下面的存储过程,但是是令一钟方式。
我们可以用
select name from mysql.proc where db=’数据库名’;
或者
select routine_name from information_schema.routines where routine_schema='数据库名';
或者
show procedure status where db='数据库名';
进行查询。
如果我们想知道,某个存储过程的详细,那我们又该怎么做呢?是不是也可以像操作表一样用describe 表名进行查看呢?
答案是:我们可以查看存储过程的详细,但是需要用另一种方法:
SHOW CREATE PROCEDURE 数据库.存储过程名;
就可以查看当前存储过程的详细。
6. MySQL存储过程的修改
ALTER PROCEDURE
更改用CREATE PROCEDURE 建立的预先指定的存储过程,其不会影响相关存储过程或存储功能。
7. MySQL存储过程的删除
删除一个存储过程比较简单,和删除表一样:
DROP PROCEDURE
从MySQL的表格中删除一个或多个存储过程。
8. MySQL存储过程的控制语句
(1). 变量作用域
内部的变量在其作用域范围内享有更高的优先权,当执行到end。变量时,内部变量消失,此时已经在其作用域外,变量不再可见了,应为在存储
过程外再也不能找到这个申明的变量,但是你可以通过out参数或者将其值指派
给会话变量来保存其值。
1.mysql > DELIMITER //
2.mysql > CREATE PROCEDURE proc3()
3.-> begin
4.-> declare x1 varchar(5) default 'outer';
5.-> begin
6.-> declare x1 varchar(5) default 'inner';
7.-> select x1;
8.-> end;
9.-> select x1;
10.-> end;
11.-> //
12.mysql > DELIMITER ;
(2). 条件语句
Ⅰ. if-then -else语句
1.mysql > DELIMITER //
2.mysql > CREATE PROCEDURE proc2(IN parameter int)
3.-> begin
4.-> declare var int;
5.-> set var=parameter+1;
6.-> if var=0 then
7.-> insert into t values(17);
8.-> end if;
9.-> if parameter=0 then
10.-> update t set s1=s1+1;
11.-> else
12.-> update t set s1=s1+2;
13.-> end if;
14.-> end;
15.-> //
16.mysql > DELIMITER ;
Ⅱ. case语句:
1.mysql > DELIMITER //
2.mysql > CREATE PROCEDURE proc3 (in parameter int)
3.-> begin
4.-> declare var int;
5.-> set var=parameter+1;
6.-> case var
7.-> when 0 then
8.-> insert into t values(17);
9.-> when 1 then
10.-> insert into t values(18);
11.-> else
12.-> insert into t values(19);
13.-> end case;
14.-> end;
15.-> //
16.mysql > DELIMITER ;
(3). 循环语句
Ⅰ. while ···· end while:
1.mysql > DELIMITER //
2.mysql > CREATE PROCEDURE proc4()
3.-> begin
4.-> declare var int;
5.-> set var=0;
6.-> while var<6 do
7.-> insert into t values(var);
8.-> set var=var+1;
9.-> end while;
10.-> end;
11.-> //
12.mysql > DELIMITER ;
Ⅱ. repeat···· end repeat:
它在执行操作后检查结果,而while则是执行前进行检查。
1.mysql > DELIMITER //
2.mysql > CREATE PROCEDURE proc5 ()
3.-> begin
4.-> declare v int;
5.-> set v=0;
6.-> repeat
7.-> insert into t values(v);
8.-> set v=v+1;
9.-> until v>=5
10.-> end repeat;
11.-> end;
12.-> //
13.mysql > DELIMITER ;
Ⅲ. loop ·····end loop:
l