mysql存储过程问题
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了mysql存储过程问题相关的知识,希望对你有一定的参考价值。
背景
最近做到搜索功能,很是头疼。mysql全文索引折腾的不轻,最后也没怎么明白。然后就着顺便看了一看函数和存储过程编程。本来是上过数据库这门课,但是老师讲的终究是浅显,用起来才发现每一门课都像一座冰山,知道的只是一角。。。。慢慢摸索吧。于此总结一下存储过程编写过程遇到的问题。
问题1:加上@符号的变量是什么?
mysql中前面有@符的变量,形如:@a , 表示的是一个全局变量,一个过程中进行定义赋值,其他过程可以直接使用。相对来说对于普通的变量,则属于局部变量,只能在本身过程中使用。
问题2:过程中只能返回一个结果集,如果想返回多个结果集怎么办? 首先说一下返回单个结果集:
delimiter // create procedure `test`(out str varchar(20)) begin select bookName into str from books limit 1; end // delimiter ;
通过select into 可以将单个结果集返回给变量,但是对于多个结果集是行不通的。只能使用游标。
有了游标,这问题就多了。。。。
游标的定义:
CREATE PROCEDURE `test` () BEGIN -- 需要定义接收游标数据的变量,类型于游标内容类型一致 DECLARE a CHAR(10); -- 遍历数据结束标志 DECLARE ending INT DEFAULT FALSE; -- 游标 DECLARE cur CURSOR FOR SELECT i FROM tablename; -- 将结束标志绑定到游标 DECLARE CONTINUE HANDLER FOR NOT FOUND SET ending = TRUE; -- 打开游标 OPEN cur; --使用游标代码 --关闭游标 CLOSE cur; END
值得注意的一点是其中的declare顺序不可改变,即其他变量声明放在最前,游标及结束绑定的声明要放在后边,而且声明前不可有其他类型语句,否则会有符号错误。
游标使用的方法:
REPEAT --游标储存一列 FETCH cur INTO a; --游标储存多列 FETCH cur INTO a,b·····; UNTIL ending END REPEAT ;
关于结束标志:
结束标志是先通过一个FETCH INTO ,然后判断游标中是否还存在内容,如果没有内容就会执行 SET ending = TRUE; (定义代码中的),然后通过ending的判断即可跳出循环。
以上是关于mysql存储过程问题的主要内容,如果未能解决你的问题,请参考以下文章