mysql之存储(1)

一、存储过程介绍

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 ; 如果存在cc2 删除
create PROCEDURE cc2( in x int,out y int) 重建一个cc2(输入数值x,输出数值y)

BEGIN
select age into y from emp where dept2=x; 查看当dept2为x时emp中y的数值
END//

call cc2(105,@y) 输入dept2=105,输出变量值y

select @y 查看变量值y

4、inout 一个变量是输入值也是输出值
案例:
delimiter //
drop PROCEDURE if EXISTS cc2 ;
create PROCEDURE cc2( inout x int) 创建cc2表,输入数值x,输出数值x

BEGIN

set x=x+1;

END

//

set @x=1 设置变量值x为1

call cc2(@x) 运行储存

select @x 查看结果


5、设置变量方法:

set @ 变量名

赋值的方法:

(1)方式一

set @ 变量名:=值 设置一个变量值

select @变量名 显示所有数据

(2)方式二

通过查询结果为变量赋值:变量为一条件

select 字段 into 变量名 from 表名 where 条件

6、循环语句
while 循环语句:

格式
while 条件 do

sql语句

end while

7、造数据场景

(1)传入固定值 输入存储的为一固定数值

create table m1 (id int(10) PRIMARY key ,name varchar(20)); 创建一个只有id和name的m1表

delimiter //
drop PROCEDURE if EXISTS cc2 ; 存在cc2即删除
create PROCEDURE cc2( ) 创建cc2()
BEGIN
INSERT into m1(id) VALUES(2); 为m1表的id字段添加 id=2
SELECT * from m1; 查看m1表
END
//

call cc2() 运行存储

(2)出入变量值的数据
案例
delimiter //
drop table if EXISTS m1; 如果存在表m1,即删除
create table m1 (id int(10) PRIMARY key ,name varchar(20)); 新创一个m1表

drop PROCEDURE if EXISTS cc2 ; 如果存在cc2表删除
create PROCEDURE cc2(in x int ) 创建可输入数值x的cc2 储存

BEGIN
DECLARE i int DEFAULT 0 ; 声明变量0,i值从0开始

WHile (i<x) do 当i<x时运行
INSERT into m1(id) VALUES(i); 在m1表中 id一项新增id=i
set i=i+1; 接着输入i=i+1
end while; 结束while
SELECT * from m1; 查看m1表

END
//

call cc2(10) 输入x值为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) ; 输入的是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 每次开始时删除m1表,则不会有m1表已存在的报错
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)

posted @   君庭  阅读(8)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架
点击右上角即可分享
微信分享提示