stored procedure
存储过程
MySQL5 才开始支持存储过程。
[TOC]
存储过程是为有复杂业务逻辑处理而提供的功能,有一些比较复杂的逻辑,需要进行多个表的复杂操作,甚至还需要根据查询结果来判断是否需要操作另一表。例如,商品销售、付款。这些信息都牵涉到不同用户的信息操作的同步完成。
- 通过把复杂的逻辑封装在容易使用的单元中,复用这些单元,简化操作。
- 由于不要求反复建立一系列处理过程,这保证了数据的完整性,所有的操作都是用同一存储过程,使测试更加充分,防止了额外的错误。
- 简化由于表名,字段名的更改导致的修改。业务逻辑人员甚至不需要知道操作的过程,只需要知道存储过程的名称。
- 提高性能,因为存储过程要比单条的 SQL 语句组合要快。
- 存在一些只能在单个请求中的元素或特性,存储过程可以用他们编写更加灵活和强大的功能代码。
- 更复杂,需要更多的知识与经验
- 存储过程的访问和创建权限可以分别分配。可以有灵活的安全控制权限。
创建存储过程
MySQL 的存储过程实际上是一种函数函数,实际使用也一样。
CREATE PROCEDURE procedure_name(args...) BEGIN 处理内容,可以使用SQL语句和逻辑操作... END;
例如求平均价
CREATE PROCEDURE averagePrice() BEGIN SELECT avg(prace) AS price_average FROM products; END;
- CREATE PROCEDURE 用来创建存储过程
- procedure_name 必须制定一个全库唯一的标识符来表示存储过程,用于调用时标识。后面的
()
是必须的,即使没有参数。 - BEGIN 和 END 限制存储体的开始和结束,标识该存储过程的范围。
这段代码虽然没有返回任何数据,但是不代表不能查看查询的结果,执行改存储过程
调用存储过程
CALL procedure_name(args);
call averagePrice(); 将返回和单独调用内部的 SQL 语句相同格式的查询输出,但是averagePrice() 外却没有获得查询结果的返回值。
MySQL 命令行客户机的分割符. 如果使用 MySQL 命令行使用程序,应当注意 默认的 MySQL 语句的分割符是
;
,MySQL 命令行实用程序也使用;
作为语句的分隔符,如果命令行使用程序处理了存储过程中的;
分割符,则存储过程在交给 MySQL 时是没有分割符的,这会是存储过程中的 SQL 出现句法错误。解决办法是临时更改命令行实用程序的语句分割符。
DELIMITER //
CREATE PROCEDURE averagePrice() BEGIN SELECT avg(prace) AS price_average FROM products; END //
DELIMITER ;
其中DELIMITER //
告诉命令行实用程序使用//
作为语句分割符,DELIMITER ;
从新设置回 ;
。 此时看到存储过程的结束分割符不再使用;
,而是使用更改后的//
。但是存储过程内部还是保持了;
。
除 ;
外,任何字符都可以作为语句分割符。
删除存储过程
如果你想要修改存储过程,就会发现已经有同名的存过过程,新的存储过程是创建不成功的,此时就需要先删除存储过程,然后再创建
DROP PROCEDURE procedure_name [IF EXISTS]: 注意此时标识符后并没有括号。
使用参数
CREAT PROCEDURE productPracing ( OUT low DECIMAL(8, 2), OUT high DECIMAL(8, 2) OUT average DECIMAL(8, 2) ) BEGIN SELECT min(price) INTO low FROM products; SELECT max(price) INTO high FROM products; SELECT avg(price) INTO average FROM products; END;
关键字 OUT 表示传出数据,类似的 IN 表示传入数据,INOUT 表示传入传出数据。
调用
CALL productPracing(@priceLow, @priceHigh, @priceAverage);
所有 MySQL 变量都要以 @ 符号开头。
调用该函数并不现实任何结果,只是将结果存储在了变量中。想要现实变量的值。
SELECT @priceLow, @priceHigh, @priceAverage;
查看存储过程 SHOW CREATE PROCEDURE procedure_name;
SHOW PROCEDURE STATUS;
可以指定过滤模式
SHOW PROCEDURE STATUS LIKE ‘price’;
更复杂的存储过程
存储过程是可以对条件进行判断和声明局部变变量的。
CREATE PROCEDURE ordertotal(
IN onumber INT,
INT taxable BOOLEAN,
OUT ototal DECIMAL(2, 8)
) COMMENT 'Obtion order total, Optionally add tax'
BEGIN
-- Declare variable for ototal
DECLARE total DECIMAL(8, 2);
-- Declare tax percentage
DECLARE taxrate INT DEFAULT 6;
-- Get the order ototal
SELECT sum(item_price * quantity)
FROM order_items
WHERE order_num = onumber
INTO total;
-- Is this taxable?
IF taxable THEN
SELECT total + (total / 100 * texrate) INTO total;
ENDIF
-- And finally, save to out variable.
SELECT total INTO ototal;
END;
IF () THEN ... ELSEIF () THEN ... ELSE ... ENDIF
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论