MySQL5 中添加了存储过程的支持.
大多数 SQL 语句都是针对一个或多个表的单条语句. 并非所有的操作都怎么简单. 经常会有一个完整的操作需要多条才能完成
存储过程简单来说, 就是为以后的使用而保存的一条或多条 MySQL 语句的集合. 可将其视为批文件. 虽然他们的作用不仅限于批处理.
为什么要使用存储过程: 优点
1 通过吧处理封装在容易使用的单元中, 简化复杂的操作
2 由于不要求反复建立一系列处理步骤, 这保证了数据的完整性. 如果开发人员和应用程序都使用了同一存储过程, 则所使用的代码是相同的. 还有就是防止错误, 需要执行的步骤越多, 出错的可能性越大. 防止错误保证了数据的一致性.
3 简化对变动的管理. 如果表名, 列名或业务逻辑有变化. 只需要更改存储过程的代码, 使用它的人员不会改自己的代码了都.
4 提高性能, 因为使用存储过程比使用单条 SQL 语句要快
5 存在一些职能用在单个请求中的 MySQL 元素和特性, 存储过程可以使用它们来编写功能更强更灵活的代码
换句话说 3 个主要好处简单, 安全, 高性能
缺点
1 一般来说, 存储过程的编写要比基本的 SQL 语句复杂, 编写存储过程需要更高的技能, 更丰富的经验.
2 你可能没有创建存储过程的安全访问权限. 许多数据库管理员限制存储过程的创建, 允许用户使用存储过程, 但不允许创建存储过程
存储过程是非常有用的, 应该尽可能的使用它们
存储过程使用对我这种菜鸡来说还是有些难度的, 没系统学过, 看了同事写的之后, 大概看得懂, 但是看到 cursor 游标之后有些懵, 特此总结与一下
使用游标
MySQL5 添加了对游标的支持
只能用于存储过程
直接上一个已经完善的存储过程, 用于对表数据的 copy
- DELIMITER $$
- USE `chy2019` $$
- DROP PROCEDURE IF EXISTS `copy_order_data` $$
- CREATE DEFINER = `root` @`%` PROCEDURE `copy_order_data` (IN p_source VARCHAR (100))
- BEGIN
-- 需要定义接收游标数据的变量
DECLARE done BOOLEAN DEFAULT 0 ;
-- 自定义变量
- DECLARE var_price DOUBLE DEFAULT NULL ;
- DECLARE var_pay_time TIMESTAMP DEFAULT NULL ;
- DECLARE var_product VARCHAR (100) DEFAULT NULL ;
- DECLARE var_source VARCHAR (100) DEFAULT NULL ;
-- 声明游标
DECLARE cur CURSOR FOR
-- 作用于哪个语句
- SELECT
- price,
- pay_time,
- product,
- source
- FROM
- cms_aw_order
- WHERE source = p_source ;
-- 设置结束标志
-- 这条语句定义了一个 CONTINUE HANDLER, 它是在条件出现时被执行的代码. 这里, 它指出当 SQLSTATE '02000'出现时, SET done=1 .SQLSTATE '02000'是一个未找到条件, 当 REPEAT 由于没有更多的行供循环而不能继续时, 出现这个条件
DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done = 1 ;
-- 打开游标
OPEN cur ;
-- 使用 repeat 循环语法
REPEAT
-- 批读取数据到指定变量上
- FETCH cur INTO var_price,
- var_pay_time,
- var_product,
- var_source ;
-- 进行逻辑操作
- INSERT INTO cms_aw_order_copy (price, pay_time, product, source)
- VALUES
- (
- var_price,
- var_pay_time,
- var_product,
- var_source
- ) ;
-- 循环结束条件
- UNTIL done
- END REPEAT ;
-- 关闭游标
- CLOSE cur ;
- END $$
- DELIMITER ;
简单易懂, 而且也比较完善.
这个是对循环结束的条件设置.
SQLSTATE '02000'是一个未找到条件, 当 REPEAT 由于没有更多的行供循环而不能继续时, 出现这个条件.
关于 MySQL 5 使用的 MySQL 错误代码列表, 请参阅 .
还有一种方式是使用
DECLARE CONTINUE HANDLER FOR NOT FOUND SET no_more_products = 1 ;
这种方式试了下, 没成功, 一种方式可以就行了, 倘若以后有机会可以再操作.
到位.
来源: https://www.cnblogs.com/c-h-y/p/10397123.html