mysql存储过程里怎么循环一张表

fihuang 2011-05-06 06:13:28
我想循环一张表,每循环到一条数据,就取出相应的字段值赋给变量,做别的一些操作。求一个完整的例子包括声明变量。
比如一张表t_user:ID, name, age, sex.
谢谢!
...全文
692 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
NewSilen 2011-05-07
  • 打赏
  • 举报
回复
使用游标 声明游标的时候你会查出一个数据集,你需要定义一些变量,在fetch的时候循环将数据集当前行的各个字段的值付给变量,然后操作这些变量即可
ACMAIN_CHM 2011-05-06
  • 打赏
  • 举报
回复
使用游标即可。

参考手册中的例子如下 。

[Quote]
20.2.11. 光标
20.2.11.1.声明光标

20.2.11.2. 光标OPEN语句

20.2.11.3. 光标FETCH语句

20.2.11.4. 光标CLOSE语句

简单光标在存储程序和函数内被支持。语法如同在嵌入的SQL中。光标当前是不敏感的,只读的及不滚动的。不敏感意为服务器可以活不可以复制它的结果表。

光标必须在声明处理程序之前被声明,并且变量和条件必须在声明光标或处理程序之前被声明。

例如:

CREATE PROCEDURE curdemo()
BEGIN
DECLARE done INT DEFAULT 0;
DECLARE a CHAR(16);
DECLARE b,c INT;
DECLARE cur1 CURSOR FOR SELECT id,data FROM test.t1;
DECLARE cur2 CURSOR FOR SELECT i FROM test.t2;
DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done = 1;

OPEN cur1;
OPEN cur2;

REPEAT
FETCH cur1 INTO a, b;
FETCH cur2 INTO c;
IF NOT done THEN
IF b < c THEN
INSERT INTO test.t3 VALUES (a,b);
ELSE
INSERT INTO test.t3 VALUES (a,c);
END IF;
END IF;
UNTIL done END REPEAT;

CLOSE cur1;
CLOSE cur2;
END
20.2.11.1.声明光标
DECLARE cursor_name CURSOR FOR select_statement
这个语句声明一个光标。也可以在子程序中定义多个光标,但是一个块中的每一个光标必须有唯一的名字。

SELECT语句不能有INTO子句。

20.2.11.2. 光标OPEN语句
OPEN cursor_name
这个语句打开先前声明的光标。

20.2.11.3. 光标FETCH语句
FETCH cursor_name INTO var_name [, var_name] ...
这个语句用指定的打开光标读取下一行(如果有下一行的话),并且前进光标指针。

20.2.11.4. 光标CLOSE语句
CLOSE cursor_name
这个语句关闭先前打开的光标。

[/Quote]
回南山种豆 2011-05-06
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 z1988316 的回复:]
这里假定你取一个字段 如果多个字段照做

create procedure mypro( INOUT name )
as begin
declare tmp boolen default true;
declare mycursor cursor for
select name from T ;
declare continue handler for not found
……
[/Quote]

tmp 改为found
回南山种豆 2011-05-06
  • 打赏
  • 举报
回复
这里假定你取一个字段 如果多个字段照做

create procedure mypro( INOUT name )
as begin
declare tmp boolen default true;
declare mycursor cursor for
select name from T ;
declare continue handler for not found
set found=false ;
open mycursor;
fetch mycursor into name;
while found
do
fetch mycursor into name;
end while
close mycursor
end




cllan_jim 2011-05-06
  • 打赏
  • 举报
回复
游标。。。。
rucypli 2011-05-06
  • 打赏
  • 举报
回复
游标。。。。

56,682

社区成员

发帖
与我相关
我的任务
社区描述
MySQL相关内容讨论专区
社区管理员
  • MySQL
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧