MySQL存储过程使用一个实例详细的解决方案
复制代码代码如下所示:
$分隔符
如果程序存在getuserinfo美元下跌
创建程序getuserinfo(在date_day DateTime)
—
一个例子
-存储过程命名为:getuserinfo
该参数是:date_day日期格式:2008-03-08
—
开始
声明_username varchar(12);-用户名
声明_chinese int;语言
声明_math int;数学
声明完成;
-光标的定义
声明rs_cursor光标选择用户名,中文,数学,DateDiff从用户信息。
声明未找到的已完成集= 1的继续处理程序;
-得到昨天的日期
如果date_day为null,然后
集date_day = date_add(现在),间隔(1天);
最后如果;
打开rs_cursor;
cursor_loop:环
取rs_cursor为_username,_chinese,_math;以数据
如果做= 1然后
离开cursor_loop;
最后如果;
更新表
更新infosum集总= _chinese + _math么= _username;
循环结束cursor_loop;
rs_cursor关闭;
结束美元
分隔符;
例2。存储过程游标循环跳转出现。
MySQL存储过程中,光标的操作需要执行一个操作的血。众所周知,MySQL中的游标循环操作通常使用三种方式:循环、重复和。三环。用同样的方法。它以前从未使用过,所以记下来是为了方便。
1.repeat
复制代码代码如下所示:
重复
声明;
直到表达
末端重复
演示
声明数字;
声明my_string varchar(255);
重复
集my_string = concat(my_string,num,',');
设置数字= 1;
直到数字< 5
末端重复;
2.while
复制代码代码如下所示:
而表达
声明;
结束的时候
演示
声明数字;
声明my_string varchar(255);
设置数字= 1;
设置;
而民10do
集my_string = concat(my_string,num,',');
设置数字= 1;
结束的时候;
3.loop(有一个很重要的迭代,离开它)
代码遵循复制代码如下所示
声明数字;
申报STR varchar(255);
设置数字= 1;
集my_string =;
loop_label:环
如果num < 10then
离开loop_label;
endif;
设置数字= 1;
如果(Num MOD3)然后
迭代loop_label;
其他的
集my_string = concat(my_string,num,',');
ENDIF;
结束循环;
PS:能理解迭代是继续我们常用的程序,和迭代是打破的。当然,在mysql存储过程中,我们需要在循环结构中有一个名字,其余的都是一样的。
示例3,在MySQL存储过程中使用多个游标
首先创建一个表,插入一些测试数据:
复制代码代码如下所示:
如果表中存在netingcn_proc_test滴;
创建表(` netingcn_proc_test `
` ID `整数(11)不为空auto_increment,
`名字` varchar(20),
`密码` varchar(20),
主键(id)
InnoDB引擎=);
插入netingcn_proc_test(名称、密码)值
('procedure1 ','pass1),
('procedure2 ','pass2),
('procedure3 ','pass3),
('procedure4 ','pass4);下面是一个简单的存储过程实例:
如果程序存在test_proc滴;
分隔符
创建程序test_proc()
开始
-声明一个标志,以确定游标是否经过或未完成。
声明默认值为0;
-声明一个变量来存储从游标中提取的数据
-特别注意的名称的情况下,不能与在游标中使用的相同,否则所获得的数据是空的。
申报tname varchar(50)默认为空;
DECLARE tpass varchar (50) DEFAULT NULL;
-声明与游标对应的SQL语句
声明当前游标
选择名称,密码netingcn_proc_test;
-在光标循环结束时,完成将设置为1。
声明未找到的已完成集= 1的继续处理程序;
执行查询
开放课程;
-遍历光标的每一行
重复
-将一行信息存储在相应的变量中
接电流为tname,tpass;
如果不这样做
在这里你可以使用tname的信息,tpass
选择tpass tname;
最后如果;
直到完成结束重复;
关闭当前;
终点
Delimiter;
-执行存储过程
电话test_proc();
应当注意的是,变量声明、游标声明和处理程序声明的顺序不能弄错。我们必须首先声明变量,再次声明游标,最后声明处理程序。如果我们想使用两个或多个游标,这非常简单。让我们来谈谈如何使用两件事:
复制代码代码如下所示:
如果存在test_proc_1下降过程;
分隔符
创建程序test_proc_1()
开始
声明默认值为0;
申报的TID int(11)默认0;
申报tname varchar(50)默认为空;
声明tpass varchar(50)默认为空;
声明cur_1光标
选择名称,密码netingcn_proc_test;
声明cur_2光标
选择ID,名字从netingcn_proc_test;
声明未找到的已完成集= 1的继续处理程序;
打开cur_1;
重复
取cur_1为tname,tpass;
如果不这样做
选择tpass tname;
最后如果;
直到完成结束重复;
近cur_1;
-注意这里所做的值必须重置为0。
设置完成= 0;
打开cur_2;
重复
取cur_2为tid,tname;
如果不这样做
选择tid,tname;
最后如果;
直到完成结束重复;
近cur_2;
终点
/ /
Delimiter;
电话test_proc_1();
上面的代码中,作为第一个例子一样,是一个指针的声明和遍历游标。需要注意的是,设置完成= 0使用之前经过二游标的重要,因为当第一个指针遍历其价值是通过句柄设置为1,如果0没有设定,然后二游标不会走过。当然,好的习惯是每一个打开的游标操作前使用此语句,以确保光标可以真正走过。当然,你也可以使用开始块嵌套的方式来处理多个游标,如:
复制代码代码如下所示:
如果存在test_proc_2下降过程;
分隔符
创建程序test_proc_2()
开始
声明默认值为0;
申报tname varchar(50)默认为空;
声明tpass varchar(50)默认为空;
声明cur_1光标
选择名称,密码netingcn_proc_test;
声明cur_2光标
选择ID,名字从netingcn_proc_test;
声明未找到的已完成集= 1的继续处理程序;
打开cur_1;
重复
取cur_1为tname,tpass;
如果不这样做
选择tpass tname;
最后如果;
直到完成结束重复;
近cur_1;
开始
声明默认值为0;
申报的TID int(11)默认0;
申报tname varchar(50)默认为空;
声明cur_2光标
选择ID,名字从netingcn_proc_test;
声明未找到的已完成集= 1的继续处理程序;
打开cur_2;
重复
取cur_2为tid,tname;
如果不这样做
选择tid,tname;
最后如果;
直到完成结束重复;
近cur_2;
结束;
终点
/ /
Delimiter;
电话test_proc_2();