存储过程的作用:有助于提高应用程序的性能。存储过程可以不必发送多个冗长的SQL语句
废话不说多,直接实操
##实现num的相加
delimiter $$
CREATE PROCEDURE test1 ()
begin
declare num int default 0; -- 声明变量,赋默认值为0
select num+20;
end $$
delimiter ; --将结束符修改成;
call test1(); -- 调用存储过程
drop procedure test1 --如果不需要此存储函数开源删除咯
set赋值操作
delimiter $$
CREATE PROCEDURE test2 ()
begin
declare num int default 0;
set num =50; -- 给num变量赋值
select num;
end $$
delimiter ;
call test2();
into的使用方法
delimiter $$
CREATE PROCEDURE test3 ()
begin
declare num int default 0;
select count(1) into num from t_student_info; --计算t_student_info表的个数用num来记录
select num;
end $$
delimiter ;
drop procedure test3; 删除该存储函数
call test3();
if的使用
delimiter $$
CREATE PROCEDURE test4 ()
begin
declare id int default 1;
declare class_name varchar(20);
if id=1 then
set class_name='要多久你才可以爱上我!';
elseif id=2 then
set class_name='不再让自己遗憾了';
else
set class_name='不用想了,谁都不爱我,我只爱我自己';
end if;
select class_name;
end $$
delimiter ;
call test4();
mysql> delimiter;
ERROR:
DELIMITER must be followed by a 'delimiter' character or string
使用delimiter;会报错,一定要带空格
定义一个输入参数
delimiter $$
CREATE PROCEDURE test5 (in id int)
begin
declare class_name varchar(20);
if id=1 then
set class_name='我和xhell脚本的if不一样!';
elseif id=2 then
set class_name='我和python中的if语法有一点带你不一样';
else
set class_name='不用想了,不靠别人';
end if;
select class_name;
注:存储过程中声明了 class_name 变量并对其进行了赋值,但并没有通过 SELECT 语句来显示其值。你需要在存储过程末尾添加 SELECT class_name; 语句,以便在调用存储过程时返回 class_name 的值
end $$
delimiter ;
call test5(3);
case的使用
delimiter $$
CREATE PROCEDURE test6 (in month int,out season varchar(10))
begin
case
when month >=1 and month<=3 then
set season='spring';
when month >=4 and month<=6 then
set season='summer';
when month >=7 and month<=9 then
set season='autumn';
when month >=10 and month<=12 then
set season='winter';
end case;
end $$
delimiter ;
call test6(9,@season); -- 定义会话变量来接收test8存储过程返回的值
select @season;
@xxx:代表定义一个会话变量,整个会话都可以使用,当会话关闭(连接断开)时销毁
@@xxx:代表定义一个系统变量,永久生效。
while循环的使用
delimiter $$
CREATE PROCEDURE test7 (in count int)
begin
declare total int default 0;
declare i int default 1;
while i<=count do
set total=total+i;
set i=i+1;
end while;
select total;
end $$
delimiter ;
call test7(10);
repeat的使用
delimiter $$
CREATE PROCEDURE test7 (count int) -- 默认是输入(in)参数
begin
declare total int default 0;
repeat
set total=total+count;
set count=count-1;
until count=0 -- 结束条件,注意不要打分号
end repeat;
select total;
end $$
delimiter ;
call test8(10);
使用 select total; 语句输出 total 的最终值。
total 是局部变量,只在该存储过程内部有效。
而 @total 是用户变量,可以在整个会话中使用和共享。
loop的使用
delimiter $$
CREATE PROCEDURE test9 (count int) -- 默认是输入(in)参数
begin
declare total int default 0;
sum:loop -- 定义循环标识
set total=total+count;
set count=count-1;
if count < 1 then
leave sum; -- 跳出循环
end if;
end loop sum; -- 标识循环结束
select total;
end $$
delimiter ;
call test9(10);
创建一张临时表:
create temporary table temp_table(
id int,
name varchar(10)
);
insert into temp_table values (1,'xiaoxiaowang');
select * from temp_table ;
注意:临时表示查询不到的
show tables; -- 不会显示临时表的存在
测试存储过程创建临时表是可以查到的,但是在存储函数中是查看不到的,结果会报错:
create procedure pro1()
begin
create temporary table temp_table(
id int
);
insert into temp_table values(1);
select * from temp_table;
end;
call pro1();
测试存储函数创建临时表
create function fun2()
returns int
begin
declare id int ;
create table temp_table(
id int
);
insert into temp_table values(1);
select id from into id temp_table;
return id;
end;
怎么查看自己创建了多少的存储过程????????????
SHOW PROCEDURE STATUS WHERE Db = 'your_database_name';
咱们的业务应该放到咱们的业务层,而不是把业务滞留到数据库来处理,将业务和数据库严重耦合在一起了!这是导致公司开发不使用存储过程的