Mysql存储过程--循环查询

来源:互联网 发布:时时彩遗漏数据软件 编辑:程序博客网 时间:2024/05/28 03:02


MySQL有循环语句操作,while 循环、loop循环和repeat循环

mysql 操作同样有循环语句操作,网上说有3中标准的循环方式: while 循环 、 loop 循环和repeat循环。还有一种非标准的循环: goto。 鉴于goto 语句的跳跃性会造成使用的的思维混乱,所以不建议使用。

这几个循环语句的格式如下:
WHILE……DO……END WHILE
REPEAT……UNTIL END REPEAT
LOOP……END LOOP
GOTO。

目前我只测试了 while 循环:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
delimiter $$    // 定义结束符为 $$
dropprocedureif exists wk; // 删除 已有的 存储过程
createprocedurewk()      //  创建新的存储过程
begin
declareiint;          // 变量声明
seti = 1;     
while i < 11 do           // 循环体
insertintouser_profile (uid) values(i);
seti = i +1;
endwhile;
end$$               // 结束定义语句
 
// 调用
 
delimiter ;          // 先把结束符 回复为;
call wk();

delimter : mysql 默认的 delimiter是; 告诉mysql解释器,该段命令是否已经结束了,mysql是否可以执行了。

这里使用 delimiter 重定义结束符的作用是: 不让存储过程中的语句在定义的时候输出。

创建 MySQL 存储过程的简单语法为:

?
1
2
3
4
5
6
7
CREATEPROCEDURE存储过程名称( [in|out| inout] 参数 )
 
BEGIN
 
Mysql 语句
 
END

调用存储过程:

?
1
call 存储过程名称() // 名称后面要加()
?
1
<spanstyle="color: rgb(57, 57, 57); font-family: verdana, 'ms song', Arial, Helvetica, sans-serif; font-size: 14px; line-height: 21px; background-color: rgb(250, 247, 239);">二 、 REPEAT 循环</span>
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<prename="code"class="html">delimiter //
dropprocedureif exists looppc;
createprocedurelooppc()
begin
declareiint;
seti = 1;
 
repeat
insertintouser_profile_company (uid) values(i+1);
seti = i + 1;
until i >= 20
 
endrepeat;
 
 
end//
 
---- 调用
call looppc()

三、 LOOP 循环


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
delimiter $$
dropprocedureif exists lopp;
createprocedurelopp()
begin
declareiint;
seti = 1;
 
lp1 : LOOP              // lp1 为循环体名称 LOOP 为关键字insertintouser_profile (uid) values(i);
seti = i+1;
 
if i > 30 then
leave lp1;              // 离开循环体
endif;
endLOOP;              // 结束循环
end$$

四、

1、if条件语句


复制代码
delimiter \\CREATE PROCEDURE proc_if ()BEGIN        declare i int default 0;    if i = 1 THEN        SELECT 1;    ELSEIF i = 2 THEN        SELECT 2;    ELSE        SELECT 7;    END IF;END\\delimiter ;
复制代码

2、循环语句

while循环

复制代码
delimiter \\CREATE PROCEDURE proc_while ()BEGIN    DECLARE num INT ;    SET num = 0 ;    WHILE num < 10 DO        SELECT            num ;        SET num = num + 1 ;    END WHILE ;END\\delimiter ;
复制代码

repeat循环

复制代码
delimiter \\CREATE PROCEDURE proc_repeat ()BEGIN    DECLARE i INT ;    SET i = 0 ;    repeat        select i;        set i = i + 1;        until i >= 5    end repeat;END\\delimiter ;
复制代码

loop循环

iterate loop_label退出循环

复制代码
BEGIN        declare i int default 0;    loop_label: loop                set i=i+1;        if i<8 then            iterate loop_label;        end if;        if i>=10 then            leave loop_label;        end if;        select i;    end loop loop_label;END
复制代码

 

 

3、动态执行SQL语句

动态执行SQL语句,也就是执行一个存储过程来动态执行SQL语句

举例:有这样一张表

 

 

写一个存储过程无参,获取表里id大于11的数据

PREPARE prod FROM存储过程里将字符串解析为sql语句执行,后面跟字符串类型的sql语句

EXECUTE prod USING替换sql语句中的占位符,后面跟要替换占位符的、占位符变量,(sql语句中的占位符是?号)

 

复制代码
delimiter $$DROP PROCEDURE IF EXISTS proc_sql $$ -- 判断proc_sql存储过程存在删除CREATE PROCEDURE proc_sql () -- 创建proc_sql存储过程BEGIN    declare p1 int;  -- 设置p1变量    set p1 = 11;     -- 赋值p1变量等于11    set @p1 = p1;    -- 赋值字符串占位符变量等于p1    PREPARE prod FROM 'select * from tb2 where nid > ?';  -- 解析字符串为sql语句    EXECUTE prod USING @p1;   -- 执行sql语句,并且用占位符变量替换sql语句中的?号    DEALLOCATE prepare prod;  -- 释放解析和执行sql语句END $$delimiter ;
复制代码

执行存储过程,动态执行sql语句

CALL proc_sql();  -- 执行存储过程,动态执行sql语句

 

 

写一个存储过程有参,动态传参获取数据

复制代码
delimiter $$DROP PROCEDURE IF EXISTS proc_sql $$ -- 判断proc_sql存储过程存在删除CREATE PROCEDURE proc_sql (          -- 创建proc_sql存储过程    in zfchsql CHAR(90),       --  zfchsql接收字符串最大90字符,接收sql语句    in shuzi INT(20)           --  shuzi接收整数类型,最大20字符,接收一个id数) BEGIN        -- 因为解析字符串为sql语句,和替换sql语句的占位符,需要用户变量,也就是有@的变量,所以需要重新赋值成用户变量        SET @zfchsql = zfchsql;        SET @shuzi = shuzi;    PREPARE prod FROM @zfchsql;  -- 将接收到的字符串解析为sql语句    EXECUTE prod USING @shuzi;   -- 将接收到的整数,替换sql语句中的?号占位符    DEALLOCATE prepare prod;  -- 释放解析和执行的sql语句END $$delimiter ;
复制代码

传入参数动态执行sql语句

CALL proc_sql('select * from usr where id > ?',5);  -- 传入参数动态执行sql语句

 

 

重点:动态执行sql语句,可以防止sql注入,

CALL proc_sql('select * from usr -- where id > ?',5);  -- 传入参数动态执行sql语句


五、游标的方式实现SQL循环(性能不佳不建议使用)

我们使用SQL语句处理数据时,可能会碰到一些需要循环遍历某个表并对其进行相应的操作(添加、修改、删除),这时我们就需要用到咱们在编程中常常用的for或foreach,但是在SQL中写循环往往显得那么吃力,翻遍网上的资料,找不到几个正确的并能执行的循环处理数据的方法,在这里,我来给大家分享一下!

要SQL中写类似for循环,我这里使用的是SQL中的游标来实现,当然SQL中也有for loop、while do等,我这里仅以使用游标方式来进行示例,其它的方式大家有兴趣可以研究一下,成功的同学可以在下面回复一下并把代码贴出来,与大家分享!

闲话少说,上示例:

1. 利用游标循环更新、删除MemberAccount表中的数据

复制代码
DECLARE My_Cursor CURSOR --定义游标
FOR (SELECT * FROM dbo.MemberAccount) --查出需要的集合放到游标中
OPEN My_Cursor; --打开游标
FETCH NEXT FROM My_Cursor ; --读取第一行数据
WHILE @@FETCH_STATUS = 0
BEGIN
--UPDATE dbo.MemberAccount SET UserName = UserName + 'A' WHERE CURRENT OF My_Cursor; --更新
--DELETE FROM dbo.MemberAccount WHERE CURRENT OF My_Cursor; --删除
FETCH NEXT FROM My_Cursor; --读取下一行数据
END
CLOSE My_Cursor; --关闭游标
DEALLOCATE My_Cursor; --释放游标
GO
复制代码

2. 利用游标循环更新MemberService表中的数据(更新每个用户所购买服务的时间)

复制代码
DECLARE @UserId varchar(50) 
DECLARE My_Cursor CURSOR --定义游标
FOR (SELECT UserId FROM dbo.MemberAccount) --查出需要的集合放到游标中
OPEN My_Cursor; --打开游标
FETCH NEXT FROM My_Cursor INTO @UserId; --读取第一行数据(将MemberAccount表中的UserId放到@UserId变量中)
WHILE @@FETCH_STATUS = 0
BEGIN
PRINT @UserId; --打印数据(打印MemberAccount表中的UserId)
UPDATE dbo.MemberService SET ServiceTime = DATEADD(Month, 6, getdate()) WHERE UserId = @UserId; --更新数据
FETCH NEXT FROM My_Cursor INTO @UserId; --读取下一行数据(将MemberAccount表中的UserId放到@UserId变量中)
END
CLOSE My_Cursor; --关闭游标
DEALLOCATE My_Cursor; --释放游标
GO
复制代码

上面的两个例子应该可以解决我们在SQL中使用循环的所有需求,如果不能满足,自己可以根据以上两个示例进行扩展,希望能帮各位解决一些类似的问题。



文章参考:

https://www.cnblogs.com/adc8868/p/7028827.html?utm_source=itdadao&utm_medium=referral

http://www.jb51.net/article/52251.htm

https://www.cnblogs.com/zengen/archive/2011/08/10/2133423.html


?

阅读全文
'); })();
0 0
原创粉丝点击
热门IT博客
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 奥术乾坤 奥术符文 奥术魔刃 奥术光辉 奥术王座 奥术至高 奥术奥术 奥术箭神 三年级奥术 奥术跃迁 奥术能量 奥术之巅 奥术是什么 奥术打击 奥术暴击 奥术篇章 永夜骑士奥术起源 网游之奥术至高 奥术神座txt下载 奥术主宰祈求者哀鸣 网游奥术至高 奥术水晶怎么获得 奥术符文哪里交 奥术起源txt下载 怀旧服奥术水晶 奥术神座txt精校版下载 奥术光辉宝典 魔兽世界奥术水晶 怀旧服奥术水晶怎么大量获得 奥术符文任务 奥术神座txt下载精校 魔兽奥术水晶 艾泽拉斯之奥术苍穹 奥术水晶哪里多 奥术资本家 汃汃 奥术之主 脑神经 奥术世纪 风之天 奥术起源 永夜骑士 奥术王座txt下载全本 永夜骑士 奥术起源 奥术构装 诡道荒行