MySQL----存储过程和存储函数
一、概述
存储过程就是数据库层面的代码封装和复用,可以接收参数,也可以返回参数,大大减少了网络交互。而存储函数类似于存储过程的一种特殊情况,一般不使用存储函数,因为可以使用存储函数的情况可以使用存储过程,但是能使用存储过程的情况却不一定能使用存储函数。
二、语法
1.存储过程
创建一个存储过程:
create procedure name(参数列表)
beginSQL语句;
end;
参数列表为(参数类型 参数名 数据类型)类型有 [IN/OUT/INOUT],其中IN表示输入类型,可以是一个常量,只能读取,在不写类型时的默认值。而OUT则必须是变量,不管传入的值是什么,都是默认为NULL。INOUT则是既可以当IN又可以当OUT。
下面是一个例子:
先创建应该class表:
create table class(id int primary key auto_increment,
name varchar(20),
teacher varchar(20));
然后创建一个存储过程,根据传来的参数来增加数据:
create procedure p2(IN className varchar(20),IN teacher varchar(20))
begininsert into class (name, teacher) values (className,teacher);
end;
之后执行即可:
call p2('计算机组成原理','James');
其实存储过程中不仅仅可以执行SQL语句,也可以执行其他逻辑。
这里介绍一些逻辑:
if判断:
if.....then.....
elseif ....then....
else....
end if;
这个和Java或者C++中的if很像,只不过要注意elseif是连在一起的。
case判断:
case 表达式
when value1
then.....
when value2
then....
else
......
End case;
循环逻辑:
while 条件 do
SQL逻辑
End while
repeat
SQL逻辑
until 条件
End Repeat;这个和while循环不同的是只有满足条件时才会停止。
[begin_lable: ] loop
SQL逻辑;
End loop[end_lable]
这个循环理论上会一种循环,需要搭配一下语句来使用:
leave lable:退出指定的循环。
iterate lable:相当于Continue。
同时也需要了解一下变量
1.系统变量
系统变量一般不涉及创建,大多用来查询:show global variables (like '模糊查询')
2.会话变量
session变量,只在当前会话生效,设置:set session 变量名 = [0/1]
查询: show session variables (like '模糊查询')
3.局部变量
作用范围为begin 到end的代码块中,声明:declare 变量名 类型 [default 默认值] ,赋值:set 变量名 := 值 ;或者 select count(*) into 变量名 from 表名;
4.用户自定义变量
使用时直接使用“@+变量名” 即可,不用事先声明,初始值为null,作用范围为当前会话。
下面是一个例子:
create procedure p1(IN num int)
begindeclare Total int default 0;declare count int default num;while count>0 doset Total := Total + count;set count := count - 1;End while ;select Total As Result;
end;
call p1(100);
执行输出 5050
2.存储函数
就是有返回值,而且参数只能是IN类型的存储过程。
语法:
create function 函数名(参数名 参数类型)
returns 返回值类型 特征值(Deterministic:幂等性,NoSQL:不包含SQL语句,ReadsSQLdata:只包含读取数据的SQL语句)
begin--SQL语句Return 返回值;
End;
使用时:select 函数名(参数);
下面是一个例子:
create function IsAult (age int)
returns varchar(20) Deterministic
begindeclare Result varchar(20);if age >= 18then set Result := '成年了';
elseset Result := '还没有';end if;
return Result;
end;select IsAult(11);