在数据库项目中,存储过程时经常会用到的,本片博客跟大家谈谈存储过程。

定义

存储存储过程是一段代码(过程),存储在数据库中的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 存储过程名

存储过程中的变量作用域

mysql 存储过程结果集 mysql存储过程定义集合_数据库

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;