一、存储过程介绍
1、什么是存储过程?
存储过程是实现某个特点功能的sql语句的集合,编译后的存储过程会保存在数据中,通过存储过程的名称反复的调用执行。
2、存储过程的优点?
(1)存储过程创建后,就可以反复地调用和使用,不需要重新写复杂的语句
(2)创建,修改存储过程不会对数据有任何的影响
(3)存储过程可以通过输入参数返回输出值
(4)通过存储过程中加入控制语句,可以加强sql语句的功能性和灵活性
(5)对于单个语句增删改查,可以直接封装一个集合中,存储过程一旦创建就可以直接调用,且可以重复调用
(6)单个sql语句每一次执行都需要对数据进行编译,而存储过程被创建只需要编译一次,后续即可调用
(7)创建的存储过程,可以重复进行调用,可以减少数据库开发人员的工作量
(8)防止sql 注入
(9)造数据(重点)
3、mysql5.0版本之后就支持存储过程,存储过程是由sql语句和控制语句组成的
二、存储的格式
1、基本格式(不带参数):
delimiter // 分隔符
drop (删除) PROCEDURE (存储) if EXISTS(判断是否存在) cc1 存储;
create(创建) PROCEDURE(存储) cc1() 存储名称
BEGIN 开始
select * from emp ; 存储体1
select * from dept ;存储体2
END 结束存储
// 分割符
call cc1() 调用 存储名称
案例:
delimiter //
drop PROCEDURE if EXISTS cc1 ;
create PROCEDURE cc1()
BEGIN
select * from emp ;
select * from dept ;
END
//
call cc1()
2、带传入参数(in)
格式:
delimiter //
drop PROCEDURE if EXISTS 存储名称;
create PROCEDURE 存储名称( in x int)
BEGIN
语句1
END
//
call 存储名(实际参数)
案例:
delimiter //
drop PROCEDURE if EXISTS cc2 ;
create PROCEDURE cc2( in x int)
BEGIN
select * from emp where dept2=x;
END
//
call cc2(105)
3、in输入值、out 返回值
select * from emp ;
desc emp ;
delimiter //
drop PROCEDURE if EXISTS cc2 ;
create PROCEDURE cc2( in x int,out y int)
BEGIN
select age into y from emp where dept2=x;
END
//
call cc2(105,@y)
select @y
4、inout 一个变量是输入值也是输出值
案例:
delimiter //
drop PROCEDURE if EXISTS cc2 ;
create PROCEDURE cc2( inout x int)
BEGIN
set x=x+1;
END
//
set @x=1
call cc2(@x)
select @x
5、设置变量方法:
set @ 变量名
赋值的方法:
(1)方式一
set @ 变量名:=值 设置一个变量值
select @变量名 显示所有数据
(2)方式二
通过查询结果为变量赋值:
select 字段 into 变量名 from 表名 where 条件
后面可以用:select @y 去查看结果
6、循环语句
while 循环语句:
格式
while 条件 do
sql语句
end while
7、造数据场景
(1)传入固定值
create table m1 (id int(10) PRIMARY key ,name varchar(20));
delimiter //
drop PROCEDURE if EXISTS cc2 ;
create PROCEDURE cc2( )
BEGIN
INSERT into m1(id) VALUES(2);
SELECT * from m1;
END
//
call cc2()
(2)出入变量值的数据
案例
delimiter //
drop table if EXISTS m1;
create table m1 (id int(10) PRIMARY key ,name varchar(20));
drop PROCEDURE if EXISTS cc2 ;
create PROCEDURE cc2(in x int )
BEGIN
DECLARE i int DEFAULT 0 ;
WHile (i<x) do
INSERT into m1(id) VALUES(i);
set i=i+1;
end while;
SELECT * from m1;
END
//
call cc2(10)
(3)先统计总数量,再插入传入的值
delimiter //
drop table if EXISTS m1;
create table m1 (id int(10) PRIMARY key ,name varchar(20));
drop PROCEDURE if EXISTS cc2 ;
create PROCEDURE cc2(in x int )
BEGIN
DECLARE i int DEFAULT (select count(*) from m1) ;
WHile (i<x) do
INSERT into m1(id) VALUES(i);
set i=i+1;
end while;
SELECT * from m1;
END
//
call cc2(10)
(4)每次删除表,再重新插入数据
delimiter //
drop PROCEDURE if EXISTS cc2 ;
create PROCEDURE cc2(in x int )
BEGIN
DECLARE i int DEFAULT 0 ;
drop table if EXISTS m1;
create table m1 (id int(10) PRIMARY key ,name varchar(20));
WHile (i<x) do
INSERT into m1(id) VALUES(i);
set i=i+1;
end while;
SELECT * from m1;
END
//
call cc2(3)