目录
一、存储过程和存储函数的区别及相同点
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)
都是经过编译并存储在数据库中的 一段SQL语句 的集合
作用:简化开发的工作;减少数据在数据库和应用服务器间的传输,提高数据库的处理效率
1、定义:一条或多条SQL语句的集合
2、优点和缺点
优点:
缺点:维护成本高;调试不便;数据库间可移植性差(不能跨库移植)
delimiter $$
create procedure hello_pro(in/out/inout 参数名 参数类型)
[characteristics ...]
begin
sql 语句;
end$$
#调用存储过程
call hello_pro();
#声明变量 declare
#赋值 set 和 select...into...
#characteristics 是对存储过程的约束条件
避免存储过程中一段语句的介绍与MySQL默认的结束符';'冲突
delimiter $$
语法: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
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数据库中,变量分为系统变量和用户自定义变量
系统变量是由系统定义的,属于服务器层面;
分为全局系统变量(加 global 关键字)和会话系统变量(加 session 关键字),不写默认会话变量;静态变量属于特殊的全局变量。
用户变量又分为局部变量和会话用户变量
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的流程控制语句主要分为以下三类:
//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
//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]
//基本格式
leave/iterate 标记名
if i>10 then leave add_label;//结束当前循环
end if ;
if i=5 then iterate add_loop;//跳过当前循环进入下一循环
end if;