存储过程(SQL中的脚本):
Sql语句需要先编译后执行
存储过程是一组为了完成特定功能的Sql语句集,经编译后存储在数据库中,用户通过指定存储过程的名字并给定参数来调用执行它。
存储过程是可编程的函数,在数据库中创建并保存,可以由SQL语句和控制结构组成。当想要在不同的应用程序或平台上执行相同的函数,或者封装特定功能时,存储过程是非常有用的,如果某次操作需要执行多次SQL,使用存储过程比单纯SQL语句执行要快。
优点:
- 存储过程是预编译过的,执行效率高。会省去分析优化等操作。
- 存储过程的代码直接存放于数据库中,通过存储过程名直接调用,减少网络通讯。
- 安全性高,执行存储过程需要有一定权限的用户。
- 存储过程可以重复使用,减少数据库开发人员的工作量。
- 增强sql语言的功能和灵活性:可以用控制语句编写,有很强灵活性。可以完成复杂判断的复杂运算。
缺点:
1.调试麻烦。
2.移植问题,数据库款代码当然是与数据库相关。
3.重新编译问题,因为后端代码是运行前编译的,如果带有引用关系的对象发生改变时,受影响的存储过程、包将需要重新编译。
编译过程的使用:
创建编译过程:
create procedure testa()
begin
select * from user
end;
删除存储过程:
drop procedure testa;
创建带有变量的存储过程:变量的作用范围在begin和end之间。begin end可以进行嵌套。
create procedure testa()
begin
declare username varchar(20) default ' '; -- 声明一个变量
set username='yangxiao'; -- 给变量赋值
select name into username from user where id=1; -- 将查询之后的值赋值给变量
select username; -- 返回变量
end;
存储过程参数
基本语法:
create procedure 名称([IN|ON|INOUT] 参数名 参数数据类型)
begin
......
end;
存储过程的传入参数IN
- 传入参数:类型为in,表示该参数的值必须在调用存储过程事指定,如果不显示指定为in,那么默认就是in类型。
- N类型参数一般只用于传入,在调用过程中一般不作为修改和返回
create procedure test4(userId int)
begin
declare username varchar(32) default '';
declare ordercount int default 0;
select name into username from users where id=userId;
select username;
end;
存储过程的传出参数out
- 传出参数:在调用存储过程中,可以改变其值,并可返回;
- out是传出参数,不能用于传入参数值
- 调用存储过程时,out参数也需要指定,但必须是变量,不能是常量;
create procedure test5(in userId int,out username varchar(32))
begin
select name into username from users where id=userId;
end;
-- 定义一个变量 ,进行使用
set @name='';
call test5(1,@name);
select @name as username;
存储过程的可变参数INOUT
- 调用时可传入值,在调用过程中,可修改其值,同时也可返回值。
- 集合in和out的参数功能
- 不能是常量。
存储过程条件语句
条件语句基本结构
if() then ...else...end if;
多条件判断语句:
if() then...
elseif() then...
else ...
end if;
存储过程循环语句
while语句
while(表达式) do
......
end while;
repeat语句:until为真退出循环
repeat ... until...end repeat;
定义事件event的格式
create event[IF NOT EXISTS]event_name -- 创建使用create event
ON SCHEDULE schedule -- on schedule 什么时候来执行
[ON COMPLETION [NOT] PRESERVE] -- 调度计划执行完成后是否还保留
[ENABLE | DISABLE] -- 是否开启事件,默认开启
[COMMENT 'comment'] -- 事件的注释
DO sql_statement; -- 这个调度计划要做什么?
定义事件调用存储过程
create procedure testa()
begin
insert into user(date) now();
end;
create event testevent
on schedule every 3 minute -- 每三分执行
on completion preserve
DO call test();