存储过程或函数中的查询有时会返回多条记录,而使用简单的SELECT语句,没有办法得到第一行、下一行或前十行的数据,这时可以用游标来逐条读取查询结果集中的记录。
1、游标
游标:用来依次取出查询结果集中的每一条数据一一逐条读取查询结果集中的记录。
1、游标的使用步骤:
- 1、1声明游标语法:
declare 游标名 cursor FOR select查询语句;
实例:declare my_cursor cursor FOR select book_name.book_author,book_price from books; - 1、2 声明游标:主要用来给游标命名并且使得游标关联一个查询。
具体语句:
DECLARE CURSOR stunames [(parameter_name,dataTYPE,...)] IS SELECT s.sname FROM student s ; stuname student.sname%TYPE;
语法说明:
CURSOR : 声明游标关键字;
stunames: 游标的名字 ;
parameter_name: 参数名称;
dataTYPE: 参数类型;
SELECT s.sname FROM student s:游标关联的SELECT语句,但该语句不能是SELECT....INTO ...语句
2、打开游标:open 游标名
实例:open my_cursor
3、使用游标:提取游标当前指向的记录(提取之后,游标自动下移)
FETCH 游标名 INTO bname,bauthor,bprice;
实例:FETCH my_cursor INTO bname,bauthor,bprice;
4、关闭游标:colse 游标名
实例:close my_cursor
--语法:DECLARE cursor_name CURSOR FOR select_statement;
mysql> DELIMITER //
mysql> CREATE PROCEDURE processnames()
-> BEGIN
-> DECLARE nameCursor CURSOR --cursor_name :nameCursor 游标名
-> FOR
-> SELECT name FROM tb_student; ---select_statement表示select语句,可以返回一行或多行数据
-> END//
Query OK, 0 rows affected (0.07 sec)
mysql> DELIMITER //
mysql> CREATE PROCEDURE test_cursor (in param INT(10),out result VARCHAR(90))
-> BEGIN
-> DECLARE name VARCHAR(20);
-> DECLARE pass VARCHAR(20);
-> DECLARE done INT;
-> DECLARE cur_test CURSOR FOR SELECT user_name,user_pass FROM users; ---声明游标,定义游标参数变量
-> DECLARE continue handler FOR SQLSTATE '02000' SET done = 1;
-> IF param THEN INTO result FROM users WHERE id = param;
-> ELSE
-> OPEN cur_test; ---------------打开游标
-> repeat
-> FETCH cur_test into name,pass; -----------使用游标:将游标cur_test中SELECT语句的执行结果保存到参数变量name,pass中。变量参数必须在游标使用之前进行定义。
-> SELECT concat_ws(',',result,name,pass) INTO result;
-> until done
-> END repeat;
-> CLOSE cur_test; -----------关闭游标
-> END IF;
-> END //
Query OK, 0 rows affected (0.10 sec)
mysql> call test_cursor(3,@test)//
Query OK, 1 row affected (0.03 sec)
mysql> select @test//
+-----------+
| @test |
+-----------+
| ling,ling123 |
+-----------+
1 row in set (0.00 sec)










网友评论