MySQL是为以后的使用而保存的一条或多条MySQL语句的集合,存储过程思想上就是数据库 SQL 语言层面的代码封装与重用
存储过程编写比SQL语句复杂,但是使用起来非常高效,安全
创建存储过程语法如下:
CREATE PROCEDURE productpricing() BEGIN SELECT Avg(prod_price) AS priceaverage FROM products; END
注意:在命令行中输入的问题
mysql> delimiter // mysql> CREATE PROCEDURE productpricing() -> BEGIN -> SELECT Avg(prod_price) AS priceaverage -> FROM products; -> END //
使用存储过程
存储过程实际上是一种函数
CALL productpricing();
删除存储过程
drop procedure productpricing; drop procedure if EXISTS productpricing;
使用参数
一般,存储过程并不显示结果,而是把结果返回给你指定的变量
变量(variable)内存中一个特定的位置,用来临时存储数据。
CREATE PROCEDURE productpricing( OUT p1 DECIMAL(8,2), OUT ph DECIMAL(8,2), OUT pa DECIMAL(8,2) ) BEGIN SELECT MIN(prod_price) INTO p1 FROM products; SELECT MAX(prod_price) INTO ph FROM products; SELECT avg(prod_price) INTO pa FROM products; END;
关键字OUT指出相应的参数用来从存储过程传出 一个值(返回给调用者)。
MySQL支持IN(传递给存储过程)、
OUT(从存 储过程传出,如这里所用)
INOUT(对存储过程传入和传出)类型的参 数。
变量名 所有MySQL变量都必须以@开始。
调用存储过程
call productpricing(@pricelow,@pricehign,@priceaverage);
查询
SELECT @priceaverage; SELECT @priceaverage,@pricehign,@pricelow;
使用in和out
创建
CREATE PROCEDURE ordertotal( IN onumber INT, OUT ototal DECIMAL(8,2) ) BEGIN SELECT sum(item_price*quantity) FROM orderitems WHERE order_num = onumber INTO ototal; END;
调用
call ordertotal(20005,@total);
查询
select @total;
检查存储过程
为显示用来创建一个存储过程的CREATE语句
show create PROCEDURE ordertotal;
为了获得包括何时、由谁创建等详细信息的存储过程列表
show procedure status;
表比较多,用like过滤
show procedure status like 'ordertotal';