跳转至

存储过程

在使用SQL过程中,经常会有一些复杂的操作需要多条语句才能完成

  • 存储过程:为以后使用而保存的一条或多条SQL语句
    • 可以将其视为批文件,虽然他们的作用不仅限于批处理

使用存储过程

执行存储过程

  • CALL接受存储过程的名字以及需要传递给它的任意参数
    CALL productpricing(@pricelow, 
                        @pricehigh, 
                        @priceaverage);
    

    存储过程可以显示结果,也可以不显示结果

所有MySQL变量都必须以@开始

创建存储过程

-- 一个返回产品平均价格的存储过程
CREATE PROCEDURE productpricing()
BEGIN
    SELECT Avg(prod_price) as priceaverage
    FROM products;
END;
- 如果存储过程接受参数,需要在()中列出

删除存储过程

DROP PROCEDURE (IF EXISTS) procedure_name;

使用参数

  • 一般来说,存储过程并不现实结果,而是把结果返回给你指定的变量
  • 示例:
    CREATE PROCEDURE productpricing(
        OUT pl decimal(8,2),
        OUT ph decimal(8,2),
        OUT pa decimal(8,2)
    )
    BEGIN
        SELECT min(prod_price)
        INTO pl
        FROM products;
        SELECT max(prod_price)
        INTO pm
        FROM products;
        SELECT avg(prod_price)
        INTO pa
        FROM products;
    END;
    
  • 解析
    • OUT:指出相应的参数用来存储过程传出的一个值(返回给调用者)
    • IN:传递给存储过程
    • INOUT:对存储过程传入和传出
    • 存储过程的代码位于BEGINEND之间
    • INTO:保存到相应的变量(为变量赋值

建立智能存储过程

  • 示例
    create procedure ordertotal(
        in onumber int,
        in taxable BOOLEAN,
        out ototal DECIMAL(8,2)
    )COMMENT 'Obtain order total, optionally adding tax'
    begin
        declare total decimal(8,2);
        declare taxrate decimal(8,2);
        select sum(item_price*quantity)
        from orderitems
        where order_num = onumber
        into total;
    
        if taxable then
            select total+(total/100*taxtate) into total;
        end if;
    
        select total into ototal;
    end;
    
  • 解析:
    • DECLARE语句定义局部变量,要求指定变量名和数据类型
      • DECLARE variablenaem datatype;
      • 同时支持可选默认值
    • IF THEN|ELSE|ELSEIF

检查存储过程

  • SHOW CREATE PROCEDURE procedure_name:用来显示创建一个存储过程的CREATE语句
  • SHOW PRECEDURE STATUS:获得包括何时、由谁创建等详细信息的存储过程列表