mysql 存储过程 while查询的结果用while全部取到 怎么在外面得到while循环里面的值啊?

网页设计教程与开发
提供各种常见网页效果
提供各种各样的设计教程
装扮QQ,让QQ变得更酷
设计参考,提高自升水平
学习服务器和操作系统
提供各种素材和工具
收藏学习资料
您现在的位置:&&>>&&>>&&>>&&>>&&>>&正文
深入理解用mysql_fetch_row()以数组的形式返回查询结果
同mysql_result()一样,mysql_fetch_row()也可以用来获取查询结果集,其区别在于函数的返回值不是一个字符串,而是一个数组。函数定义如下。. 代码如下:array mysql_fetch_row(int result) 参数说明如下。result:由函数mysql_query()或mysql_db_query()返回的结果标识,用来指定所要获取的数据的SQL语句类型。函数返回值如下。成功:一个数组,该数组包含了查询结果集中当前行数据信息,数组下标范围0~记录属性数−1,数组中的第i个元素值为该记录第i个属性上的值。失败:false。下面的mysql_fetch_row()使用示例功能同5.5.1中示例。. 代码如下:1
&!------使用mysql_fetch_row()来获取数据:mysql_fetch_row.php------&2
//连接并选择到数据库服务器4
$connection = mysql_connect ("localhost", "root", "password");5
mysql_select_db("Books", $connection);6
//查询数据7
$query="SELECT * FROM Computers ";8
$query.="WHERE price &= 20";9
//echo $query."&br&";10
$result=mysql_query($query,$connection);11
//用mysql_fetch_row()获得数据,并输出12
while($row=mysql_fetch_row($result))13
echo "书名:
".$row[1]."&br&";15
echo "价格:
".$row[2]."&br&";16
echo "出版日期:
".$row[3]."&br&";17
echo "&br&";18
?&mysql_fetch_row()获得当前行的数据信息,在被引用后,自动滑动至下一行。本例中在第12行对其的引用为:. 代码如下:while($row=mysql_fetch_row($result)) 在这个循环中,每一次mysql_fetch_row()都获得当前行数据,并赋值给数组$row,然后自动滑向下一行;在取出最后一行后,函数将返回false,循环结束。这样,就可以把结果集中的所有数据逐行取出并显示。注意mysql_fetch_row()返回结果数组的下标对应着不同属性上的值,且只能通过下标方式,而不能使用属性名方式获得属性上的值,在实际应用中容易引起混乱,一定要仔细使用。同时,应注意在使用中不要使用越界下标。示例正确运行的结果如下。. 代码如下:书名: 数据结构价格: 20出版日期: 书名: C语言价格: 23出版日期: 书名: PHP入门技术价格: 22出版日期:
转载请注明:破洛洛(谢谢合作)
上一篇文章: 下一篇文章:
网友评论:
[][][][][][][][][][]mysql存储过程&游标&&查询结果循环
Mysql的存储过程是从版本5才开始支持的,所以目前一般使用的都可以用到存储过程。今天分享下自己对于Mysql存储过程的认识与了解。
一些简单的调用以及语法规则这里就不在赘述,网上有许多例子。这里主要说说大家常用的游标加循环的嵌套使用。
首先先介绍循环的分类:
(1)WHILE ... END WHILE &
(2)LOOP ... END LOOP &
(3)REPEAT ... END REPEAT &
这里有三种标准的循环方式:WHILE循环,LOOP循环以及REPEAT循环。还有一种非标准的循环方式:GOTO(不做介绍)。&
(1)WHILE ... END WHILE &&
CREATE PROCEDURE p14() &
& DECLARE v INT; &
& SET v = 0; &
& WHILE v & 5 DO &
& & INSERT INTO t VALUES (v);
& & SET v = v + 1;
& END WHILE; &
这是WHILE循环的方式。它跟IF语句相似,使用"SET v =
0;"语句使为了防止一个常见的错误,如果没有初始化,默认变量值为NULL,而NULL和任何值操作结果都为NULL。
(2)REPEAT ... END REPEAT &
CREATE PROCEDURE p15 () &
& DECLARE v INT; &
& SET v = 0; &
& REPEAT &
& & INSERT INTO t VALUES (v);
& & SET v = v + 1;
& & UNTIL v &= 5
& END REPEAT; &
这是REPEAT循环的例子,功能和前面WHILE循环一样。区别在于它在执行后检查结果,而WHILE则是执行前检查。类似于do
while语句。注意到UNTIL语句后面没有分号,在这里可以不写分号,当然你加上额外的分号更好。&
(3)LOOP ... END LOOP & &
CREATE PROCEDURE p16 () &
& DECLARE v INT; &
& SET v = 0; &
& loop_label: LOOP &
& & INSERT INTO t VALUES (v);
& & SET v = v + 1;
& & IF v &= 5 THEN
& & & LEAVE
& & END IF;
& END LOOP; &
以上是LOOP循环的例子。LOOP循环不需要初始条件,这点和WHILE循环相似,同时它又和REPEAT循环一样也不需要结束条件。&
ITERATE 迭代
如果目标是ITERATE(迭代)语句的话,就必须用到LEAVE语句&
CREATE PROCEDURE p20 () &
& DECLARE v INT; &
& SET v = 0; &
& loop_label: LOOP &
& & IF v = 3 THEN
& & & SET v = v
& & & ITERATE
& & & END IF;
& & INSERT INTO t VALUES (v);
& & SET v = v + 1;
& & IF v &= 5 THEN
& & & LEAVE
& & & END IF;
& & END LOOP;
ITERATE(迭代)语句和LEAVE语句一样也是在循环内部的循环引用, 它有点像C语言中
的“Continue”,同样它可以出现在复合语句中,引用复合语句标号,ITERATE(迭代)意思
是重新开始复合语句。&
以上是对于循环的几种情况的介绍。接着就是介绍一个带游标的例子来详细解释。
declare p_feeCode varchar(20);
declare p_feeName varchar(20);
declare p_billMoney float(12);
declare p_schemeMoney float(12);
declare allMoney float(10);
declare allUsedMoney float(10);
declare p_year varchar(50);
declare p_totalCompeleteRate float(12);
declare done int(10);
& declare flag int(2);
declare feeCodeCursor cursor for select feeCode from
//申明一个游标变量
declare continue handler for not found set done=1;//申明循环结束的标志位
set done=0;
select date_format(now(),'%Y') into p_
open feeCodeC//打开游标
loop_label:LOOP
fetch feeCodeCursor into p_feeC//将游标插入申明的变量
if done = 1 then
leave loop_
set flag = 0;
set p_schemeMoney=0;
set p_billMoney = 0;
select feeName into p_feeName from fee where
feeCode=p_feeC
select sum(billMoney) into p_billMoney from bill_data where
feeCode=p_feeCode and billDate like Concat(p_year, '%');
select schemeMoney into p_schemeMoney from total_scheme where
feeCode=p_feeCode and schemeDate like Concat(p_year, '%')
if flag = 0 then
set done = 0;
if p_schemeMoney=0 then
set p_totalCompeleteRate=-1.0;
set p_totalCompeleteRate=(1.0*p_billMoney)/p_schemeM
insert into total_summary
values(p_feeCode,p_feeName,p_year,p_billMoney,p_totalCompeleteRate);
close feeCodeC//循环结束后需要关闭游标
以上只是一个简单的例子来说明如何使用,大家不需要关注具体业务逻辑,只需要关注的是其中标志位值的修改情况,已经循环何时离开。以及游标如何声明,如何使用,至于里面具体的操作和普通的sql语句没有太大区别。此处是用一层循环,至于复杂业务需要需要两层三层,可以继续用同样的方法继续嵌套。以下给出双层嵌套循环的,同样大家只需要关注嵌套结构即可。
declare p_projectID varchar(20);
declare p_projectName varchar(20);
declare p_feeCode varchar(20);
declare p_feeName varchar(20);
declare p_projectSchemeMoney float(10);
declare p_projectMoney float(10);
declare p_billMoney float(10);
declare p_year varchar(50);
declare p_projectFeeCompeleteRate float(10);
declare done1 int(10);
declare done2 int(10);
declare flag int(2);
declare feeCodeCursor cursor for select feeC
declare continue handler for not found set done1=1;
set done1=0;
select date_format(now(),'%Y') into p_
delete from project_fee_
open feeCodeC
repeat //第一层嵌套开始
fetch feeCodeCursor into p_feeC
select feeName into p_feeName from fee where
feeCode=p_feeC
if not done1 then
declare projectIDCursor cursor for select projectID from
declare continue handler for not found set done2 = 1;
set done2=0;
open projectIDC
loop_label:LOOP//第二层嵌套开始
fetch projectIDCursor into p_projectID;
select projectName into p_projectName from project where
projectID=p_projectID;
if done2 = 1 then
leave loop_
set flag = 0;
if not done2 then
set p_projectSchemeMoney=0;
select sum(billMoney) into p_billMoney from bill_data where
feeCode=p_feeCode and projectID=p_projectID and billDate like
Concat(p_year, '%');
select projectSchemeMoney into p_projectSchemeMoney from
project_scheme where feeCode=p_feeCode and
projectID=p_projectID;
if flag = 0 then
set done2 = 0;
if p_projectSchemeMoney=0 then
set p_projectFeeCompeleteRate=-1;
p_projectFeeCompeleteRate=(1.0*p_billMoney)/p_projectSchemeM
insert into project_fee_summary
values(p_feeCode,p_projectID,p_projectName,p_feeName,p_year,p_billMoney,p_projectFeeCompeleteRate,p_projectFeeCompeleteRate);
select sum(billMoney) into p_projectMoney from bill_data where
feeCode=p_feeCode and billDate like Concat(p_year, '%');
p_projectFeeCompeleteRate=(1.0*p_projectMoney)/p_projectSchemeM
insert into project_fee_summary
values(p_feeCode,"total","total",p_feeName,p_year,p_projectMoney,p_projectFeeCompeleteRate,p_projectFeeCompeleteRate);
close projectIDC
until done1&
close feeCodeC
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。php 除了while 还有什么办法循环输出从mysql里搜索得到的值_百度知道
php 除了while 还有什么办法循环输出从mysql里搜索得到的值
id&#39.$value[&#39. $value[' 'option&);;'&gt.&#39.($value['& $value){
$] ;'] ;'class_name&#39? ''] == $showdata[';/]: &#39.= ';&&ltforeach
具体用法你查下手册 贴一段我的代码给你foreach($major_classs as $i =&gt.';option value=&quot.'selected'major_class_id'id'
其他类似问题
while的相关知识
其他2条回答
能写个简单的实例吗
for,foreach
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁页面导航:
→ 正文内容
PHP_MySQL教程-第二天while循环与数据库操作第1/2页
第一页&while循环& 在这一课里,我们将会继续深入下去,使用PHP和MySQL来写出一些简单而有用的页面。我们从昨天创建的数据库开始,显示库中的数据,但是会再稍微加以润色。& 首先,我们用下面的代码来查询数据库内容。
代码如下:&html&& &body&& &?php& $db&=&mysql_connect("localhost",&"root");& mysql_select_db("mydb",$db);& $result&=&mysql_query("SELECT&*&FROM&employees",$db);& echo&"&table&border=1&n";& echo&"&tr&&td&姓名&/td&&td&职位&/td&&/tr&n";& while&($myrow&=&mysql_fetch_row($result))&{& &&&&printf("&tr&&td&%s&%s&/td&&td&%s&/td&&/tr&n",&$myrow[1],&$myrow[2],&$myrow[3]);& }& echo&"&/table&n";& ?&& &/body&& &/html&&&您可能已经注意到,我们在这个程序里加进了一些新东西。最明显的是while()循环。该循环是说,只要数据库里还有记录可读(使用mysql_fetch_row()函数),那就把该记录赋给变量$myrow,然后执行大括号({})内的指令。仔细看一下这里,这部分是比较重要的。& 我们应该注意一下mysql_fetch_row()函数。这里有一点小问题,它返回的是一个数组,必须以数组下标来访问其中的某个字段。第一个字段下标为0,第二个是1,依此类推。在执行某些复杂查询时,这么做简直实在是太烦琐了。& 现在我们更仔细地研究一下循环过程。程序前几行我们在第一课的例子中已经看到过了。然后,在while()循环中,我们从查询结果中读取一条记录并把该记录赋给数组$myrow。接着,我们用printf函数把数据中的内容显示在屏幕上。随后,循环反复执行,读取下一条记录赋给$myrow。这样继续下去,直到所有记录都已被读取完为止。& 使用while()循环的一个好处是,如果数据库查询没有返回任何记录,那您也不会收到错误信息。在刚执行循环语句时,循环条件就不满足,不会有任何数据赋给$myrow,程序就直接往下运行了。& 但是如果查询未返回任何数据,我们怎么让用户知道这一点呢?我们也许该提供点儿相关的消息给用户吧。这是可以做到的,下面我们就看看怎么做。&& 第二页&if-else& 请看下面的程序。
代码如下:&html&& &body&& &?php& $db&=&mysql_connect("localhost",&"root");& mysql_select_db("mydb",$db);& $result&=&mysql_query("SELECT&*&FROM&employees",$db);& if&($myrow&=&mysql_fetch_array($result))&{& &&echo&"&table&border=1&n";& &&echo&"&tr&&td&姓名&/td&&td&住址&/td&&/tr&n";& &&do&{& &&&&printf("&tr&&td&%s&%s&/td&&td&%s&/tr&n",&$myrow["first"],&& $myrow["last"],&$myrow["address"]);& &&}&while&($myrow&=&mysql_fetch_array($result));& &&&&echo&"&/table&n";& }&else&{& &&&&echo&"对不起,没有找到记录!";&&&&& }& ?&& &/body&& &/html&&&这段程序中包含有不少新内容,不过这些内容都相当简单。首先是mysql_fetch_array()函数。该函数与mysql_fetch_row()十分相近,只有一点不同:使用这个函数时,我们可以通过字段名而不是数组下标来访问它返回的字段,比如$myrow["first"]。这样我们就可以省不少力气了。另外,程序中还加进了do/while循环和if-else条件判定语句。& if-else条件判定语句的含意是,如果我们成功地把一条记录赋给了$myrow变量,那就继续;否则,就跳到else部分,执行那里的指令。& do/while循环是我们在上页中用户的while()循环的一个变体。我们要用到do/while的原因是:在最初的if语句中,我们已经把查询返回的第一条记录赋给变量$myrow了。如果这时我们执行一般的while循环(比如,while&($myrow&=&mysql_fetch_row($result)),那我们就会把第二条记录赋给$myrow,而第一条记录就被冲掉了。但是do/while循环可以让我们执行一次循环体内容之后再来判定循环条件。因此,我们就不会不小心漏掉第一条记录了。& 最后,如果查询结果没有任何记录的话,程序就会执行包含在else{}部分的那些语句。如果您想看到这部分程序的执行情况,可以把SQL语句改为SELECT&*&FROM&employees&WHERE&id=6,或改成其他形式,使得查询结果中没有任何记录。& 下面我们来扩充一下循环if-else&代码,使得页面内容更加丰富。相信您会喜欢的。 第三页&第一个程序脚本& 我们刚刚学到了循环语句,下面我们将在一个更加实际一点的例子中看看如何运用它。但是在这之前,您应该知道如何处理Web表格、查询参数串,以及表单的GET方法和POST方法。不久之前我们刚刚有文章介绍这部分内容,您如果对这一部分还不太熟悉的话可以看看那篇文章。& 现在,我们要处理查询参数串,正如您所知道的,有三种方法可以把参数内容写入到查询参数串中。第一种是在表格中使用GET方法;第二种是在浏览器的地址栏中输入网址时直接加上查询参数;第三种是把查询参数串嵌入到网页的超链接中,使得超链接的内容象下面这样:&a&href="http://my_machine/mypage.php3?id=1"&。我们现在要用到最后这一种方法。& 一开始,我们再来查询我们的数据库,列出员工姓名。看看下面的程序,其中大部分内容我们都已经很熟悉了。
代码如下:&html&& &body&& &?php& $db&=&mysql_connect("localhost",&"root");& mysql_select_db("mydb",$db);& $result&=&mysql_query("SELECT&*&FROM&employees",$db);& if&($myrow&=&mysql_fetch_array($result))&{& &&do&{& &&&&printf("&a&href="%s?id=%s"&%s&%s&/a&&br&n",&& &&&&$PATH_INFO,&$myrow["id"],&$myrow["first"],&$myrow["last"]);& &&}&while&($myrow&=&mysql_fetch_array($result));& }&else&{& &&echo&"对不起,没有找到记录!";&&&&& }& ?&& &/body&& &/html&&&这里没什么特别的,只是printf函数有些不同。那我们就来仔细研究一下。& 首先要注意的是,所有的引号前面都有一个反斜杠。这个反斜杠告诉PHP直接显示后面的字符,而不能把后面的字符当作程序代码来处理。另外要注意变量$PATH_INFO的用法。该变量在所用程序中都可以访问,是用来保存程序自身的名称与目录位置的。我们之所以用到它是因为要在页面中再调用这个程序本身。使用$PATH_INFO,我们可以做到,即使程序被挪到其他目录,甚至是其他机器上时,我们也能保证正确地调用到这个程序。& 正如我刚才提到的,程序所生成的网页,其中包含的超链接会再次调用程序本身。不过,再次调用时,会加入一些查询参数。& PHP见到查询参数串中包含有“名字=值”这样的成对格式时,会作一些特别的处理。它会自动生成一个变量,变量名称与取值都与查询参数串中所给定的名称和取值相同。这一功能使得我们可以在程序中判断出是第一次执行本程序还是第二次。我们所要做的只是问问PHP$id这个变量是否存在。& 当我知道这个问题的答案后,我可以在第二次调用程序时显示一些不同的结果出来。请看:
代码如下:&html&& &body&& &?php& $db&=&mysql_connect("localhost",&"root");& mysql_select_db("mydb",$db);& //&display&individual&record& //&显示单条记录内容& if&($id)&{& &&&$result&=&mysql_query("SELECT&*&FROM&employees&WHERE&id=$id",$db);& &&&$myrow&=&mysql_fetch_array($result);& &&&printf("名:&%sn&br&",&$myrow["first"]);& &&&printf("姓:&%sn&br&",&$myrow["last"]);& &&&printf("住址:&%sn&br&",&$myrow["address"]);& &&&printf("职位:&%sn&br&",&$myrow["position"]);& }&else&{& &&&&//&show&employee&list& &&&&//&显示员工列表& &&&$result&=&mysql_query("SELECT&*&FROM&employees",$db);& &&&&if&($myrow&=&mysql_fetch_array($result))&{& &&&&&&//&display&list&if&there&are&records&to&display& &&&&&&//&如果有记录,则显示列表& &&&&&&do&{& &&&&&&&&printf("&a&href="%s?id=%s"&%s&%s&/a&&br&n",&$PATH_INFO,&& &&&&&&&&$myrow["id"],&$myrow["first"],&$myrow["last"]);& &&&&&&}&while&($myrow&=&mysql_fetch_array($result));& &&&&}&else&{& &&&&&&//&no&records&to&display& &&&&&&//&没有记录可显示& &&&&&&echo&"对不起,没有找到记录!";&&&&& &&&&}& }& ?&& &/body&& &/html&&&程序开始变得复杂了,所以我在这里面加了注释,来解释一下到底发生了什么。您可以用//加入单行注释,或者用/*和*/来括住大段的注释。& 到这里,我们已经学会了第一个真正有用的PHP/MySQL脚本程序!现在,我们要看看怎样把Web表格加进来,并且向数据库发送数据。 第四页&向服务器发送数据& 现在我们从数据库读取数据已经没有太多困难了。但是怎么反过来向数据库发送数据呢?其实这不是PHP的问题。& 首选,我们创建一个带有简单表格的网页。
代码如下:&html&& &body&& &form&method="post"&action="&?php&echo&$PATH_INFO?&"&& 名:&input&type="Text"&name="first"&&br&姓:&input&type="Text"&name="last"&&br&住址:&input&type="Text"&name="address"&&br&职位:&input&type="Text"&name="position"&&br&&input&type="Submit"&name="submit"&value="输入信息"&& &/form&& &/body&& &/html&&&
当前1/2页&
您可能感兴趣的文章:
上一篇:下一篇:
最 近 更 新
热 点 排 行
12345678910
用游标,和WHILE可以遍历您的查询中的每一条记录并将要求的字段传给变量进行相应的处理
==================
@A1 VARCHAR(10),
@A2 VARCHAR(10),
DECLARE CURSOR YOUCURNAME FOR SELECT A1,A2,A3 FROM YOUTABLENAME
OPEN YOUCURNAME
fetch next from youcurname into @a1,@a2,@a3
while @@fetch_status&&-1
update … set
…-a3 where …
……您要执行的操作写在这里
fetch next from youcurname into @a1,@a2,@a3
close youcurname
deallocate youcurname
—————————————
在应用程序开发的时候,我们经常可能会遇到下面的应用,我们会通过查询数据表的记录集,循环每一条记录,通过每一条的记录集对另一张表进行数据进行操作,如插入与更新,我们现在假设有一个这样的业务:老师为所在班级的学生选课,选的课程如有哲学、马克思主义政治经济学、毛泽东思想概论、邓小平理论这些课,现在操作主要如下:
1) 先要查询这些还没有毕业的这些学生的名单,毕业过后的无法进行选课;
2) 在批量的选取学生的同时,还需要添加对应的某一门课程;
3) 点添加后选课结束。
数据量少可能看不出用Java程序直接多次进行数据库操作这种办法实现的弱点,因为它每次在操作数据库的时候,都存在着频繁的和数据库的I/O直接交互,这点性能的牺牲实属不应该,那我们就看下面的方法,通过存储过程的游标方法来实现:建立存储过程:
Create PROCEDURE P_InsertSubject
@SubjectId int
DECLARE rs CURSOR LOCAL SCROLL FOR
select studentid from student where StudentGradu = 1
FETCH NEXT FROM rs INTO @tempStudentID
WHILE @@FETCH_STATUS = 0
Insert SelSubject values (@SubjectId,@tempStudentID)
FETCH NEXT FROM rs INTO @tempStudentID
使用游标对记录集循环进行处理的时候一般操作如以下几个步骤:
1、把记录集传给游标;
2、打开游标
3、开始循环
4、从游标中取值
5、检查那一行被返回
7、关闭循环
8、关闭游标
上面这种方法在性能上面无疑已经是提高很多了,但我们也想到,在存储过程编写的时候,有时候我们尽量少的避免使用游标来进行操作,所以我们还可以对上面的存储过程进行改造,使用下面的方法来实现:
Create PROCEDURE P_InsertSubject
@SubjectId int
declare @i int,
@studentid
DECLARE @tCanStudent TABLE
studentid int
,FlagID TINYINT
insert @tCanStudent select studentid,0 from student where StudentGradu = 1
WHILE( @i&=1)
SELECT @studentid='’
SELECT TOP 1 @studentid = studentid FROM @tCanStudent WHERE flagID=0
SET @i=@@ROWCOUNT
IF @i&=0 GOTO Return_Lab
Insert SelSubject values (@SubjectId,@studentid)
IF @@error=0
UPDATE @tCanStudent SET flagID=1 WHERE studentid = @studentid
Return_Lab:
我们现在再来分析以上这个存储过程,它实现的方法是先把满足条件的记录集数据存放到一个表变量中,并且在这个表变量中增加一个FLAGID进行数据初始值为0的存放,然后去循环这个记录集,每循环一次,就把对应的FLAGID的值改成1,然后再根据循环来查找满足条件等于0的情况,可以看到,每循环一次,处理的记录集就会少一次,然后循环的往选好课程表里面插入,直到记录集的条数为0时停止循环,此时完成操作。
比较以上的几种循环方法的应用,就会知道,有时候可能对于同一种功能我们实现的方法不同,而最终应用程序性能的影响的差异就会很大,第二种、第三种就大大的减少的数据库交互I/O操作的频繁,会节省很多时间,方法三又避免用游标又可以节省不必要的开销。
使用SQL的Agent可以执行计划任务,把写好的SQL语句放在计划任务里,可以达到奇妙的效果,如定时备份数据,定时执行特定操作等等,当涉及循环操作很多条数据时,这里就要使用游标了,当然SQL中也有循环语句,如使用While。不过while的功能只能实现一般的操作,游标的功能更为强大些,可在一个指定的一个集合内循环操作数据,实现动态操作,那就更牛了,呵呵,以下资料供存档用。
设置重复执行 SQL 语句或语句块的条件。只要指定的条件为真,就重复执行语句。可以使用 BREAK 和 CONTINUE 关键字在循环内部控制 WHILE 循环中语句的执行。
WHILE Boolean_expression
&&&&& { sql_statement | statement_block }
&&&&& [ BREAK ]
&&&&& { sql_statement | statement_block }
&&&&& [ CONTINUE ]
Boolean_expression
返回 TRUE 或 FALSE 的表达式。如果布尔表达式中含有 SELECT 语句,必须用圆括号将 SELECT 语句括起来。
{sql_statement | statement_block}
Transact-SQL 语句或用语句块定义的语句分组。若要定义语句块,请使用控制流关键字 BEGIN 和 END。
导致从最内层的 WHILE 循环中退出。将执行出现在 END 关键字后面的任何语句,END 关键字为循环结束标记。
使 WHILE 循环重新开始执行,忽略 CONTINUE 关键字后的任何语句。
如果嵌套了两个或多个 WHILE 循环,内层的 BREAK 将导致退出到下一个外层循环。首先运行内层循环结束之后的所有语句,然后下一个外层循环重新开始执行。
declare @i int
while @i&30
insert into test (userid) values(@i)
set @i=@i+1
------------------------------------------------------------
while 条件
set @i=@i+1
A. 在嵌套的 IF...ELSE 和 WHILE 中使用 BREAK 和 CONTINUE
在下例中,如果平均价格少于 $30,WHILE 循环就将价格加倍,然后选择最高价。如果最高价少于或等于 $50,WHILE 循环重新启动并再次将价格加倍。该循环不断地将价格加倍直到最高价格超过 $50,然后退出 WHILE 循环并打印一条消息。
WHILE (SELECT AVG(price) FROM titles) & $30
&&&& UPDATE titles
&&&&&&& SET price = price * 2
&&&& SELECT MAX(price) FROM titles
&&&& IF (SELECT MAX(price) FROM titles) & $50
&&&&&&& BREAK
&&&&&&& CONTINUE
PRINT 'Too much for the market to bear'
B. 在带有游标的过程中使用 WHILE
以下的 WHILE 结构是名为 count_all_rows 过程中的一部分。下例中,该 WHILE 结构测试用于游标的函数 @@FETCH_STATUS 的返回值。因为 @@FETCH_STATUS 可能返回 –2、-1 或 0,所以,所有的情况都应进行测试。如果某一行在开始执行此存储过程以后从游标结果中删除,将跳过该行。成功提取 (0) 后将执行 BEGIN...END 循环内部的 SELECT 语句。
单变量循环
DECLARE tnames_cursor CURSOR
&&&& SELECT TABLE_NAME
&&&& FROM INFORMATION_SCHEMA.TABLES
OPEN tnames_cursor
DECLARE @tablename sysname
--SET @tablename = 'authors'
FETCH NEXT FROM tnames_cursor INTO @tablename
WHILE (@@FETCH_STATUS && -1)
&&&& IF (@@FETCH_STATUS && -2)
&&&& BEGIN&&&
&&&&&&& SELECT @tablename = RTRIM(@tablename)
&&&&&&& EXEC ('SELECT ''' + @tablename + ''' = count(*) FROM '
&&&&&&&&&&&&& + @tablename )
&&&&&&& PRINT ' '
&&&& FETCH NEXT FROM tnames_cursor INTO @tablename
CLOSE tnames_cursor
DEALLOCATE tnames_cursor
多变量循环
CREATE&&&&& PROCEDURE my_FeeCount& AS
declare& @到期时间&&&&& char(10)
declare& @片区&&&&&&&&& char(20)
declare& @缴费用户数 char(10)
declare& @sql& char(2000)
declare& cur_data& cursor& for
&select&& convert(varchar(10),到期时间,120)& as 到期时间 ,片区,count(distinct main_id) as& 缴费用户数
&from V_aipu_fee where 提交时间&=convert(varchar(10),getdate()-90,120) and 提交时间&convert(varchar(10),getdate()+1-90,120)
&and 收费类型='续费收费'
&Group&& by&& convert(varchar(10),到期时间,120),片区
&order&& by&& convert(varchar(10),到期时间,120)
open& cur_data
fetch& next& from& cur_data& into& @到期时间,@片区,@缴费用户数&
while(@@fetch_status& =& 0)
&&&&&&& set @sql='update '+RTRIM(@片区)+'实收='+RTRIM(@片区)+'实收+'+RTRIM(@缴费用户数)+' where 收费日期='''+RTRIM(@到期时间)+''''
&print @sql
&fetch& next& from& cur_data& into& @到期时间,@片区,@缴费用户数
close& cur_data
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:53686次
排名:千里之外
原创:27篇
转载:74篇
(1)(1)(1)(1)(1)(3)(4)(1)(6)(8)(2)(3)(1)(1)(6)(11)(9)(6)(1)(1)(8)(17)(6)(2)

我要回帖

更多关于 mysql while循环 的文章

 

随机推荐