数据库存储过程
目录
简介
存储过程和函数:类似于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;
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 没有源码,如何修改代码逻辑?
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战