存储过程的定义
存储过程和函数是事先经过编译并存储在数据库的一段SQL语句的集合,调用存储过程和函数可以简化开发人员的很多工作,减少数据和应用服务器之间的传输,对于提高数据处理的效率是有好处的。存储过程和函数的区别在于函数必须有返回值,而存储过程没有。因此,存储过程也完全可以看做是MySQL函数。存储过程也分无参和有参的存储过程,创建一个无参的存储过程很简单,比如:
CREATE PROCEDURE test()
BEGIN
SELECT AVG(sum_price) FROM order;
END;
上面的SQL语句表示创建了一个名为test的无参的存储过程,其中test后面的括号里面是写参数的,虽然无参的存储过程没有参数,但是也需要带上括号。执行一个无参的存储过程也是很简单,直接使用CALL关键字即可,如:
CALL test()
变量
存储过程支持使用变量,可以使用的变量类型包括:IN - 传递给存储过程、OUT - 从存储过程传出、INOUT - 对存储过程传入和传出。对于存储过程参数的指定,首先需要指定变量类型,然后支持变量名称,最后指出MySQL支持的数据类型(如:varchar、int、decimal)。下面就定义了一个带变量的存储过程:
CREATE DEFINER PROCEDURE productpricing(
OUT min DECIMAL(8,2),
OUT max DECIMAL(8,2),
OUT avg DECIMAL(8,2)
)
BEGIN
SELECT MIN(sum_price) INTO min FROM order;
SELECT MAX(sum_price) INTO max FROM order;
SELECT AVG(sum_price) INTO avg FROM order;
END;
然后执行上面的函数:CALL productpricing(@min,@max,@avg)
对于IN类型的变量,可以这样使用:
CREATE DEFINER=root@localhost PROCEDURE myfx(
IN number VARCHAR(20),
OUT price DECIMAL(8,2)
)
BEGIN
SELECT SUM(sum_price) FROM order WHERE order_num=number INTO price;
END
然后执行上面的函数:CALL myfx(‘1000001198524523’, @price)
其它用法详见:https://segmentfault.com/a/1190000039248897
