MySQL基础 -- 存储过程和存储函数

目录

一、存储过程和存储函数的区别及相同点

1、相同点

2、区别

二、存储过程 SP

3、语法

1) 声明结束符

2)characteristics 对存储过程的约束条件

3)参数(IN 、OUT、INOUT)

三、存储函数

1、语法

四、变量

1、系统变量

2、用户变量

① 局部变量(在begin/end块中有效)

② 会话用户变量 (只对当前连接的会话有效)

五、流程控制

 1、条件判断语句(if、case)

2、循环结构(loop、while、repeat)

3、跳转语句(leave、iterate)


一、存储过程和存储函数的区别及相同点

1、相同点

        都是经过编译并存储在数据库中的 一段SQL语句 的集合

        作用:简化开发的工作;减少数据在数据库和应用服务器间的传输,提高数据库的处理效率

2、区别

  • 标识符不同:函数function,过程procedure
  • 是否有返回值:存储函数有且必须有返回值,存储过程没有返回值,不过可以使用设置参数out来实现有返回值的业务
  • 调试方式不同:函数select,过程call(exec)
  • 通过inout的参数,存储过程相较于存储函数,更灵活,可以返回多个结果

二、存储过程 SP

1、定义:一条或多条SQL语句的集合

2、优点和缺点

优点:

  • 简化操作、提高了sql语句的重用性,减少了开发程序员的压力
  • 提高效率(先编译后保存)
  • 减少流量传输(客户端不需要那所有的sql语句通过网络发给服务器)
  • 提高了数据查询的安全性(减少了SQL语句暴露在网上的风险)

缺点:维护成本高;调试不便;数据库间可移植性差(不能跨库移植)

3、语法

delimiter $$
create procedure hello_pro(in/out/inout 参数名 参数类型)
[characteristics ...]
begin
    sql 语句;
end$$

#调用存储过程
call hello_pro();

#声明变量 declare
#赋值 set 和 select...into...
#characteristics 是对存储过程的约束条件

1) 声明结束符

避免存储过程中一段语句的介绍与MySQL默认的结束符';'冲突

delimiter $$

2)characteristics 对存储过程的约束条件

3)参数(IN 、OUT、INOUT)

语法:in/out/inout 参数名 type

eg.in age int

//IN 入参,该参数必须在调用存储过程时指定,不能被返回
delimiter$$
create procedure sp_1(in nickname varchar(32))
begin 
    set @user_age=nickname;
end$$
call sp_1('zhuyidan')$$
select @user_age$$
//OUT 可在存储过程内部被改变,可返回
delimiter $$
create proc sp_param2( in dept_loc varchar(64),out dept_name varchar(32))
begin
    select d.dname into dept_name from dept d where d.loc = dept_loc; //赋值
end$$
call sp_param2('DALLAS',@dept_name)$$  //调用存储过程
select @dept_name$$  //返回dept_name的值
//ACCOUNTING
//INOUT 调用时指定,可被改变和返回
delimiter $$
create proc sp_param3 (in dept_loc varchar(64),inout dept_name varchar(32)
bagin
    declare d_name varchar(32);//声明变量
    set d_name = dept_name;//赋值给dept_name
    select d.dname into dept_name from dept d where d.loc = dept.loc;
    select concat(dept_name,'_',d_name);
end$$
set @dept_name='HELLO';//赋值
call sp_param3('NEWYORY',@dept_name);//调用存储过程,'HELLO'=d_name,d.dname=dept_name
select @dept_name;
//ACCOUNTING-HELLO

三、存储函数

1、语法

create function 函数名([参数[,...])
returns 返回值类型
[characteristics ]// 指定存储函数特性
begin
    sql代码
end;

//调用 select 函数名(参数)
//删除 drop function if exists 函数名;

实例:

drop function if exists func_user;
create function func_user(in_id int)
returns varchar(50)
begin
    declare out_name varchar(50);//定义变量out_name
    select name into out_name from tb_user where id = in_id;//变量赋值
    return out_name;//返回指定id的out_name
end;

调用函数
select func_user(2);

四、变量

在MySQL数据库中,变量分为系统变量和用户自定义变量

1、系统变量

系统变量是由系统定义的,属于服务器层面;

分为全局系统变量(加 global 关键字)和会话系统变量(加 session 关键字),不写默认会话变量;静态变量属于特殊的全局变量。

2、用户变量

用户变量又分为局部变量和会话用户变量

① 局部变量(在begin/end块中有效)

begin
    //声明变量
    declare 变量名 type [default var_value];//没有default,初始值为null
    declare nickname varchar(32) default 'unkown';

    //赋值
    //set
    set nickname = 'UG';
    //into
    select e.empno,e.ename into emp_no,emp_name from emp e where e.empno = 7839;

    //查看局部变量的值
    select 变量1,变量2;
end

实例:

drop procedure sp_var1();
delimiter //
create procedure sp_var1()
begin 
    declare nickname varchar(32) default 'SF';
    select nickname;
    set nickname = 'UG'
    select nickname;
end//

call sp_var1();

② 会话用户变量 (只对当前连接的会话有效)

(不需要声明,直接使用,类似于Java的成员变量)

//变量赋值
//方式一 set
set @用户变量 = 值;
set @用户变量 := 值;

//方式二 select...into 或 select ... :=
select 表达式 into @用户变量 [from 语句]
select @用户变量 := 表达式 [from 语句]

//查看用户变量的值
select @用户变量

实例:

set @nick_name ='WR';
delimiter $$
create procedure sp_var2()
begin
    set @nickname = 'WR';
end $$
call sp_var2()$$
select @nick_name

五、流程控制

MySQL的流程控制语句主要分为以下三类:

 1、条件判断语句(if、case)

//if语法
if 条件 then 执行语句
    elseif 条件 then 执行语句
    else 执行语句
end if

//case语法(少用)
//语法一:(类似于Java的switch)
case case_values
    when when_value then 执行语句
    when when_value then 执行语句
    else 执行语句
end case
//语法二
case 
    when 条件 then 执行语句
    when 条件 then 执行语句
    else 执行语句
end case

2、循环结构(loop、while、repeat)

  • loop:一般用于实现简单的“死循环”
  • while:先判断后执行(满足条件执行循环)
  • repeat:先执行再判断,无条件至少执行一次(满足条件退出循环)
//LOOP语句
//用于重复执行某些语句,直到被退出才跳出循环(eg.使用leave子句)
[loop_label:]LOOP
    循环语句
END LOOP [loop_label]
//loop_label是标注名称,可省略

//案例:使用loop语句循环操作,循环10次退出
//创建存储过程
delimiter $$
create procedure proc_loop()
begin 
    //定义变量
    declare i int default 0;
    
    //loop循环语句
    [add_loop]LOOP
        select i;//循环的操作
        set i=i+1;
        if i>=10 then leave add_loop;//退出循环的条件
        end if;
    end LOOP add_loop;
end $$
//while语句
//先判断条件再循环,如果条件为真,进入循环,条件为假,退出循环
//java中的while语句
//while(条件表达式){循环体}

//MySQL中的while语句
[while_label]WHILE 循环条件 DO
    循环体
END WHILE [while_label];
//repeat语句
//先执行一次循环,再在until中进行条件判断,满足条件就退出,否则继续循环;
[repeat_label]repeat
    循环体
until 结束循环的条件表达式
end repeat [repeat_label]

3、跳转语句(leave、iterate)

  • leave 理解为break
  • iterate 理解为 continue
//基本格式
leave/iterate 标记名


if i>10 then leave add_label;//结束当前循环
end if ;


if i=5 then iterate add_loop;//跳过当前循环进入下一循环
end if;

猜你喜欢

转载自blog.csdn.net/Echo_165/article/details/127192156