mysql>delimiter //
mysql>
mysql>CREATE PROCEDURE curdemo(IN V_GROUP INT)
->BEGIN
-> DECLARE done INT DEFAULT 0
-> DECLARE a INT
-> DECLARE b CHAR(16)
->
-> DECLARE cur1 CURSOR FOR SELECT id,name FROM student where classid=V_GROUP
-> DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1
->
-> OPEN cur1
->
-> REPEAT
->FETCH cur1 INTO a, b
->select a,b
-> UNTIL done END REPEAT
->
-> CLOSE cur1
->END
->
->
->//
Query OK, 0 rows affected (0.20 sec)
mysql>
mysql>delimiter
mysql>
mysql> SELECT id,name,classid FROM student
+----------+--------+---------+
| id | name | classid |
+----------+--------+---------+
| 91010101 | 丁乙甲 | 10101 |
| 91010102 | 索春龙 | 10101 |
| 91010103 | 刘莉莉 | 10101 |
| 91010104 | 隋鑫 | 10101 |
| 91010105 | 长命 | 10101 |
| 91010201 | 河江山 | 10102 |
| 91010202 | 祝立业 | 10102 |
| 91010203 | 姚桂娇 | 10102 |
| 91010204 | 张冬梅 | 10102 |
| 91020101 | 蒋旭 | 10201 |
| 91020102 | 邱介臣 | 10201 |
| 91020103 | 王晓燕 | 10201 |
| 91020104 | 夏丽佳 | 10201 |
| 91020201 | 熊建业 | 10202 |
| 91020202 | 丛俊江 | 10202 |
| 91020203 | 周静燕 | 10202 |
| 91020204 | 黄爽 | 10202 |
| 91020301 | 魏国兴 | 10203 |
| 91020302 | 蒋洪涛 | 10203 |
| 91020303 | 倪春红 | 10203 |
| 91030101 | 张文天 | 10301 |
| 91030102 | 姜洋 | 10301 |
| 91030103 | 赵聪 | 10301 |
| 91030201 | 王飞 | 10302 |
+----------+--------+---------+
24 rows in set (0.00 sec)
mysql>
mysql>CALL curdemo(10101)
+----------+--------+
| a| b |
+----------+--------+
| 91010101 | 丁乙甲 |
+----------+--------+
1 row in set (0.00 sec)
+----------+--------+
| a| b |
+----------+--------+
| 91010102 | 索春龙 |
+----------+--------+
1 row in set (0.00 sec)
+----------+--------+
| a| b |
+----------+--------+
| 91010103 | 刘莉莉 |
+----------+--------+
1 row in set (0.00 sec)
+----------+------+
| a| b|
+----------+------+
| 91010104 | 隋鑫 |
+----------+------+
1 row in set (0.00 sec)
+----------+------+
| a| b|
+----------+------+
| 91010105 | 长命 |
+----------+------+
1 row in set (0.00 sec)
+----------+------+
| a| b|
+----------+------+
| 91010105 | 长命 |
+----------+------+
1 row in set (0.00 sec)
Query OK, 0 rows affected (0.00 sec)
mysql>
有两种方法,一种方法使用mysql的check table和repair table 的sql语句,另一种方法是使用MySQL提供的多个myisamchk, isamchk数据检测恢复工具。前者使用起来比较简便。推荐使用。1. check table 和 repair table
登陆mysql 终端:
mysql -uxxxxx -p dbname
check table tabTest
如果出现的结果说Status是OK,则不用修复,如果有Error,可以用:
repair table tabTest
进行修复,修复之后可以在用check table命令来进行检查。在新版本的phpMyAdmin里面也可以使用check/repair的功能。
2. myisamchk, isamchk
其中myisamchk适用于MYISAM类型的数据表,而isamchk适用于ISAM类型的数据表。这两条命令的主要参数相同,一般新的系统都使用MYISAM作为缺省的数据表类型,这里以myisamchk为例子进行说明。当发现某个数据表出现问题时可以使用:
myisamchk tablename.MYI
进行检测,如果需要修复的话,可以使用:
myisamchk -of tablename.MYI
关于myisamchk的详细参数说明,可以参见它的使用帮助。需要注意的时在进行修改时必须确保MySQL服务器没有访问这个数据表,保险的情况下是最好在进行检测时把MySQL服务器Shutdown掉。
MySQL 存储过程中,使用游标查询,返回的是结果集时,如何查看调用存储过程输出结果呢?解决方案:存储过程不返回数据,但它能创建和填充另一个表。所以在存储过程运行中创建临时表。该临时表将保存存储过程中生成的结果集,在遍历游标时,用insert保存每条数据到临时表中。后续调用时可以用select语句查询临时表中的存储过程运行结果。
以下有 三种方式 使用游标创建一个存储过程,统计某一部门下的员工信息
方法一:Loop循环
调用存储过程:
方法二:While 循环
调用存储过程:
方法三:REPEAT 循环
调用存储过程:
上述三种实现方法在测试过程中遇到下述问题。
调用存储过程查询临时表输出结果时,会发现多循环了一次,像这样:
解决方法:
在遍历游标查询结果时,先判断游标的结束标志(done) 是否是为1,如果不是1,则向临时表中插入数据。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)