MySql存储进程总计

MySQL5.5存储过程支持limit变量

     
之前总是在MSSQL上写存储过程,没有在MYSQL上写过,也基本没有用过,今天需要用到MYSQL,研究了下,把项目的需要的存储过程写了一部分,写一下工作总结。这里没有给出数据库结构,不讨论SQL语句的细节,主要探讨存储过程语法,适合有基础的人。

     
之前总是在MSSQL上写存储过程,没有在MYSQL上写过,也基本没有用过,今天需要用到MYSQL,研究了下,把项目的需要的存储过程写了一部分,写一下工作总结。这里没有给出数据库结构,不讨论SQL语句的细节,主要探讨存储过程语法,适合有基础的人。

在审核开发的SQL时,发现有个存储过程他们是用动态SQL(CONCAT()函数)拼凑的,这样性能没有静态SQL好,于是让他们更改,结果他们说创建存储过程报错,我很纳闷,不应该啊,我这边没问题,结果咨询了那边,测试环境是用的MySQL5.1,而我这边是MySQL5.5,版本的问题。

 发表地址:

 发表地址:

下面我做了一个测试,这个是MySQL5.1的,如图:
图片 1

#查询文章回复
-- ----------------------------
-- Procedure structure for `sp_select_reply_article`
-- ----------------------------
DROP PROCEDURE IF EXISTS `sp_select_reply_article`;
DELIMITER ;;
CREATE DEFINER=`root`@`localhost` PROCEDURE `sp_select_reply_article`(IN `ra_id` int,IN `pagefrom` int,IN `pagesize` int)
BEGIN
         #Routine body goes here...
         SET @ra_id = ra_id;
         SET @pagefrom = pagefrom;
         SET @pagesize = pagesize;
         SET @ssra = CONCAT('SELECT * FROM gk_article WHERE id = ? LIMIT ?,?');
         PREPARE sqlquery FROM @ssra;
         EXECUTE sqlquery USING @ra_id,@pagefrom,@pagesize;
END
;;
DELIMITER ;
#查询文章回复
-- ----------------------------
-- Procedure structure for `sp_select_reply_article`
-- ----------------------------
DROP PROCEDURE IF EXISTS `sp_select_reply_article`;
DELIMITER ;;
CREATE DEFINER=`root`@`localhost` PROCEDURE `sp_select_reply_article`(IN `ra_id` int,IN `pagefrom` int,IN `pagesize` int)
BEGIN
         #Routine body goes here...
         SET @ra_id = ra_id;
         SET @pagefrom = pagefrom;
         SET @pagesize = pagesize;
         SET @ssra = CONCAT('SELECT * FROM gk_article WHERE id = ? LIMIT ?,?');
         PREPARE sqlquery FROM @ssra;
         EXECUTE sqlquery USING @ra_id,@pagefrom,@pagesize;
END
;;
DELIMITER ;

创建果然报错,再来看看MySQL5.5的表现,如图:

 

 

图片 2

#技术点1:MySql5.1不支持LIMIT参数(MySql5.5就支持了),如果编写存储过程时使用LIMIT做变量,那是需要用动态SQL来构建的,而这样做性能肯定没有静态SQL好。主要代码如下:

#技术点1:MySql5.1不支持LIMIT参数(MySql5.5就支持了),如果编写存储过程时使用LIMIT做变量,那是需要用动态SQL来构建的,而这样做性能肯定没有静态SQL好。主要代码如下:

完全OK,一切顺利。

         SET @ssra = CONCAT(‘SELECT * FROM gk_article WHERE id = ?
LIMIT ?,?’);

         SET @ssra = CONCAT(‘SELECT *
FROM gk_article WHERE id = ? LIMIT ?,?’);

在审核开发的SQL时,发现有个存储过程他们是用动态SQL(CONCAT()函数)拼凑的,这样性能没有静态SQL好,于是让…

         PREPARE sqlquery FROM @ssra;

         PREPARE sqlquery FROM
@ssra;

         EXECUTE sqlquery USING @ra_id,@pagefrom,@pagesize;

         EXECUTE sqlquery USING
@ra_id,@pagefrom,@pagesize;

 

 

#技术点2:如果同时需要返回受影响行数需要在语句后面添加语句:ROW_COUNT()函数,两条语句之间需要“;”分隔。

#技术点2:如果同时需要返回受影响行数需要在语句后面添加语句:ROW_COUNT()函数,两条语句之间需要“;”分隔。

  发表地址:

  发表地址: