MySQL存储过程中的3种循环
在MySQL存储过程的语句中有三个标准的循环⽅式:WHILE循环,LOOP循环以及REPEAT循环。还有⼀种⾮标准的循环⽅式:GOTO,不过这种循环⽅式最好别⽤,很容易引起程序的混乱,在这⾥就不错具体介绍了。
这⼏个循环语句的格式如下:drop table会删除索引吗
WHILE……DO……END WHILE
REPEAT……UNTIL END REPEAT
LOOP……END LOOP
GOTO
下⾯⾸先使⽤第⼀种循环编写⼀个例⼦。
mysql>create procedure pro10()
->begin
->declare i int;
->set i=0;
->while i<5 do
->insert into t1(filed) values(i);
->set i=i+1;
->end while;
->end;//
Query OK, 0 rows affected (0.00 sec)
在这个例⼦中,INSERT和SET语句在WHILE和END WHILE之间,当变量i⼤于等于5的时候就退出循环。使⽤set i=0;语句是为了防⽌⼀个常见的错误,如果没有初始化,i默认变量值为NULL,⽽NULL和任何值操作的结果都是NULL。
执⾏⼀下这个存储过程并产看⼀下执⾏结果:
mysql> delete from t1//
Query OK, 0 rows affected (0.00 sec)
mysql> call pro10()//
Query OK, 1 row affected (0.00 sec)
mysql> select * from t1//
+——-+
| filed |
+——-+
| 0 |
| 1 |
| 2 |
| 3 |
| 4 |
+——-+
5 rows in set (0.00 sec)
以上就是执⾏结果,有5⾏数据插⼊到数据库中,证明存储过程编写正确⽆误^_^。
再来看⼀下第⼆个循环控制指令 REPEAT……END REPEAT。使⽤REPEAT循环控制语句编写下⾯这个存储过程:
mysql>create procedure pro11()
->begin
->declare i int default0;
-> repeat
->insert into t1(filed) values(i);
->set i=i+1;
-> until i>=5
->end repeat;
->end;//
Query OK, 0 rows affected (0.00 sec)
这个REPEAT循环的功能和前⾯WHILE循环⼀样,区别在于它的执⾏后检查是否满⾜循环条件(until i>=5),⽽WHILE则是执⾏前检查(while i<5 do)。
不过要注意until i>=5后⾯不要加分号,如果加分号,就是提⽰语法错误。
编写完成后,调⽤⼀下这个存储过程,并查看结果:
mysql> delete from t1//
Query OK, 5 rows affected (0.00 sec)
mysql> call pro11()//
Query OK, 1 row affected (0.00 sec) #虽然在这⾥显⽰只有⼀⾏数据受到影响,但是下⾯选择数据的话,还是插⼊了5⾏数据。
mysql> select * from t1//
+——-+
| filed |
+——-+
| 0 |
mysql查看所有存储过程| 1 |
| 2 |
| 3 |
| 4 |
+——-+
5 rows in set (0.00 sec)
⼀⾏就是执⾏结果,实际的作⽤和使⽤while编写的存储过程⼀样,都是插⼊5⾏数据。
再来看⼀下第三个循环控制语句LOOP……END LOOP。编写⼀个存储过程程序如下:
mysql>create procedure pro12()
->begin
->declare i int default0;
-> loop_label: loop
->insert into t1(filed) values(i);
->set i=i+1;
->if i>=5then
-> leave loop_label;
-
>end if;
->end loop;
->end;//
Query OK, 0 rows affected (0.00 sec)
从上⾯这个例⼦可以看出,使⽤LOOP编写同样的循环控制语句要⽐使⽤while和repeat编写的要复杂⼀些:在循环内部加⼊了IF……END IF 语句,在IF语句中⼜加⼊了LEAVE语句,LEAVE语句的意思是离开循环,LEAVE的格式是:LEAVE 循环标号。
java运行软件怎么下载编写完存储过程程序后,来执⾏并查看⼀下运⾏结果:
mysql> delete from t1//
Query OK, 5 rows affected (0.00 sec)
xor语句mysql> call pro12//
Query OK, 1 row affected (0.00 sec) #虽然说只有⼀⾏数据受影响,但是实际上是插⼊了5⾏数据。
mysql> select * from t1//
+——-+
| filed |
+——-+
| 0 |
| 1 |
| 2 |
| 3 |
| 4 |
+——-+
5 rows in set (0.00 sec)
执⾏结果和使⽤WHILE、LOOP编写的循环⼀样,都是往标中插⼊5⾏值。
Labels 标号和 END Labels 结束标号
在使⽤loop的时候,使⽤到的labels标号,对于labels可以⽤到while,loop,rrepeat等循环控制语句中。⽽且有必要好好认识⼀下
lables!!
mysql> create procedure pro13()
-> label_1:begin
-> label_2:while 0=1 do leave label_2;end while;
-> label_3:repeat leave label_3;until 0=0 end repeat;
-> label_4:loop leave label_4;end loop;
-> end;//
Query OK, 0 rows affected (0.00 sec)
上⾯这⾥例⼦显⽰了可以在BEGIN、WHILE、REPEAT或者LOOP语句前使⽤语句标号,语句标号只能在合法的语句前使⽤,所以LEAVE label_3意味着离开语句标号名为label_3的语句或符合语句。
其实,也可以使⽤END labels来表⽰标号结束符。
mysql> create procedure pro14()
-> label_1:begin
-> label_2:while 0=1 do leave label_2;end while label_2;
-> label_3:repeat leave label_3;until 0=0 end repeat label_3;
-> label_4:loop leave label_4;end loop label_4;
-> end label_1;//
Query OK, 0 rows affected (0.00 sec)
上⾯就是使⽤了标号结束符,其实这个结束标号并不是⼗分有⽤,⽽且他必须和开始定义的标号名字⼀样,否则就会报错。如果要养成⼀个良好的编程习惯⽅便他⼈阅读的话,可以使⽤这个标号结束符。
ITERATE 迭代
如果是在ITERATE语句,即迭代语句中的话,就必须使⽤LEAVE语句。ITERATE只能出现在LOOP,REPEAT和WHILE语句中,它的意思是“再次循环”,例如:
mysql> create procedure pro15()
-> begin
-> declare i int default 0;
-> loop_label:loop
-> if i=3 then
-> set i=i+1;
-> iterate loop_label;
-> end if;
-
> insert into t1(filed) values(i);
-> set i=i+1;
-> if i>=5 then
-> leave loop_label;
-> end if;
-> end loop;
-> end;//
Query OK, 0 rows affected (0.00 sec)
iterate语句和leave语句⼀样,也是在循环内部使⽤,它有点类似于C/C++语⾔中的continue。
那么这个存储程序是怎么运⾏的的?⾸先i的值为0,条件判断语句if i=3 then判断为假,跳过if语段,向数据库中插⼊0,然后i+1,同样后⾯的if i>=5 then判断也为假,也跳过;继续循环,同样插⼊1和2;在i=3的时候条件判断语句if i=3 then判断为真,执⾏i=i+1,i值为4,然后执⾏迭代iterate loop_label;,
即语句执⾏到iterate loop_label;后直接跳到if i=3 then判断语句,执⾏判断,这个时候由于i=4,if i=3 then判断为假,跳过IF语段,将4添加到表中,i变为5,条件判断if i>=5 then判断为真,执⾏leave loop_label;跳出loop循环,然后执⾏end;//,结束整个存储过程。
综上所述,数据库中将插⼊数值:0,1,2,4。执⾏存储过程,并查看结果:|
源代码电影对白分析mysql> delete from t1//
Query OK, 5 rows affected (0.00 sec)
mysql> call pro15//
zero零Query OK, 1 row affected (0.00 sec)
mysql> select * from t1//
+——-+
| filed |
+——-+
| 0 |
| 1 |
| 2 |
| 4 |
+——-+
4 rows in set (0.00 sec)
和我们上⾯分析的结果⼀样,只插⼊了数值0,1,2,4。
存储过程如同⼀门程序设计语⾔,同样包含了数据类型、流程控制、输⼊和输出和它⾃⼰的函数库。
--------------------基本语法--------------------
⼀.创建存储过程
create procedure sp_name()
begin
.........
end
⼆.调⽤存储过程
1.基本语法:call sp_name()
注意:存储过程名称后⾯必须加括号,哪怕该存储过程没有参数传递
三.删除存储过程
1.基本语法:
drop procedure sp_name//
2.注意事项
(1)不能在⼀个存储过程中删除另⼀个存储过程,只能调⽤另⼀个存储过程
四.其他常⽤命令
1.show procedure status
显⽰中所有存储的存储过程基本信息,包括所属数据库,存储过程名称,创建时间等
2.show create procedure sp_name
显⽰某⼀个存储过程的详细信息
--------------------数据类型及运算符--------------------
⼀、基本数据类型:
略
⼆、变量:
⾃定义变量:DECLARE a INT ; SET a=100; 可⽤以下语句代替:DECLARE a INT DEFAULT 100;变量分为⽤户变量和系统变量,系统变量⼜分为会话和全局级变量
⽤户变量:⽤户变量名⼀般以@开头,滥⽤⽤户变量会导致程序难以理解及管理
1、 在mysql客户端使⽤⽤户变量
mysql> SELECT 'Hello World' into @x;
mysql> SELECT @x;
mysql> SET @y='Goodbye Cruel World';
mysql> select @y;
mysql> SET @z=1+2+3;
mysql> select @z;
2、 在存储过程中使⽤⽤户变量
mysql> CREATE PROCEDURE GreetWorld( ) SELECT CONCAT(@greeting,' World');
mysql> SET @greeting='Hello';
mysql> CALL GreetWorld( );
3、 在存储过程间传递全局范围的⽤户变量
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( );
三、运算符:
1.算术运算符
+ 加 SET var1=2+2; 4
- 减 SET var2=3-2; 1
* 乘 SET var3=3*2; 6
/ 除 SET var4=10/3; 3.3333
DIV 整除 SET var5=10 DIV 3; 3
% 取模 SET var6=10%3 ; 1
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论