mysql触发器过程(二)

2014-11-24 11:19:30 · 作者: · 浏览: 4
| CONCAT(@greeting,' World') |
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