最近写了一段存储过程,在这里记录一下。
当时遇到一个大乌龙,update的语句写错了,set x1 = @x1, x2 = @x2 被我写成了set x1 = @x1 and x2 = @x2 。最后导致一直更新不成功。
这里顺便贴一些,关于存储过程和函数的作用。
1、存储过程可以接受参数、输出参数、返回单个或多个结果集以及返回值。可以向程序返回错误原因。
2、存储过程因为SQL语句已经预编绎过了,因此运行的速度比较快。
3、存储过程主要是在服务器上运行,减少对客户机的压力。
而函数与存储过程的思想是一样的,只是函数比较灵活,可以作为查询语句的一个部分来调用(SELECT调用);但是函数只能返回一个变量。
函数限制比较多,比如不能用临时表,只能用表变量.还有一些函数都不可用等等.而存储过程的限制相对就比较少 。
参考资料: http://www.cnblogs.com/Joetao/articles/2250516.html
https://zhidao.baidu.com/question/72843592.html
DELIMITER $$
CREATE
/*[DEFINER = { user | CURRENT_USER }]*/
PROCEDURE `saledata_show`.`customerOrder`()
/*LANGUAGE SQL
| [NOT] DETERMINISTIC
| { CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA }
| SQL SECURITY { DEFINER | INVOKER }
| COMMENT 'string'*/
BEGIN
DECLARE my_username VARCHAR(255); -- 自定义变量1
DECLARE done INT DEFAULT FALSE; -- 自定义控制游标循环变量,默认false
DECLARE My_Cursor CURSOR FOR ( SELECT username FROM `customer_13837617` WHERE id = 1 ); -- 定义游标并输入结果集
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE; -- 绑定控制变量到游标,游标循环结束自动转true
OPEN My_Cursor; -- 打开游标
myLoop: LOOP -- 开始循环体,myLoop为自定义循环名,结束循环时用到
FETCH My_Cursor INTO my_username; -- 将游标当前读取行的数据顺序赋予自定义变量12
IF done THEN -- 判断是否继续循环
LEAVE myLoop; -- 结束循环
END IF;
-- 自己要做的事情,在 sql 中直接使用自定义变量即可
SELECT @my_cnt := COUNT(DISTINCT shopid) FROM shopcomment WHERE username = my_username;
SELECT @total_cnt := COUNT(id) FROM shopcomment WHERE username = my_username;
UPDATE `customer_13837617` SET competitorNums = @my_cnt AND totalOrders = @total_cnt;
SELECT @my_cnt, @total_cnt, my_username;
COMMIT; -- 提交事务
END LOOP myLoop; -- 结束自定义循环体
CLOSE My_Cursor; -- 关闭游标
END$$
DELIMITER ;