数据库:存储程序

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_1018944104/article/details/83003666

目录

一、什么是存储程序?

二、为什么使用存储程序?

三、存储程序分类

四、存储过程

1.存储过程参数的3中模式

2.流程控制语句

3.示例代码

五、存储函数

六、触发器


一、什么是存储程序?

存储程序指的是一组存储和执行在数据库服务器端的程序。存储程序总是在服务器的进程或线程的内存中执行的。

二、为什么使用存储程序?

优点:

  • 执行效率高;
  • 简化开发。

缺点:

  • 占用服务器端资源;
  • 数据迁移时需跟着一并迁移。

三、存储程序分类

存储程序分为3类,分别是:

  • 存储过程:有输入和输出参数,可以执行一组sql语句。
  • 存储函数:有一个返回值,可以执行一组sql语句,可以传递参数。
  • 触发器:执行一组sql语句,由事件驱动自动执行,不能传递参数。

四、存储过程

1.存储过程参数的3中模式

in:输入,默认

out:输出

inout:输入输出

2.流程控制语句

2.1 条件语句

if 条件 then
    #代码,分号结尾
elseif 条件 then
    #代码,分号结尾
else
    #代码,分号结尾
end if;

2.2 循环语句

# while ... do ... end while;
while 条件 do
    #代码,分号结尾
end while;
#loop##########################
#lip:是给当前loop循环取得别名
别名:loop
    if 条件 then
        leave 别名;#结束循环
    end if;
end loop;
#repeat#########################
repeat
    until 条件;#条件满足结束循环
end repeat;

3.示例代码

创建关键词:procedure

调用关键词:call

#存储过程声明及调用
#根据员工的姓名查询职位信息
delimiter //;#设置分隔符,以//作为一句代码的结束标志
#声明存储过程关键词procedure,参数模式默认是in
create procedure sel_job(name varchar(20))
begin
    select job from emp where ename = name;
end;
call sel_job('scott');#调用存储过程

#根据员工的姓名查询职位信息
delimiter //;
#第一个参数模式是in,第二个参数模式是out
create procedure sel_job2(name varchar(20), out e_job varchar(20))
begin
    #关键词into,可将jobde值赋给变量e_job
    select job into e_job from emp where ename = name;
end;
call sel_job2('scott', @e_job);#@e_job 定义一个临时变量来接收传出来的值
select @e_job;

#根据员工的姓名查询职位信息
delimiter //;
#声明存储过程关键词procedure,参数模式默认是in
create procedure sel_job3(inout name_job varchar(20))
begin
    #以变量name_job的值作为检索条件,into将值赋给变量name_job
    select job into name_job from emp where ename = name_job;
end;
set @name='scott';#定义name变量并赋值
call sel_job3(@name);#使用变量
select @name;

#存储过程语法:if / 循环
#if:成绩分级 80 A /60 B  /C
create procedure score(sc int)
begin
    declare v_level varchar(20);#变量声明
    #set v_level = 'A';#变量赋值
    if sc >= 80 then
        set v_level = 'A';
    elseif sc >= 60 then
        set v_level = 'B';
    else
        set v_level = 'C';
    end if;
    select v_level;#展示变量值
end;
call score(89);
call score(69);

#循环语句:1+2+…+100
delimiter //;
create procedure calc()
begin
    declare i int;
    declare sum int;
    set i = 1;
    set sum = 0;
    while i <= 100 do
        set sum = sum + i;
        set i = i + 1;
    end while;
    select sum;
end;
call calc();

delimiter //;
create procedure calc2()
begin
    declare i int;
    declare sum int;
    set i = 1;
    set sum = 0;
    #lip:是给当前loop循环取得别名
    lip:loop
        set sum = sum + i;
        set i = i + 1;
        if i > 100 then
            leave lip;
        end if;
    end loop;
    select sum;
end;
call calc2();

delimiter //;
create procedure calc3()
begin
    declare i int;
    declare sum int;
    set i = 1;
    set sum = 0;
    repeat
        set sum = sum + i;
        set i = i +1;
        until i > 100;
    end repeat;
    select sum;
end;
call calc3();

五、存储函数

创建关键词:function

调用关键词:作为sql语句的一部分进行调用

示例代码:

#存储函数(根据雇员的编号查询名称)
delimiter //;
create function func_emp(eno int)
returns varchar(20)
deterministic #确定的,如果函数多次输入同一个参数值,得到的结果是一致的,表示确定的
begin
    declare name varchar(20);
    select ename into name from emp where epmno = eno;
    return name;
end;
#调用:作为sql语句的一部分进行调用
select func_emp(7788);

六、触发器

关键关键词:tigger

#触发器
#删除student表记录,将删除记录添加到bak表中。
#创建备份表
create table stu_bak select * from student where 1=0;
#定义触发器
delimiter //;
create tigger tri_stu
#事件包括这些:before|after insert|update|delete
after delete
on student for each row #行级触发器
begin			        #封装了值的对象:old | new 
    insert into stu_bak values(old.sid,old.sname,old.cid);
end;
#开始触发
delete from student where sid=5;

猜你喜欢

转载自blog.csdn.net/qq_1018944104/article/details/83003666