在数据库查询时,如果有较复杂的计算过程,需要通过上一次的查询结果来查询,这个时候就比较难实现且繁琐,存储过程就很好的解决了这一问题,存储过程的主要思想就是,数据库SQL语言层面的代码封装与重用,可以将上一步的结果设为变量用于后续步骤的查询。
一个存储过程相当于一个功能。
声明语句结束符,可以自定义,默认是‘;’,但容易将sql语句定为结束,因此要先修改结束符,结束之后再恢复:
DELIMITER // #可以是任意,&&或者别的
DELIMITER ; #末尾恢复
创建存储过程
CREATE PROCEDURE NAME(
in param int, #in是定义传入的参数
out param2 varchar(25) #out是定义输出的参数
)
begin
sql语句,每个嵌套块及其中的每条语句,必须以分号结束
end
在begin...end复合语句中声明变量,在使用时加上@,但是只能这个存储过程使用
declare name varchar;
set @name = 'tom'; #赋值
select id into @name; #将查询的id赋值给变量name
select @name; #在终端打印输出结果
实例:
DELIMITER //
CREATE PROCEDURE costall(
in _companyId VARCHAR(10),
OUT costMoney1 FLOAT(10)
)
BEGIN
DECLARE cost1 FLOAT;
DECLARE cost2 FLOAT;
select num into @cost1 from ** where companyId = _companyId;
select price into @cost2 from ** where companyId = _companyId and id = 2;
SELECT @cost1 + @cost2 INTO costMoney1;
SELECT costMoney1;
END//
DELIMITER ;
存储过程的调用
在创建时有几个参数,此处需要几个参数,包含out的参数。在一个存储过程中也可以用该方法调用另一个存储过程。
call costall(1,@costMoney1 )
存储过程的修改以及删除
#修改,查到的都是用alter,但是我貌似没法实现,例如我改了参数或者sql语句使用alter没法成功变更,还待研究
alter PROCEDURE costall;
#删除
drop PROCEDURE costall;