一.什么是存储过程
存储过程是实现某个特点功能的sql语句的集合,编译后的存储过程会保存在数据中,通过存储过程的名称反复的调用执行
二.存储过程的优点
1.存储过程创建后可以反复调用和使用,不需要重新写复杂的语句
2.创建,修改存储过程不会对数据有任何影响
3.存储过程可以通过输入参数返回输出值
4.通过存储中加入控制语句,可以加强sql语句的功能性和灵活性
5.对于单个语句增删改查,可以直接封装一个集合中,存储过程一旦创建即可直接调用,且可以重复调用
6.单个sql语句没执行异常都需要对数据进行编译,而存储过程被创建只需要编译一次,后续即可调用
7.创建的存储过程,可以重复调用,可以减少数据库开发人员的工作量
8.防止sql注入
9.造数据
三.创建存储过程语句
1.带in的存储过程
delimiter //
creat procedure 存储名(参数名 in )
being
sql语句
end
//
call 存储名(参数)调用
字符串类型需要utf8
2.带out的存储的过程
delimiter //
create procedure 存储名 (参数名 out )
being
sql语句
end
//
call 存储名(参数)
select 参数
3.带inout的存储过程(既可以输入也可以输出)
delimiter //
create procedure 存储名 (参数名 inout )
being
sql语句
end
//
call 存储名(参数)
select 参数
4.带in和out的存储过程
delimiter //
create procedure 存储名 (参数名 in,参数名 out )
being
sql语句
end
//
call 存储名(参数)
select 参数
5.设置变量
方式一
set @变量名:=值
或者
set @变量名=值
select @变量名=值
方式二
select 字段 into 变量名 from 表名 where 条件
方式三
declare 声明变量
declare i int default 0
6.通过循环语句创造数据表
循环语句
(1)while ... do ... end where
格式
while 条件 do
sql语句
end while
(2)loop ... end loop
(3) repeat ....until ,,,,,,end repeat
例如创建表添加10条数据
create table f1( id int(10), name varchar(10));
delimiter//
drop procedure if EXISTS c8;
create PROCEDURE c8()
BEGIN
DECLARE i int default 0;
while (i<10) DO
insert into f1(id) VALUES(i);
set i=i+1;
END WHILE;
select * from f1 ;
end
//
call c8()
插入指定的行数
delimiter //
DROP table if EXISTS ff ;
drop procedure if exists hz10; #增强健壮性, 判断是否存在指定存储过程,如果存在就删除;
CREATE table ff(id int (10),age int(10));
create procedure hz10( in x int )
BEGIN
DECLARE i int DEFAULT 0 ;
while (i<x) DO
INSERT into ff(id )VALUES (i);
set i=i+1;
end WHILE;
select * from ff ;
END
//
call hz10(5)
call hz10(5)
指定插入的数据,并将已有的数据统计,在已有的数据基础上在添加
delimiter //
DROP table if EXISTS ff ;
drop procedure if exists hz10; #增强健壮性, 判断是否存在指定存储过程,如果存在就删除;
CREATE table ff(id int (10),age int(10));
create procedure hz10( in x int )
BEGIN
DECLARE i int DEFAULT (select Count(*) from ff ) ;
while (i<x) DO
INSERT into ff(id )VALUES (i+1);
set i=i+1;
end WHILE;
select * from ff ;
END
//
call hz10(100)
7.if语句
格式
delimiter //
create procedure c4 (in x int(10))
begin
declare i int DEFAULT(SELECT count()from student2);
if x<=i and x>0 THEN
select sum(english+math+chinese) from student2 GROUP BY class;
else if x>i then
SELECT count()from student2;
else
SELECT * from student2;
end if;
end if;
end
//
call c4(5)
注意每有一个else if 就要有一个end if
例如:根据student学生表去写
1.当传入的参数(大于0)小于等于表里面数据的条数时,则根据分组显示班级的总成绩
2.当传入的参数大于表里面数据的条数时,则统计表里面的数据有多少条
3.当传入其他,则查询表里面的所有数据
方法1:
delimiter //
create procedure hz09( in x int )
BEGIN
DECLARE i int DEFAULT (select Count() from student2 );
if x<=i and x>0 THEN
SELECT sum(chinese+math+english) from student2 group by class;
ELSE if x>i then
SELECT count() from student2;
else
select * from student2;
end if;
end if;
END
//
call hz09(6)