一.存储过程
一.存储过程
将能够完成特定功能的SQL指令进行封装,编译之后存储在数据库服务器上,并且为之取一个名字;
当客户端需要执行这个功能时,不用编写SQL指令,直接通过封装的SQL指令的名字完成调用即可;
存储过程优点:
1.SQL指令无需客户端编写,通过网络传送,可以节省网络开销,同时避免SQL指令在网络传输过程中被恶意篡改,保证安全性;
2.存储过程经过编译创建并保存在数据库中,执行过程无需重复的进行编译操作,对SQL指令的执行过程进行了性能提升;
3.存储过程中多个SQL指令之间存在逻辑关系,支持流程控制语句(分支、循环),可以实现更为复杂的业务;
存储过程缺点:
1.存储过程是根据不同的数据库进行编译、创建并存储在数据库中,当我们需要切换到其他的数据库产品时,需要重新编写针对于新数据库的存储过程;
2.存储过程受限于数据库产品,如果需要高性能的优化会成为一个问题;
3.在互联网项目中,如果需要数据库的高(连接)并发访问,使用存储过程会增加数据库的连接执行时间;
语法:create procedure <proc_name>( [ IN / OUT args ] )
begin
--SQL
end;
例:创建一个存储过程实现加法运算
create procedure pro_test1( IN a int , IN b int , OUT c int )
begin
SET c=a+b;
end;
调用存储过程:
set @m=0; //定义变量@m
call proc_test1(3,2,@m); //调用存储过程
select @m from dual; //显示变量值
存储过程中变量的使用
局部变量:定义在存储过程中的变量,只能在存储过程内部使用
declare <attr_name> <type> [default value];
例:declare x int default 0; ——定义x int类型,默认值为0
用户变量:相当于全局变量,定义的用户可以通过select @attrName from dual进行查询
——用户变量会存储在mysql数据库的数据字典中(dual)
——用户变量定义使用set关键字直接定义,变量名要以@开头
分支语句 if-then-else
单分支:if condition then
--SQL
end if;
双分支:if condition then
--SQL1
else
--SQL2
end if;
分支语句case
case a
when 1 then
--SQL1
when 2 then
--SQL2
else
--SQL
end case;
循环语句
while ... do SQL end while;
repeat SQL until ... end repeat;
Nameloop:loop SQL ... leave Nameloop; end loop;
游标
用来依次取出查询结果集中的每一条数据——逐条读取查询结果集中的记录
声明游标:
DECLARE cursor_name CURSOR FOR select_statement;
打开游标:
open cursor_name;
使用游标:提取游标当前指向的记录(与循环一起使用,提取后,游标自动下移)
FETCH cursor_name INTO column1,column2...;
关闭游标:
close cursor_name;