返回介绍

stored procedure

发布于 2024-06-15 14:30:40 字数 10606 浏览 0 评论 0 收藏 0

存储过程

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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文