在数据库项目中,存储过程时经常会用到的,本片博客跟大家谈谈存储过程。
定义
存储存储过程是一段代码(过程),存储在数据库中的sql组成。存储过程是一段可执行性代码的集合。相比函数,更偏向于业务逻辑。
一个存储过程通常用于完成一段业务逻辑,例如数据更新,合成工资等。
而一个函数通常专注于某个功能,视为其他程序服务的,需要在其他语句中调用函数才可以,而存储过程不能被其他调用,是自己执行 通过call执行。
存储过程的优点
- 存储过程可封装,并隐藏复杂的商业逻辑。
- 存储过程可以回传值,并可以接受参数。
- 存储过程无法使用 SELECT 指令来运行,因为它是子程序,与查看表,数据表或用户定义函数不同。
- 存储过程可以用在数据检验,强制实行商业逻辑等。
创建存储过程
CREATE PROCEDURE sp_name (参数列表)
--过程体
参数列表:不同于函数的参数列表,需要指明参数类型
IN:表示输入型,在调用过程中,将数据输入到过程体内部的参数,存储过程之后不会改变IN的变量值
OUT:表示输出型,在调用过程中,将过程体处理完的结果返回到客户端
INOUT:表示混合型,既可输入,也可输出
注意:确保参数的名字不等于列的名字,否则在过程体中,参数名被当做列名来处理
创建存储过程实际操作
--首先将MySQL的;结束符改为$$,这个可以根据自己喜欢的定义
DELIMITER $$
CREATE PROCEDURE sp_AddAge(IN temp_sid int,IN temp_tid int)
BEGIN
update stu set sage=sage+1 where sid=temp_sid;
update tea set tage=tage+1 where tid=temp_tid;
END$$
最后加上一句 delimiter;
调用存储过程
CALL sp_name
sp_name表示存储过程名
调用存储过程实际操作
call sp_AddAge(1,2);
在存储过程中设置了需要传参的变量temp_sid和temp_tid,调用存储过程的时候,通过传参将1赋值给temp_sid,将2赋值给temp_tid,然后进行存储过程里的SQL操作。
变量
变量的声明
DECLARE var_name datatype [default value];
其中datatype为MySQL的基本数据类型,如int,double,char,varchar等
DECLARE l_int int unsigned default 2000;
DECLARE l_date date DEFAULT '2018-12-14';
DECLARE l_varchar varchar(255) DEFAULT 'hello world';
变量的赋值
SET 变量名 = 表达式值 [,var_name = expression ...]
在客户端使用变量
set @x=10;
select @x;#输出10
select 'hello' into @y;
select @y;#输出hello
在存储过程中使用变量
CREATE PROCEDURE ConcatString( ) SELECT CONCAT(@var_str,' World');
SET @var_str='Hello';
CALL ConcatString( ); #输出Hello World
查看数据库中的存储过程
show procedure status where db='数据库名';
查看详细的存储过程
SHOW CREATE PROCEDURE 数据库.存储过程名;
修改存储过程
目前MySQL还不支持对已存在的存储过程的代码进行修改,如果要修改存储过程代码,可以先删除该存储过程再重新建立。
ALTER PROCEDURE
删除存储过程
DROP PROCEDURE 存储过程名
存储过程中的变量作用域
if-else条件语句
DELIMITER //
CREATE PROCEDURE sp_proc(IN parameter int)
begin
declare var int;
set var=parameter+1;
if var<0 then
insert into t values(17);
end if;
if parameter>0 then
update t set s1=s1+1;
else
update t set s1=s1+2;
end if;
end;
//
DELIMITER ;
case语句
case var
when var=0 then
insert into t values(0);
when var>0 then
insert into t values(10);
when var<0 then
insert into t values(-10);
else
insert into t values(100);
end case
循环语句
--先判断循环条件在执行循环体
declare var int;
set var=0;
while var<6 do
insert into t values(var);
set var=var+1;
end while;
--先执行循环体在判断条件
declare v int;
set v=0;
repeat
insert into t values(v);
set v=v+1;
until v>=5
end repeat;
while 条件 do --循环体 endwhilerepeat --循环体 until 循环条件 end repeat;