MYSQL存储过程

一、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;

这里还遗留一个问题:

如果表里有多条数据怎么办?如何分别计算每条数据?(后续再研究研究)

参考学习链接:MySQL的存储过程_吕维尧的博客-CSDN博客_mysql存储过程

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值