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存储过程问题的主要内容,如果未能解决你的问题,请参考以下文章

如何从 PHP 代码中调用 MySQL 存储过程?

如何从 PHP 代码中调用 MySQL 存储过程?

如何从 PHP 代码中调用 MySQL 存储过程?

PHP MySQL - 为啥存储过程调用在 PHP 代码中意外结束

mysql 存储过程 出现unknown column

Mysql存储过程导出