jQuery技巧收集

没有评论

2010 年 10 月 11 日 at 下午 8:54分类:jQuery

1、关于页面元素的引用
通过jquery的$()引用元素包括通过id、class、元素名以及元素的层级关系及dom或者xpath条件等方法,且返回的对象为jquery对象(集合对象),不能直接调用dom定义的方法。

 

2、jQuery对象与dom对象的转换
只有jquery对象才能使用jquery定义的方法。注意dom对象和jquery对象是有区别的,调用方法时要注意操作的是dom对象还是jquery对象。
普通的dom对象一般可以通过$()转换成jquery对象。
如:$(document.getElementById(“msg”))则为jquery对象,可以使用jquery的方法。
由于jquery对象本身是一个集合。所以如果jquery对象要转换为dom对象则必须取出其中的某一项,一般可通过索引取出。
如:$(“#msg”)[0],$(“div”).eq(1)[0],$(“div”).get()[1],$(“td”)[5]这些都是dom对象,可以使用dom中的方法,但不能再使用Jquery的方法。
以下几种写法都是正确的:
$(“#msg”).html();
$(“#msg”)[0].innerHTML;
$(“#msg”).eq(0)[0].innerHTML;
$(“#msg”).get(0).innerHTML;

3、如何获取jQuery集合的某一项
对于获取的元素集合,获取其中的某一项(通过索引指定)可以使用eq或get(n)方法或者索引号获取,要注意,eq返回的是jquery对象,而get(n)和索引返回的是dom元素对象。对于jquery对象只能使用jquery的方法,而dom对象只能使用dom的方法,如要获取第三个<div>元素的内容。有如下两种方法:
$(“div”).eq(2).html();    //调用jquery对象的方法
$(“div”).get(2).innerHTML; //调用dom的方法属性

4、同一函数实现set和get
Jquery中的很多方法都是如此,主要包括如下几个:
$(“#msg”).html();    //返回id为msg的元素节点的html内容。
$(“#msg”).html(“<b>new content</b>”);
//将“<b>new content</b>” 作为html串写入id为msg的元素节点内容中,页面显示粗体的new content

$(“#msg”).text();    //返回id为msg的元素节点的文本内容。
$(“#msg”).text(“<b>new content</b>”);
//将“<b>new content</b>” 作为普通文本串写入id为msg的元素节点内容中,页面显示<b>new content</b>

$(“#msg”).height();    //返回id为msg的元素的高度
$(“#msg”).height(“300″);//将id为msg的元素的高度设为300
$(“#msg”).width();    //返回id为msg的元素的宽度
$(“#msg”).width(“300″); //将id为msg的元素的宽度设为300

$(“input”).val(“); //返回表单输入框的value值
$(“input”).val(“test”); //将表单输入框的value值设为test

$(“#msg”).click(); //触发id为msg的元素的单击事件
$(“#msg”).click(fn); //为id为msg的元素单击事件添加函数
同样blur,focus,select,submit事件都可以有着两种调用方法

5、集合处理功能
对于jquery返回的集合内容无需我们自己循环遍历并对每个对象分别做处理,jquery已经为我们提供的很方便的方法进行集合的处理。
包括两种形式:
$(“p”).each(function(i){this.style.color=['#f00','#0f0','#00f'][ i]})
//为索引分别为0,1,2的p元素分别设定不同的字体颜色。

$(“tr”).each(function(i){this.style.backgroundColor=['#ccc','#fff'][i%2]})
//实现表格的隔行换色效果

$(“p”).click(function(){alert($(this).html())})   
//为每个p元素增加了click事件,单击某个p元素则弹出其内容

6、扩展我们需要的功能
$.extend({
min: function(a, b){return a < b?a:b; },
max: function(a, b){return a > b?a:b; }
}); //为jquery扩展了min,max两个方法
使用扩展的方法(通过“$.方法名”调用):
alert(“a=10,b=20,max=”+$.max(10,20)+”,min=”+$.min(10,20));

7、支持方法的连写
所谓连写,即可以对一个jquery对象连续调用各种不同的方法。
例如:
$(“p”).click(function(){alert($(this).html())})
.mouseover(function(){alert(‘mouse over event’)})
.each(function(i){this.style.color=['#f00','#0f0','#00f'][ i ]});

8、操作元素的样式
主要包括以下几种方式:
$(“#msg”).css(“background”);    //返回元素的背景颜色
$(“#msg”).css(“background”,”#ccc”) //设定元素背景为灰色
$(“#msg”).height(300); $(“#msg”).width(“200″); //设定宽高
$(“#msg”).css({ color:”red”, background: “blue” });//以名值对的形式设定样式
$(“#msg”).addClass(“select”); //为元素增加名称为select的class
$(“#msg”).removeClass(“select”); //删除元素名称为select的class
$(“#msg”).toggleClass(“select”); //如果存在(不存在)就删除(添加)名称为select的class

9、完善的事件处理功能

Jquery已经为我们提供了各种事件处理方法,我们无需在html元素上直接写事件,而可以直接为通过jquery获取的对象添加事件。
如:
$(“#msg”).click(function(){alert(“good”)}) //为元素添加了单击事件
$(“p”).click(function(i){this.style.color=['#f00','#0f0','#00f'][ i]})
//为三个不同的p元素单击事件分别设定不同的处理
jQuery中几个自定义的事件:
(1)hover(fn1,fn2):一个模仿悬停事件(鼠标移动到一个对象上面及移出这个对象)的方法。当鼠标移动到一个匹配的元素上面时,会触发指定的第一个函数。当鼠标移出这个元素时,会触发指定的第二个函数。
//当鼠标放在表格的某行上时将class置为over,离开时置为out。
$(“tr”).hover(function(){
$(this).addClass(“over”);
},
function(){
$(this).addClass(“out”);
});
(2)ready(fn):当DOM载入就绪可以查询及操纵时绑定一个要执行的函数。
$(document).ready(function(){alert(“Load Success”)})
//页面加载完毕提示“Load Success”,相当于onload事件。与$(fn)等价
(3)toggle(evenFn,oddFn): 每次点击时切换要调用的函数。如果点击了一个匹配的元素,则触发指定的第一个函数,当再次点击同一元素时,则触发指定的第二个函数。随后的每次点击都重复对这两个函数的轮番调用。
//每次点击时轮换添加和删除名为selected的class。
$(“p”).toggle(function(){
   $(this).addClass(“selected”);
},function(){
   $(this).removeClass(“selected”);
});
(4)trigger(eventtype): 在每一个匹配的元素上触发某类事件。
例如:
$(“p”).trigger(“click”);    //触发所有p元素的click事件
(5)bind(eventtype,fn),unbind(eventtype): 事件的绑定与反绑定
从每一个匹配的元素中(添加)删除绑定的事件。
例如:
$(“p”).bind(“click”, function(){alert($(this).text());});//为每个p元素添加单击事件
$(“p”).unbind();//删除所有p元素上的所有事件
$(“p”).unbind(“click”) //删除所有p元素上的单击事件

 10、几个实用特效功能
其中toggle()和slidetoggle()方法提供了状态切换功能。
如toggle()方法包括了hide()和show()方法。
slideToggle()方法包括了slideDown()和slideUp方法。

11、几个有用的jQuery方法
$.browser.浏览器类型:检测浏览器类型。有效参数:safari, opera, msie, mozilla。如检测是否ie:$.browser.isie,是ie浏览器则返回true。
$.each(obj, fn):通用的迭代函数。可用于近似地迭代对象和数组(代替循环)。

$.each( [0,1,2], function(i, n){ alert( “Item #” + i + “: “+ n ); });
等价于:
var tempArr=[0,1,2];
for(var i=0;i<tempArr.length;i++){
alert(“Item #”+i+”: “+tempArr[ i ]);
}
也可以处理json数据,如
$.each( { name: “John”, lang: “JS” }, function(i, n){alert( “Name: ” + i + “, Value: ” + n ); });
结果为:
Name:name, Value:John
Name:lang, Value:JS
$.extend(target,prop1,propN):用一个或多个其他对象来扩展一个对象,返回这个被扩展的对象。这是jquery实现的继承方式。
如:
$.extend(settings, options);
//合并settings和options,并将合并结果返回settings中,相当于options继承setting并将继承结果保存在setting中。
var settings = $.extend({}, defaults, options);
//合并defaults和options,并将合并结果返回到setting中而不覆盖default内容。
可以有多个参数(合并多项并返回)
$.map(array, fn):数组映射。把一个数组中的项目(处理转换后)保存到到另一个新数组中,并返回生成的新数组。
如:
var tempArr=$.map( [0,1,2], function(i){ return i + 4; });
tempArr内容为:[4,5,6]
var tempArr=$.map( [0,1,2], function(i){ return i > 0 ? i + 1 : null; });
tempArr内容为:[2,3]
$.merge(arr1,arr2):合并两个数组并删除其中重复的项目。
如:$.merge( [0,1,2], [2,3,4] ) //返回[0,1,2,3,4]
$.trim(str):删除字符串两端的空白字符。
如:$.trim(“   hello, how are you? “);//返回”hello,how are you? ”

12、解决自定义方法或其他类库与jQuery的冲突
很多时候我们自己定义了$(id)方法来获取一个元素,或者其他的一些js类库如prototype也都定义了$方法,如果同时把这些内容放在一起就会引起变量方法定义冲突,Jquery对此专门提供了方法用于解决此问题。
使用jquery中的jQuery.noConflict();方法即可把变量$的控制权让渡给第一个实现它的那个库或之前自定义的$方法。之后应用Jquery的时候只要将所有的$换成jQuery即可,如原来引用对象方法$(“#msg”)改为jQuery(“#msg”)。
如:
jQuery.noConflict();
// 开始使用jQuery
jQuery(“div p”).hide();
// 使用其他库的 $()
$(“content”).style.display = ‘none’;

MySQL触发器学习笔记

没有评论

2010 年 10 月 11 日 at 下午 2:14分类:MySQL

触发器,顾名思义,就是当执行某个事件的时候触发另一个事件的执行!这个触发的时间分为BEFORE和AFTER两种,分别有before insert,before update,before delete和after insert,after update,after delete这六种情况

以下的文章主要向大家讲述的是MySQL触发器的实际使用详细说明与实际案例分析,同时本文也列举了一些在MySQL触发器的实际式操作中的代码,以下就是文章的详细内容介绍,望大家借鉴。原文地址:http://database.51cto.com/art/201005/200671.htm

FOR EACH ROW 子句通知触发器每隔一行执行一次动作,而不是对整个表,在触发器中我们经常会用到NEWOLD这两个关键字,在这里我还是先解释下这两个字的意思!其中NEW是指刚刚插入到数据库的数据表中的一个域,也可以理解为对象(object)的意思。比如在一个insert触发器中我用到了NEW那他的意思就是说,要使用刚刚插入到数据表的某个值,要使用具体的某一个值的话需要这样子写:NEW.字段名(NEW.username)这样子就获取到了刚刚插入到数据表中的一个字段的值!!OLD,OLD是在delete触发器中有用的,意思是说我要删除一条数据,但是在触发器中要用到之前的那个数据,那么我就可以通过OLD来获取了!比如我删除了一条数据,里面包含一个email,现在我在触发器的内部sql中要用就可以这样子写:OLD.email!

对于INSERT语句, 只有NEW是合法的;对于DELETE语句,只有OLD才合法;而UPDATE语句可以在
和NEW以及OLD同时使用

触发器案例
1.mysql> select * from a; +——+——+——+ | id | name | age | +——+——+——+ | 1 | A1 | 10 | | 2 | A2 | 20 | +——+——+——+ mysql> select * from b; +——+——+——+ | rid | id | age | +——+——+——+ | 5 | 2 | 20 | +——+——+——+  希望在表a的age字段更新的时候能够触发表b相应的age字段也更新:
如:

1.update a set ageage=age+1 where id=2; 
相关的表变为:
1.mysql> select * from a; +——+——+——+ | id | name | age | +——+——+——+ | 1 | A1 | 10 | | 2 | A2 | 21 | +——+——+——+ mysql> select * from b; +——+——+——+ | rid | id | age | +——+——+——+ | 5 | 2 | 21 | +——+——+——+ 正确的写法

触发器代码
1.CREATE TRIGGER bbs1 AFTER UPDATE ON a FOR EACH ROW update b set age=NEW.age where id=NEW.id;  MySQL触发器
触发器的概念:“在数据库中为响应一个特殊表格中的某些事件而自动执行的程序代码。”(Wikipedia)说得简单一些,它是在一个特殊的数据库事件,如INSERT或DELETE发生时,自动激活的一段代码。触发器可方便地用于日志记录、对单个表格到其他链接式表格进行自动的“层叠式”更改、或保证对表格关系进行自动更新。

当一个新整数值增加到数据库域中时,自动更新运行的总数的代码段是一个触发器。自动记录对一个特殊数据库表格所作更改的SQL命令块也是一个触发器实例。

触发器是MySQL 5.x的新功能,随着5.x代码树新版本的出现,这一功能也逐渐得到改善。在本文中,我将简单介绍如何定义并使用触发器,查看触发器状态,并如何在使用完毕后删除触发器。我还将为你展示一个触发器在现实世界中的应用实例,并检验它对数据库记录的改变。
例子
通过简单(虽然是人为的)实例来说明是了解MySQL触发器应用的最佳办法。首先我们建立两个单域的表格。一个表格中为姓名列表(表格名:data),另一个表格中是所插入字符的字符数(表格名:chars)。我希望在data表格中定义一个触发器,每次在其中插入一个新姓名时,chars表格中运行的总数就会根据新插入记录的字符数目进行自动更新。
1.mysql> CREATE TABLE data (name VARCHAR(255)); Query OK, 0 rows affected (0.09 sec) mysql> CREATE TABLE chars (count INT(10)); Query OK, 0 rows affected (0.07 sec) mysql> INSERT INTO chars (count) VALUES (0); Query OK, 1 row affected (0.00 sec) mysql> CREATE TRIGGER t1 AFTER INSERT ON data FOR EACH ROW UPDATE chars SET countcount = count + CHAR_LENGTH(NEW.name); Query OK, 0 rows affected (0.01 sec)  
理解上面代码的关键在于CREATE TRIGGER命令,它被用来定义一个新触发器。这个命令建立一个新触发器,假定的名称为t1,每次有一个新记录插入到data表格中时,t1就被激活。
在这个触发器中有两个重要的子句:
AFTER INSERT子句表明触发器在新记录插入data表格后激活。
UPDATE chars SET count = count + CHAR_LENGTH(NEW.name)子句表示触发器激活后执行的SQL命令。在本例中,该命令表明用新插入的data.name域的字符数来更新 chars.count栏。这一信息可通过内置的MySQL函数CHAR_LENGTH()获得。
放在源表格域名前面的NEW关键字也值得注意。这个关键字表明触发器应考虑域的new值(也就是说,刚被插入到域中的值)。MySQL还支持相应的OLD前缀,可用它来指域以前的值。
你可以通过调用SHOW TRIGGER命令来检查触发器是否被激活。
1.mysql> SHOW TRIGGERS; *************************** 1. row *************************** ?Trigger: t1 ?Event: INSERT ?Table: data Statement: UPDATE chars SET countcount = count + CHAR_LENGTH(NEW.name) Timing: AFTER ?Created: NULL ql_mode: 1 row in set (0.01 sec) 
激活触发器后,开始对它进行测试。试着在data表格中插入几个记录:
1.mysql> INSERT INTO data (name) VALUES (‘Sue’), (‘Jane’); Query OK, 2 rows affected (0.00 sec) Records: 2?Duplicates: 0?Warnings: 0
然后检查chars表格看MySQL触发器是否完成它该完成的任务:

1.mysql> SELECT * FROM chars; +——-+ | count | +——-+ | 7| +——-+ 1 row in set (0.00 sec)
如你所见,data表格中的INSERT命令激活触发器,它计算插入记录的字符数,并将结果存储在chars表格中。如果你往data表格中增加另外的记录,chars.count值也会相应增加。

触发器应用完毕后,可有DROP TRIGGER命令轻松删除它。
1.mysql> DROP TRIGGER t1; Query OK, 0 rows affected (0.00 sec)
注意:理想情况下,你还需要一个倒转触发器,每当一个记录从源表格中删除时,它从字符总数中减去记录的字符数。这很容易做到,你可以把它当作练习来完成。提示:应用BEFORE DELETE ON子句是其中一种方法。

自写(已测试)

1.mysql> create trigger t2 before delete on data for each row update chars set countcount=count-char_length(old.name); Query OK, 0 rows affected (0.03 sec)
现在,我想建立一个审计记录来追踪对这个表格所做的改变。这个记录将反映表格的每项改变,并向用户说明由谁做出改变以及改变的时间。我需要建立一个新表格来存储这一信息(表格名:audit),如下所示。(列表C)

列表C
1.mysql> CREATE TABLE audit (id INT(7), balance FLOAT, user VARCHAR(50) NOT NULL, time TIMESTAMP NOT NULL); Query OK, 0 rows affected (0.09 sec) mysql> create table accounts(id int(7),label VARCHAR(45),balance float);
接下来,我将在accounts表格中定义一个MySQL触发器。(列表D)

列表D
1.mysql> CREATE TRIGGER t3 AFTER UPDATE ON accounts FOR EACH ROW INSERT INTO audit (id, balance, user, time) VALUES (OLD.id, NEW.balance, CURRENT_USER(), NOW()); Query OK, 0 rows affected (0.04 sec)
如果你已经走到这一步,就很容易理解。accounts表格每经历一次UPDATE,触发器插入(INSERT)对应记录的id、新的余额、当前时间和登录audit表格的用户的名称。

实现中的例子:用触发器审计记录

既然你了解了触发器的基本原理,让我们来看一个稍稍复杂的例子。我们常用触发器来建立一个自动“审计记录”,以记录各种用户对数据库的更改。为了解审计记录的实际应用,请看下面的表格(表格名:accounts),它列出了一个用户的三个银行账户余额。(表A)
表A
1.mysql> SELECT * FROM accounts; +—-+————+———+ | id | label| balance | +—-+————+———+ |1 | Savings #1 |500 | |2 | Current #1 |2000 | |3 | Current #2 |3500 | +—-+————+———+ 3 rows in set (0.00 sec)
然后,检查触发器是否被激活:

1.mysql> SHOW TRIGGERS ; *************************** 1. row *************************** ?Trigger: t1 ?Event: UPDATE ?Table: accounts Statement: INSERT INTO audit (id, balance, user, time) VALUES (OLD.id, NEW.balance, CURRENT_USER(), NOW()) Timing: AFTER ?Created: NULL Sql_mode: 1 row in set (0.01 sec)
再来看最后的结果(列表E):

列表E
1.mysql> UPDATE accounts SET balance = 500 WHERE id = 1; Query OK, 1 row affected (0.00 sec) Rows matched: 1?Changed: 1?Warnings: 0 mysql> UPDATE accounts SET balance = 900 WHERE id = 3; Query OK, 1 row affected (0.01 sec) Rows matched: 1?Changed: 1?Warnings: 0 mysql> UPDATE accounts SET balance = 1900 WHERE id = 1; Query OK, 1 row affected (0.00 sec) Rows matched: 1?Changed: 1?Warnings: 0 
注意,对accounts表格所作的改变已被记录到audit表格中,将来如果出现问题,我们可以方便地从中进行恢复。

1.mysql> SELECT * FROM audit; +——+———+—————-+———————+ | id| balance | user| time| +——+———+—————-+———————+ |1 |500 | root@localhost | 2006-04-22 12:52:15 | |3 |900 | root@localhost | 2006-04-22 12:53:15 | |1 |1900 | root@localhost | 2006-04-22 12:53:23 | +——+———+—————-+———————+ 3 rows in set (0.00 sec) 
如上面的例子所示,MySQL触发器是一个强大的新功能,它大大增强了RDBMS的自动化程度。自己去试验,练习吧!

MySQL存储过程学习小笔记

没有评论

2010 年 10 月 11 日 at 上午 9:27分类:MySQL

由于工作的需要!最近一段时间又开始来温习一遍MySQL的存储过程,闲话不多说,直接进入正题!

一个存储过程包括名字,参数列表,以及可以包括很多SQL语句的SQL语句集。
在这里对局部变量,异常处理,循环控制和IF条件句有新的语法定义。
下面是一个包括存储过程的实例声明:
CREATE PROCEDURE procedure1                      /* name 存储过程名*/  
(IN parameter1 INTEGER)                              /* parameters 参数*/  
BEGIN                                                                  /* start of block 语句块头*/  
   DECLARE variable1 CHAR(10);                      /* variables变量声明  */      
    IF parameter1 = 17 THEN                              /* start of IF IF条件开始*/  
        SET variable1 = ‘birds’;                                /* assignment 赋值*/  
   ELSE  
        SET variable1 = ‘beasts’;                              /* assignment 赋值*/  
   END IF;                                                                  /* end of IF IF结束*/  
    INSERT INTO table1 VALUES (variable1);/* statement SQL语句*/  
END                                                                      /* end of block 语句块结束*/
  

我们要想查看当前数据库的版本,键下如下代码:

mysql> SELECT VERSION();  

现在我们需要一个分隔符,实现这个步骤的SQL语句如下
DELIMITER // 

我们创建存储过程用关键字CREATE PROCEDURE   如:

create procedure p1()

select * from count ;//

这样子我们就创建好了一个最简单的存储过程

条用存储过程用 call 关键字  例如我们要调用刚刚创建的存储过程:call p1();//就可以了!!!

创建一个存储过程获得随机数和时间

CREATE PROCEDURE p2 ()  
SELECT CURRENT_DATE, RAND() FROM count;//
  

结果如下:

+————–+—————–+  
| CURRENT_DATE | RAND() |  
+————–+—————–+  
| 2004-11-09      | 0.7822275075896 |  
+————–+—————–+  
1 row in set (0.26 sec)  
Query OK, 0 rows affected (0.26 sec) 

——————————————————————->

传入参数的例子:mysql> CREATE PROCEDURE p5(p INT) SET @x = p //  
Query OK, 0 rows affected (0.00 sec)  
mysql> CALL p5(12345)//  
Query OK, 0 rows affected (0.00 sec)  
mysql> SELECT @x//  
+——-+  
| @x        |  
+——-+  
| 12345 |  
+——-+  
1 row in set (0.00 sec)

——————————————————————->

传出参数的例子:mysql> CREATE PROCEDURE p6 (OUT p INT)  
        -> SET p = -5 //  
mysql> CALL p6(@y)//  
mysql> SELECT @y//  
+——+  
| @y      |  
+——+  
| -5      |  
+——+  

——————————————————————->

复合语句的使用:CREATE PROCEDURE p7 ()  
BEGIN  
    SET @a = 5;  
    SET @b = 5;  
    INSERT INTO t VALUES (@a);  
    SELECT s1 * @a FROM t WHERE s1 >= @b;  
END; //         

——————————————————————->

变量的使用:CREATE PROCEDURE p8 ()  
BEGIN  
   DECLARE a INT;  
   DECLARE b INT;  
    SET a = 5;  
    SET b = 5;  
    INSERT INTO t VALUES (a);  
    SELECT s1 * a FROM t WHERE s1 >= b;  
END; //     

——————————————————————->

有默认参数值的语句:CREATE PROCEDURE p10 ()  
BEGIN  
   DECLARE a, b INT DEFAULT 5;  
    INSERT INTO t VALUES (a);  
    SELECT s1 * a FROM t WHERE s1 >= b;  
END; //       

——————————————————————->    

作用域的问题:CREATE PROCEDURE p11 ()  
BEGIN  
   DECLARE x1 CHAR(5) DEFAULT ‘outer’;  
   BEGIN  
       DECLARE x1 CHAR(5) DEFAULT ‘inner’;  
        SELECT x1;  
       END;  
    SELECT x1;  
   END; //   输出:mysql> CALL p11()//  
+——-+  
| x1        |  
+——-+  
| inner |  
+——-+  
+——-+  
| x1        |  
+——-+  
| outer |  
+——-+  

——————————————————————->

包含条件的多条语句:CREATE PROCEDURE p12 (IN parameter1 INT)  
BEGIN  
   DECLARE variable1 INT;  
    SET variable1 = parameter1 + 1;  
    IF variable1 = 0 THEN  
        INSERT INTO t VALUES (17);  
   END IF;  
    IF parameter1 = 0 THEN  
       UPDATE t SET s1 = s1 + 1;  
   ELSE  
       UPDATE t SET s1 = s1 + 2;  
   END IF;  
END; // 

——————————————————————->
case指令:CREATE PROCEDURE p13 (IN parameter1 INT)  
BEGIN  
   DECLARE variable1 INT;  
    SET variable1 = parameter1 + 1;  
   CASE variable1  
       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; //  

——————————————————————->

WHILE … END WHILE循环语句:CREATE PROCEDURE p14 ()  
BEGIN  
   DECLARE v INT;  
    SET v = 0;  
   WHILE v < 5 DO  
        INSERT INTO t VALUES (v);  
        SET v = v + 1;  
   END WHILE;  
END; //  

——————————————————————->

REPEAT … END REPEAT指令:CREATE PROCEDURE p15 ()  
BEGIN  
   DECLARE v INT;  
    SET v = 0;  
   REPEAT  
        INSERT INTO t VALUES (v);  
        SET v = v + 1;  
       UNTIL v >= 5  
   END REPEAT;  
END; //

——————————————————————->

LOOP … END LOOP   指令: CREATE PROCEDURE p16 ()  
BEGIN  
   DECLARE v INT;  
    SET v = 0;  
    loop_label: LOOP  
        INSERT INTO t VALUES (v);  
        SET v = v + 1;  
        IF v >= 5 THEN  
            LEAVE loop_label;  
       END IF;  
   END LOOP;  
END; //