MySQL 创建存储过程sql语句 怎么实现 循环sql语句

MySQL循环语句之while循环测试
转载 & & 投稿:whsnow
MySQL有循环语句操作,while 循环、loop循环和repeat循环,目前我只测试了 while 循环,下面与大家分享下
mysql 操作同样有循环语句操作,网上说有3中标准的循环方式: while 循环 、 loop 循环和repeat循环。还有一种非标准的循环: goto。 鉴于goto 语句的跳跃性会造成使用的的思维混乱,所以不建议使用。
这几个循环语句的格式如下:
WHILE……DO……END WHILE
REPEAT……UNTIL END REPEAT
LOOP……END LOOP
目前我只测试了 while 循环:
delimiter $$    // 定义结束符为 $$
drop pr // 删除 已有的 存储过程
create procedure wk()      //  创建新的存储过程
          // 变量声明
set i = 1;     
while i & 11 do           // 循环体
insert into user_profile (uid) values (i);
set i = i +1;
end $$               // 结束定义语句
          // 先把结束符 回复为;
call wk();
delimter : mysql 默认的 delimiter是; 告诉mysql解释器,该段命令是否已经结束了,mysql是否可以执行了。
这里使用 delimiter 重定义结束符的作用是: 不让存储过程中的语句在定义的时候输出。
创建 MySQL 存储过程的简单语法为:
CREATE PROCEDURE 存储过程名称( [in | out | inout] 参数 )
Mysql 语句
调用存储过程:
call 存储过程名称() // 名称后面要加()
&span style="color: rgb(57, 57, 57); font-family: verdana, 'ms song', Arial, Helvetica, sans- font-size: 14 line-height: 21 background-color: rgb(250, 247, 239);"&二 、 REPEAT 循环&/span&
&pre name="code" class="html"&delimiter //
drop proced
create procedure looppc()
set i = 1;
insert into user_profile_company (uid) values (i+1);
set i = i + 1;
until i &= 20
call looppc()
三、 LOOP 循环
delimiter $$
create procedure lopp()
set i = 1;
lp1 : LOOP              // lp1 为循环体名称 LOOP 为关键字insert into user_profile (uid) values (i);
set i = i+1;
if i & 30 then
leave lp1;              // 离开循环体
end LOOP;              // 结束循环
您可能感兴趣的文章:
大家感兴趣的内容
12345678910
最近更新的内容
常用在线小工具posts - 431,&
comments - 344,&
trackbacks - 0
&Don't Repeat Yourself
座右铭:you can lose your money, you can spent all of it, and if you work hard you get it all back. But if you waste your time, you're never gonna get it back.
公告:本博客在此声明部分文章为转摘,只做资料收集使用。
微信: szhourui
QQ: Email:lsi.zhourui@gmail.com
2425262728293012368910111314151718222324252627282930311234
留言簿(15)
随笔分类(1019)
文章分类(3)
文章档案(21)
bio & chem
积分与排名
阅读排行榜
在MySQL存储过程的语句中有三个标准的循环方式:WHILE循环,LOOP循环以及REPEAT循环。还有一种非标准的循环方式:GOTO,不过这种循环方式最好别用,很容易引起程序的混乱,在这里就不错具体介绍了。
这几个循环语句的格式如下:
WHILE……DO……END WHILE
REPEAT……UNTIL END REPEAT
LOOP……END LOOP
&&& 下面首先使用第一种循环编写一个例子。
mysql& create procedure pro10()
&&& -& begin
&&& -& set i=0;
&&& -& while i&5 do
&&& -&&&&& insert into t1(filed) values(i);
&&& -&&&&& set i=i+1;
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//
5 rows in set (0.00 sec)
&&& 以上就是执行结果,有5行数据插入到数据库中,证明存储过程编写正确无误^_^。
&&& 再来看一下第二个循环控制指令 REPEAT……END REPEAT。使用REPEAT循环控制语句编写下面这个存储过程:
mysql& create procedure pro11()
&&& -& begin
&&& -& declare i int default 0;
&&& -& repeat
&&& -&&&&& insert into t1(filed) values(i);
&&& -&&&&& set i=i+1;
&&& -&&&&& until i&=5
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//
5 rows in set (0.00 sec)
一行就是执行结果,实际的作用和使用while编写的存储过程一样,都是插入5行数据。
再来看一下第三个循环控制语句LOOP……END LOOP。编写一个存储过程程序如下:
mysql& create procedure pro12()
&&& -& begin
&&& -& declare i int default 0;
&&& -& loop_label: loop
&&& -&&&&& insert into t1(filed) values(i);
&&& -&&&&& set i=i+1;
&&& -&&&&& if i&=5 then
&&& -&&&&&&&&& leave loop_
&&& -&&&&&
Query OK, 0 rows affected (0.00 sec)
从上面这个例子可以看出,使用LOOP编写同样的循环控制语句要比使用while和repeat编写的要复杂一些:在循环内部加入了IF……END IF语句,在IF语句中又加入了LEAVE语句,LEAVE语句的意思是离开循环,LEAVE的格式是:LEAVE 循环标号。
&&& 编写完存储过程程序后,来执行并查看一下运行结果:
mysql& delete from t1//
Query OK, 5 rows affected (0.00 sec)
mysql& call pro12//
Query OK, 1 row affected (0.00 sec) #虽然说只有一行数据受影响,但是实际上是插入了5行数据。
mysql& select * from t1//
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;
&&& -& label_3:repeat leave label_3;until 0=0
&&& -& label_4:loop leave label_4;
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_
&&& -&&&&&
&&& -&&&&& insert into t1(filed) values(i);
&&& -&&&&& set i=i+1;
&&& -&&&&& if i&=5 then
&&& -&&&&&&&& leave loop_
&&& -&&&&&
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_,即语句执行到iterate loop_后直接跳到if i=3 then判断语句,执行判断,这个时候由于i=4,if i=3 then判断为假,跳过IF语段,将4添加到表中,i变为5,条件判断if i&=5 then判断为真,执行leave loop_跳出loop循环,然后执行//,结束整个存储过程。
&&& 综上所述,数据库中将插入数值:0,1,2,4。执行存储过程,并查看结果:|
mysql& delete from t1//
Query OK, 5 rows affected (0.00 sec)
mysql& call pro15//
Query OK, 1 row affected (0.00 sec)
mysql& select * from t1//
4 rows in set (0.00 sec)
和我们上面分析的结果一样,只插入了数值0,1,2,4。
阅读(43313)
&re: MySQL存储过程中的3种循环【转载】
来了就留个言吧,帮博主打打气!有些问题还没有弄明白,希望博主再出好文章!&&&&
&re: MySQL存储过程中的3种循环【转载】[未登录]
这是一篇好文章&&&&
&re: MySQL存储过程中的3种循环【转载】
&re: MySQL存储过程中的3种循环【转载】
确实不错&&&&简简单单储存过程——循环一个select结果集
摘要:本文主要讲解了存储过程的创建、调用、以及游标的使用 ,相信掌握了游标&&&&& 会对你有不错的帮助,有不足之处还请指教&导航 : 一、存储过程的创建及调用&&&&&&&&&&& 二 、游标的使用&&&&&&&&&&& 三、& 示例&&&&&&&&&&& 四、补充&说明:&&&&&&& 1、用到的两个数据表:&&&&&&& from_data&&
&& to_data
2、示例需求 : 将表from_data 的select结果集循环插入到表 to_data;&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& 伪代码:&& while 循环 select id ,name from_data&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& insert into to_data(id,name) value(from_data.id,from_data.name)&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& end&&&&&&&& 3、环境: &&&&一、存储过程的创建及调用&&&&&&&&&&& 我们创建一个名叫 add_test的存储过程&&&&&&& 1 、检查是否有 add_testSql代码& drop procedure if exists add_&&& &&&&&& 2、创建&&Sql代码& create procedure add_test()&&&& && (&&&& && #[in|out|inout] 参数 datatype&& &&&& && &&&&& &&&&& && )&&&& && begin&&&& && #SQL 语句;& & &&& &&&&& &&&&& &&& 3、调用&Sql代码& call add_test(1,2& & );& && &&& 以上就是基本的创建方法,注意已下几点:&&&&&&& 1 、在建立和调用时,add_test后面的“()”是必须的&&&&&&& 2、MySQL 存储过程参数如果不显式指定“in”、“out”、“inout”,则默认为“in”,并且参数不能指定默认值 。&&&&&&& 3、包含多条 SQL 语句时,需要 begin end 关键字,在begin end里面的每条语句的末尾,都要加上分号 “;”&&&&&&& 4、在begin end里面声明变量,使用关键字 DECLARE ,如:&Sql代码& begin&& & & #声明一个name变量,类型是varchar(记得分号)& & name varchar(32);&&&& & &&二 、游标的使用&&&&&&&&& 1、定义游标Sql代码& /*& &&& 定义游标的关键字:CURSOR。& &&& 定义游标cursor_name,& &&& 游标cursor_name当前指针的记录& &&& 是一个表from_data的多行结果集& &*/& & DECLARE cursor_name CURSOR FOR select id,name& & from from_& &&&&&&&&& 2、打开游标&Sql代码& #关键字:OPEN& OPEN cursor_&& &&& 3、 获取游标&Sql代码& #声明两个变量& & DECLARE a int& & ;& & DECLARE b varchar(32)& & ;& & /*& && FETCH 获取游标当前指针的记录,并传给指定变量 a 、b& */& FETCH cursor_name INTO a,b;& &&& 注意:(1、此处很重要,我们在后面的循环例子中会详细讲解如何用,&&&&&&&&&& (2、注意变量数必须与MySQL游标返回的字段数以及类型一致,请看2,3步的标红处,&&&&&&&&&& a的类型对应 id,b类型对应name&& 4、关闭游标&Sql代码& CLOSE cursor_& &&&&& 以上就是游标的常见使用方法,关键的部分我已在每一步中说明,就不在多说了,现在我们看下例子:&三、示例&Sql代码& drop procedure if exists add_& # 创建存储过程 add_test& & & CREATE PROCEDURE add_test()& & &&& BEGIN& &&&&&&&&&& #定义 变量& & & &&&&&&&&&& DECLARE& &&&&&&&&&& DECLARE b VARCHAR(30);& &&&&&&&&&&&& &&&&&&&&&& #此变可有可无,为了给个该存储函数执行成功后给个提示,运行下便知道& & & &&&&&&&&&& DECLARE str VARCHAR(300);& &&&&&&&&&& DECLARE& &&&&&&&&&&&& &&&&&&&&&& #这个用于处理游标到达最后一行的情况& & &&&& &&&&&&&&&& DECLAREMySQL 存储过程中使用 WHILE 循环语句 - 为程序员服务
为程序员服务
MySQL 存储过程中使用 WHILE 循环语句
delimiter $$
CREATE PROCEDURE myProc()
loop1: WHILE i&=10 DO
IF MOD(i,2)&&0 THEN /*Even number - try again*/
SELECT CONCAT(i,& is an odd number&);
SET i=i+1;
END WHILE loop1;
mysql& call myProc();
您可能的代码
相关聚客文章
荣誉:1655
相关专栏文章mysql 中存储过程动态生成sql语句执行的问题 - ITeye问答
最近把系统从mssql转到mysql上,原来有做统计的存储过程也要一并移过来,原来的存储过程是用行列转换,动态生成sql语句然后用exec执行的,换到mysql后改用EXECUTE执行,在mysql命令行中调用存储过程可以得到列表
+-------+--------------+-----------------+--------------+-----------+--------+
| se_no | max(se_code) | head&&&&&&&&&&& | 娼滃湪瀹㈡埛&&&& | 鏈?EUR夋嫨&&& | 鍚
堣?&& |
+-------+--------------+-----------------+--------------+-----------+--------+
|&&&& 1 | NULL&&&&&&&& | 瓒呯骇绠$悊鍛?&&&& |&&&&&&&&&&& 1 |&&&&&&&& 1 |&&&&& 2
|
|& NULL | NULL&&&&&&&& | 瓒呯骇绠$悊鍛?&&&& |&&&&&&&&&&& 1 |&&&&&&&& 1 |&&&&& 2
|
+-------+--------------+-----------------+--------------+-----------+--------+
(因为数据库是utf8的,所以列表是乱码),但用jdbc调用存储过程后好像没有执行execute语句,而是直接返回了动态生成的sql语句,就和在命令行中不执行最后两句
PREPARE stmt2 FROM @
EXECUTE stmt2;
的效果一样,哪位对mysql比较熟悉的大哥能帮个忙啊
存储过程代码
CREATE PROCEDURE empCusState( arg_sqlAppend text )
SET @psql = 'select se_no,max(se_code),max(se_name) as head';
SELECT @psql:=CONCAT(@psql,
CASE WHEN typ_name IS NOT NULL
THEN (CONCAT(',sum(case typ_name when ''',typ_name,
''' then 1 else 0 end) as ',typ_name,' '))
ELSE (', sum(case when typ_name is null then 1 else 0 end) as 未选择')
(select typ_name from cus_cor_cus
left join type_list on cor_typ_id=typ_id
where cor_isdelete='1' group by typ_name order by typ_name desc)
SET @psql:=CONCAT(@psql,
',count(cor_code)as 合计 from cus_cor_cus
inner join sal_emp on cor_se_no=se_no
left join type_list on cor_typ_id=typ_id
where cor_isdelete=''1'' group by se_no with rollup');
PREPARE stmt2 FROM @
EXECUTE stmt2;
问题补充:iihero 写道第4行,把SELECT @psql:=CONCAT(@psql,
换成set @psql=CONCAT(@psql, ....
你用select,自然就会当作一个结果集来处理。
select是用来拼装sql语句的,主要是没执行EXECUTE的,在命令行下call是正常的&
采纳的答案
引用select是用来拼装sql语句的,主要是没执行EXECUTE的,在命令行下call是正常的&
用set一样可以拼装sql语句。
在程序里头,会返回多个结果集(每个select一个结果集),你取的是第一个结果集,对应的就这个sql语句。
这跟命令行里头确实不一样。
第4行,把SELECT @psql:=CONCAT(@psql,
换成set @psql=CONCAT(@psql, ....
你用select,自然就会当作一个结果集来处理。
已解决问题
未解决问题

我要回帖

更多关于 sql存储过程循环语句 的文章

 

随机推荐