SQL WHILE 循环 嵌套

本文探讨了在SQL循环语句中重新赋值内循环变量的重要性,通过实例展示了不重新赋值可能导致的问题,并提供了正确的做法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

摘录自:http://imysqldba.blog.51cto.com/1222376/595433

 - 内循环变量在选环后要重新赋初值,否则不能循环。


代码如下:

  1. DELIMITER $$ 
  2.  
  3. USE `qqfs_db_items`$$ 
  4.  
  5. DROP PROCEDURE IF EXISTS `qqsf_proc_InsertItemTest`$$ 
  6.  
  7. CREATE DEFINER=`root`@`%` PROCEDURE `qqsf_proc_InsertItemTest`( 
  8.  i_PlayerCount INT) COMMENT '插入道具表测试' 
  9.  BEGIN 
  10.   DECLARE a INT DEFAULT 1; 
  11.   DECLARE b TINYINT DEFAULT 1; 
  12.   WHILE (a <= i_PlayerCount) DO 
  13.   -- repeat 
  14.     
  15.     
  16.    SET a = a + 1; 
  17.    -- select a; 
  18.    WHILE (b <=40) DO 
  19.     INSERT INTO qqfs_tbl_items (AuthID,Slot,CID,GTID,Nums,Endtime,Flags,UseInfo) 
  20.     VALUES 
  21.     (a,b,0,0,1,NOW(),0,1); 
  22.     SET b = b + 1; 
  23.     -- select b; 
  24.    END WHILE; 
  25.     
  26.    SET b = 1; 
  27.    -- select a; 
  28.    -- until a >= i_PlayerCount 
  29.   -- end repeat; 
  30.    END WHILE; 
  31.  END$$ 
  32.  
  33. DELIMITER ; 

### 关于SQL练习题中循环嵌套的内容 在处理复杂的业务逻辑或者特定的数据转换需求时,有时需要利用编程语言来实现带有循环结构的操作。然而,在标准的SQL语句里并没有直接支持像其他高级程序设计语言那样的显式循环控制关键字(如for、while)。但是可以通过存储过程或函数的形式间接达成目的。 对于想要模拟循环效果的情况,可以考虑采用递归公用表表达式(CTE),这是一种强大的特性,允许在一个查询内部多次引用其定义的结果集。下面是一个简单的例子展示如何通过递归来遍历树形结构的数据: ```sql WITH RECURSIVE tree AS ( -- 锚成员部分:选择根节点 SELECT id, parent_id, name FROM categories WHERE parent_id IS NULL UNION ALL -- 递归成员部分:加入子节点直到没有更多匹配项为止 SELECT c.id, c.parent_id, c.name FROM categories c INNER JOIN tree t ON c.parent_id = t.id ) SELECT * FROM tree; ``` 此脚本展示了如何构建一个层次化的视图,其中`categories`表包含了类别及其父类别的关系。这里使用了`UNION ALL`将初始的选择结果与后续每次迭代产生的新记录组合起来形成最终输出[^1]。 另外一种情况是在某些数据库管理系统中编写PL/SQL (Oracle), T-SQL(Microsoft SQL Server),或是MySQL里的存储过程中运用真正的循环机制完成更复杂的工作流。例如,在MySQL环境下创建一个简单的过程来进行重复性的插入操作: ```sql DELIMITER $$ CREATE PROCEDURE insert_numbers() BEGIN DECLARE i INT DEFAULT 0; WHILE i < 10 DO INSERT INTO numbers VALUES(i); SET i = i + 1; END WHILE; END$$ DELIMITER ; ``` 上述代码片段说明了一个名为`insert_numbers()`的过程,该过程会在numbers表中依次插入从0到9共十个整数值。值得注意的是不同DBMS间语法可能存在差异,因此具体应用时需参照相应文档调整细节[^2]。 #### 使用游标的场景 当面对大量数据逐行处理的需求时,还可以借助游标(Cursor)配合循环体工作。不过这种方式通常效率较低,除非绝对必要不建议频繁使用。以下是基于T-SQL的一个基本框架用于演示这一概念: ```sql DECLARE @name NVARCHAR(50); -- 声明并打开游标 DECLARE cur CURSOR FOR SELECT Name FROM Employees ORDER BY EmployeeID ASC; OPEN cur; FETCH NEXT FROM cur INTO @name; WHILE @@FETCH_STATUS = 0 BEGIN PRINT 'Processing employee: '+@name; FETCH NEXT FROM cur INTO @name; END CLOSE cur; DEALLOCATE cur; ``` 这段示范性代码实现了按顺序读取Employees表内的员工姓名,并打印出来。实际开发中应谨慎评估性能影响再决定是否采取这种方法[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值