存储过程
一、存储的介绍
(1)什么是存储过程?
h存储过程是实现某个特定功能的sql 语句的集合,编译 后的存储过程会保存 在数据库中,通过存储过程的名称可以反复的调用执行。
 
(2)存储过程的优点
存储过程的优点
1存储创建后,就可以反复调用和使用,不需要重复编写复杂的sql语句
2创建修改存储过程不会对数据有任何影响
3存储过程可以通过参数和返回值
4存储过程可以通过加入控制语句,加强sql语句的功能和灵活性
5对于存储的增删改查语句,可以直接封装在一个函数当中,或者封装在一个集合当中,存储一旦创建就可以直接调用,还可以反复使用
6、单个sql语句每次执行都要数据库进行编译,而存储过程创建只需要编译一次,后续就可调用
7、创建存储过程,可以重复进行调用,可以减少开发人员的工作量
8防止sql注入
9造数据
 
 
====================================================================
 
二 存储的基本格式
 
 
delimiter // #分割符/定格符
create procdure 存储名称(in或out或inout)始
begin # 开始
执行语句块1
执行语句块2
end #结束
//#分隔符
 
先执行创建储存。在调用使用call
call存储名() 调用存储
 
==================================================================
 
基本 使用语句;
(1)查看单个存储过程的项详情
格式:show  create   procedure  存储名;
show  create   procedure  hz1 ;
(2)查看所有已经创建的存储过程详情
格式:show  PROCEDURE  STATUS ;
show  PROCEDURE  STATUS ;
(3)查询数据库创建的存储过程
格式:show  PROCEDURE  STATUS where  db="数据库名" ;
show  PROCEDURE  STATUS where  db="hz10" ;
(4)删除存储
格式:drop  procedure   存储名称 ;
drop  procedure hz2 ;
 
 
====================================================================
存储过程的编写
1 无参数的存储过程
格式;
delimiter //create   procedure  存储名称()
BEGIN           
语句;
END//call  存储名称()      #调用存储过程例:
 
案例;
delimiter //
create   procedure  aa()
BEGIN  
select  *  from emp;
END//
call aa()
 
2in 输入参数的存储
 
格式;
delimiter //
create   procedure  存储名称( in x int)
BEGIN  select  *  from 表,名  where 字段名=x;
END//
call 存储过程名(103)
案例;
delimiter //
create   procedure  bb( in x int)
BEGIN  select  *  from emp  where dept2=x;
END//
call bb(103)
 
3 out输出参数
格式:
delimiter //
create   procedure  ee( out y int
)BEGIN 
select  sid into y from emp  where name="sunbao";
EN
D//
call ee(@y)
select @y
 
(4)in ,out
案例
delimiter //
create
  procedure  ff( out y int ,in  x int)
BEGIN 
select  age into y from emp  where sid=x;
END
//
call ff(@y,1789)
select @y
(5)inout  输入和输出
delimiter //
create   procedure  hh( inout  n int)
BEGIN 
set  n:=n+1;
END
//
set @n=2
call hh(@n)
select @n 
=======================================================================
 
1、用户变量  定义语法:
set    @变量名 
赋值的语法:
(1)set  @ 变量名  :=值
(2)set  @ 变量名 =值
(3)select  @变量名:=值 ;
方法二:通过查询结果为变量赋值
select    字段| 表达式   into   变量名    from  表名   where  条件
 2、声明变量
declare   i  int  default  0       #declare  声明变量    ,i i 变量    数据类型  int       默认值
====================================================================
(1)第一种造数:( 在存储外先建表,在造数据,写死的数据)
delimiter //
DROP PROCEDURE  if  exists hh ; #增强存储的健壮性,判断存在删除
create   procedure  hh()
BEGIN
  declare  i  int  default  0 ; #声名一个变量, i变量 ,int数据类型  条件 
while (i<10) DO   
 INSERT  into  abc VALUES (i);     
set i=i+1; 
end WHILE ; 
select * from  abc ;
END
call hh()
(2)第二种造数:( 在存储外先建表,在造数据,根据输入的数据造数)
delimiter //
DROP PROCEDURE  if  exists hh ; #增强存储的健壮性,判断存在删除
create   procedure  hh(in  x int)
BEGIN
  declare  i  int  default  0 ; #声名一个变量, i变量 ,int数据类型  条件 
while (i<x) DO     
INSERT  into  abc VALUES (i);     
set i=i+1; 
end WHILE ; 
select * from  abc ;
END
call hh(1000)
 
 
第三种造数:( 在储存中造表,在造数据,根据输入的数据造数)
drop table abc ;
create  table  abc (id  int(10)) ;
 
delimiter //
DROP  table if  EXISTS  abc;
DROP PROCEDURE  if  exists hh ; #增强存储的健壮性,判断存在删除
create   procedure  hh(in  x int)
BEGIN  declare  i  int  default  0 ; #声名一个变量, i变量 ,int数据类型  条件
  DROP  table if  EXISTS  abc; 
create  table  abc (id  int(10)) ; 
while (i<x) DO   
 INSERT  into  abc VALUES (i);   
 set i=i+1; 
end WHILE ; 
select * from  abc ;
END//
call hh(100)
==================================================
循环语句:
数据库中有三种:
while ......条件...do  ....执行语句块....end  while
loop........end  loop
repeat ........until   end  repeat
====================================================
if判断语句
if语句的单分支:
if  条件   then 
         执行sql1
else
   执行sql2
end  if ;
================================================================
if判断语句
if语句的多分支:
if  条件 1  then 
         执行sql1
else if   条件2
   执行sql2
else  if  条件3
   执行sql语句3
else 
 执行语句4
end  if ;
end if ;
end  if ;