MySql_ procedure

Posted R.Z

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MySql_ procedure相关的知识,希望对你有一定的参考价值。

下面是一个示例:

delimiter //S                                                                                                                                                                                                                                                                                                   

drop procedure if EXISTS myzrz;

CREATE PROCEDURE myzrz(in pin int,out pout int, INOUT pinout int)
begin
declare var int ;
set var =0;

while var<6 DO
INSERT into test.test values (null,var,var,var);
set var=var+1;
end while;
end;
//

调用语法示例


Set @a=6;
set @b=6;
call myzrz(6,6,@b);

 

1 调用的时候 out 类型的参数和 inout 的参数必须指定为用户变量  如 @a,@b来做参数;

IN 类型的参数 虽然在存储过程中被修改,但并不影响@p_in的值,注意这点;

 

 

Ⅱ. 变量赋值

 SET 变量名 = 表达式值 [,variable_name = expression ...]

 

 

Ⅲ. 用户变量

 

ⅰ. 在mysql客户端使用用户变量

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   |  

+------+  

ⅱ. 在 存储过程中使用用户变量

 

mysql > CREATE PROCEDURE GreetWorld( ) SELECT CONCAT(@greeting,‘ World‘);  

mysql > SET @greeting=‘Hello‘;  

mysql > CALL GreetWorld( );  

+----------------------------+  

| CONCAT(@greeting,‘ World‘) |  

+----------------------------+  

|  Hello World               |  

+----------------------------+  

 

ⅲ. 在存储过程间传递全局范围的用户变量

mysql> CREATE PROCEDURE p1()   SET @last_procedure=‘p1‘;  

mysql> CREATE PROCEDURE p2() SELECT CONCAT(‘Last procedure was ‘,@last_proc);  

mysql> CALL p1( );  

mysql> CALL p2( );  

+-----------------------------------------------+  

| CONCAT(‘Last procedure was ‘,@last_proc       |  

+-----------------------------------------------+  

| Last procedure was p1                         |  

+-----------------------------------------------+  

 

 

注意:

①用户变量名一般以@开头

②滥用用户变量会导致程序难以理解及管理

 

(5). 注释

 

MySQL存储过程可使用两种风格的注释

双模杠:--

该风格一般用于单行注释

c风格: 一般用于多行注释

例如:

 

mysql > DELIMITER //  

mysql > CREATE PROCEDURE proc1 --name存储过程名  

     -> (IN parameter1 INTEGER)  

     -> BEGIN  

     -> DECLARE variable1 CHAR(10);  

     -> IF parameter1 = 17 THEN  

     -> SET variable1 = ‘birds‘;  

     -> ELSE 

     -> SET variable1 = ‘beasts‘;  

     -> END IF;  

     -> INSERT INTO table1 VALUES (variable1);  

     -> END  

     -> //  

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参数或者将其值指派

给 会话变量来保存其值。

 

 

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 ;  

 

 (2). 条件语句

Ⅰ. if-then -else语句

 

 

 

 

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 ;  

 

Ⅱ. case语句: 

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 ; 

 

(3). 循环语句

Ⅰ. while ···· end while:

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 ; 

 

 

Ⅱ. repeat···· end repeat:

它在执行操作后检查结果,而while则是执行前进行检 查。

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 ;  

 

 

Ⅲ. loop ·····end loop:

loop循环不需要初始条件,这点和while 循环相似,同时 和repeat循环一样不需要结束条件, leave语句的意义是 离开循环。

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 ;  

 

 

Ⅳ. LABLES 标号:

标号可以用在begin repeat while 或者loop 语句前,语句标号只能在合法的语句前面使用。可以跳出循环,使运行指令达到复合语句的最后一步。

 

(4). ITERATE迭代

Ⅰ. ITERATE:

通过引用复合语句的标号,来从新开始复合语句

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 ; 

 

以上是关于MySql_ procedure的主要内容,如果未能解决你的问题,请参考以下文章

存储过程

oracle存储过程

Oracle之存储过程

SQL总结——存储过程

SQL总结---存储过程

Sql 中存储过程详细案例