数据库存储过程

目录

 

简介

语法

总结


简介

存储过程和函数:类似于java中的方法

好处:

 1、提高代码的重用性

2、简化操作

3、减少了编译次数并且减少了和数据库服务器的连接次数,提高了效率

 

 

#存储过程

含义:一组预先编译好的sql语句的集合,理解成批处理语句

 

语法

#一、创建语法

create procedure 存储过程名 (参数列表)

 begin       / /begin就相当于大括号

              存储过程体

 end

注意:

1、参数列表包含三部分

参数模式、参数名、参数类型

举例:

  IN stuname varchar(20)

 

1、参数模式:

IN  在 :该参数可以作为输入,也就是改参数需要调用方传入值

OUT 出来  出口:改参数可以作为输出,也就是该参数可以作为返回值

INOUT    :该参数既可以作为输入又可以作为输出,也就是改参数既需要传入值,又可以返回值

2、如果存储过程体仅仅一句话,begin end可以省略

存储过程体中的每条SQL语句的结尾必须加分号

存储过程的结尾可以使用DELIMTTER重新设置

语法:

  DELIMITER结束标记

案例:

 DELIMITER 是结束标记

二、调用语法

CALL 存储过程名(实参列表);

 

#1. 空餐列表

#案例:插入到admin表中五条记录

DELIMITER $

create procedure mypl()

begin

    insert into admin(username,password) values('j',0),('s',2),('j',0),('s',2),('j',0);

end $

 

call myp1()$

 

#创建带in模式参数的存储过程

传递参数得到对应信息

create procedure myp2(in beautyname varchar(20))

begin

     select bo.*

    from boys boauty b on bo.id=b.boyfrinend_id

   where b.name=beautyname

end $

调用: call myp2('xiaoming')$

 

声明初始化和赋值

create procedure myp3(in username varchar(20),in password varchar(20))
begin
    declare result  int  default 0; #声明并初始化
     select count(*) into result #赋值
      from admin
      where amdin.username=username
      and admin.password=password;
      select if(result>0,'成功','失败');   #使用

end$

 #创建带out模式的存储过程

案例:根据一个名返回对应的名

 

create procedure myp5(in name varchar(20),out boyname)

begin

      select bo.name into boyname    将查询结果注入到boyname里面

      select bo.name, bo.usercp into b1,b2   将两个值注入到b1和b2里面

      from boys bo

      innert join beatu*****

end

#调用

set@bname$

call myp5('小赵',@bname)$   #调用了

select @bname$  #查看

 

带inout模式参数的存储过程

传入a和b 两个值,最终a和b都翻倍并返回

create procedure myp8(inout a int, inout b int)

begin

       set a=a*2;

       set b=b*2;

end $

调用(传值是变量不能是常量 因为要修改)

set @m=10$

set @n=20$

call myp8(@m,@n)$

总结

in out inout 参数  比如in name varchar(20)

 

DELIMITER #声明结束是以结束

 

create procedure myp1(in name1 varchar(20),out boyname)

begin

        declare result  int  default 0; #声明并初始化

       select name into name1  #将查询结果name赋值给name1

       from *****

end $

 

调用:   in 和inout需要提前声明

set@bname$   #提前声明

call myp5('小赵',@bname)$  #调用

select @bname$  #查看

 

 

在存储过程中,如果提前声明则不需要加@,对于@可以不用声明,比如@a=10;在if中@a为10,但如果直接if a=10是错的,同理如果没有加@,在if中也不能加@

declare t varchar(200) default '';

 

 

对于if还是一个一个的判断为好;if a=10 then set b=10;set c=20;end if;这样能执行两条;

 

drop PROCEDURE addresulttest;
delimiter $
CREATE PROCEDURE addresulttest(in n int,out sum int)
BEGIN 
 declare i int;
 set i=1;
 set sum=0;
while i<=n DO 
 set sum=sum+i;
 set i=i+1;
end WHILE;

SELECT sum;
END $
delimiter;
set@sum=-1;
call addresulttest(10,@sum);
delimiter ;
@sum  ;
drop PROCEDURE storetest;
delimiter $

CREATE PROCEDURE storetest()

BEGIN 
declare s int ;
declare t varchar(200) default '';
declare i int;
declare n int;
declare sum int;
declare m int;
set i=0;
set sum=0;
set n=10;
select pass from user where userid="admin";
insert into user VALUES("admin3","admin3");



/*where循环*/
WHILE i<=n and i>=0 DO
set sum=sum+i;
set i=i+1;
end while;
/*case选择*/

set @q=10;

if @q=10  then  set i=100; set sum=100;end if;

SELECT i;
SELECT sum;
END $

delimiter;
call storetest();
delimiter ;

设置离开标志

在begin前面加上一个名:,在合适的位置加上leave和那个标志便可以离开,这时候前面的修改都有效


drop PROCEDURE storetest;
delimiter $
create  PROCEDURE storetest(
in username varchar(30),inout lea int)

leave_lable:BEGIN 
  declare insert_result int default 10;
  set @a=null;
  set @b=null;

  SELECT userid into @a from user where userid=username;
/*如果找不到用户名则不再插入*/
    if @a is null THEN set insert_result=0; set lea=100;LEAVE leave_lable; end if;
  
  SELECT insert_result;
END $

delimiter;
set @lea=10;
call storetest("admin5",@lea);
SELECT @lea;
delimiter ;

条件判断

全部改变,不用if和else了,用case when

不需要加case,符合某一个条件执行完后面的内容会自动跳出case

case 
when @a is null then set @c=10;set @d=10;
/*when 条件2 then执行下面内容*/
else set @c=20;set @d=20;
end case;

 

posted @   贪睡地蜗牛  阅读(181)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 没有源码,如何修改代码逻辑?
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
点击右上角即可分享
微信分享提示