一、IN
表示传入的参数,可以传入数值或者变量,即使传入变量,并不会改变变量的值,可以内部更改,仅仅作用在函数范围内
-- 单个参数 例如:
delimiter $$
CREATE PROCEDURE proc04(in var_prodid CHAR(10))
BEGIN
SELECT * FROM Products WHERE prod_id = var_prodid;
END $$
delimiter;
-- 调用存储过程
CALL proc04('BNBG01');
-- 多个参数 例如:
delimiter $$
CREATE PROCEDURE proc05(IN var_prodid CHAR(10), IN var_orderprice DECIMAL(8,2))
BEGIN
SELECT * FROM OrderItems
WHERE prod_id = var_prodid AND item_price > var_orderprice;
END $$
delimiter;
-- 调用存储过程
CALL proc05('BNBG01', 2);
二、OUT
表示从存储过程内部传值给调用者
-- 例如:传入产品ID,返回产品名称
delimiter $$
CREATE PROCEDURE proc06(IN in_prodid CHAR(10), OUT out_prodname CHAR(255))
BEGIN
SELECT prod_name INTO out_prodname FROM Products WHERE prod_id = in_prodid;
END $$
delimiter;
-- 调用存储过程
CALL proc06('BNBG01', @out_prodname);
SELECT @out_prodname;
三、INOUT
表示从外部传入的参数经过修改后可以返回的变量,既可以使用传入变量的值也可以修改变量的值(即使函数执行完)。
-- 例1:传入产品id,拼接该产品订单总数量,传入产品单价,输出该产品id的订单总价格
delimiter $$
CREATE PROCEDURE proc08(INOUT inout_prodid CHAR(30), INOUT inout_price DECIMAL(8,2))
BEGIN
SELECT SUM(quantity) INTO @var_quantities FROM OrderItems WHERE prod_id = inout_prodid;
SELECT CONCAT(inout_prodid, '_', @var_quantities)INTO inout_prodid;
SET inout_price = inout_price * @var_quantities;
END $$
delimiter;
-- 本变量名直接调用
SET @inout_prodid = 'BNBG01';
SET @inout_price = 2.99;
call proc08(@inout_prodid, @inout_price);
SELECT @inout_prodid, @inout_price;
-- 使用另一个变量名调用
SET @prodid = 'BNBG01';
SET @price = 3.99;
call proc08(@prodid, @price);
SELECT @prodid, @price;
但是不能直接在 存储过程 中直接使用聚合函数,如果需要使用,最好像例1中定义一个用户变量引用,否则直接使用会报 “1111 - Invalid use of group function”,如例2错误示范
-- 例2 错误示范
delimiter $$
CREATE PROCEDURE proc09(INOUT inout_prodid CHAR(30), INOUT inout_price INT)
BEGIN
SELECT CONCAT(inout_prodid, '_', SUM(quantity))INTO inout_prodid FROM OrderItems WHERE prod_id = inout_prodid;
SET inout_price = inout_price * SUM(quantity);
END $$
delimiter;
-- 调用存储过程
SET @prodid1 = 'BNBG01';
SET @price1 = 3.99;
call proc09(@prodid1, @price1);
SELECT @prodid1, @price1;
这里还遗留一个问题:
如果表里有多条数据怎么办?如何分别计算每条数据?(后续再研究研究)