游标的嵌套用法

其实存储过程就是对数据库的使用的扩充,有时候我们使用SQL无法完成一些复杂逻辑,就只能靠过程了,游标又是模拟C++,Java等语言按行处理的思路,不同于SQL按集合处理的思路,

有时候我们需要游标嵌套,其实就类似于鱼 for()

for()

类似这样的嵌套循环,还是非常简单的,下面看个示例

CREATE PROCEDURE [dbo].[SP_reportEcert]
AS
BEGIN 
declare @id_owner varchar(20),@ownername varchar(20),
@mcertid varchar(20),
@mgrarea varchar(20),
@mcertstate varchar(20),
@contactor varchar(20),
@address varchar(20),
@origorgan varchar(20),
@countVehicle integer
create table #TMP (ownername varchar(20),
mcertid varchar(20),
mgrarea varchar(20),
mcertstate varchar(20),
contactor varchar(20),
address varchar(20),
origorgan varchar(20),
countVehicle integer)
DECLARE C1 CURSOR FOR select top 100 id_owner,ownername,mcertid,mgrarea,mcertstate,contactor,address,origorgan from t_owner --外层循环
OPEN C1
FETCH NEXT  FROM C1 INTO @id_owner ,@ownername ,@mcertid ,@mgrarea ,@mcertstate,@contactor ,@address ,@origorgan ;
WHILE @@fetch_status = 0 --循环条件(类似while true)
begin
DECLARE c2 CURSOR FOR  select count(*) from t_vehicle where id_owner = @id_owner;
OPEN C2    --外层
FETCH NEXT  FROM C2 INTO @countVehicle;
WHILE @@fetch_status = 0
begin
insert into #TMP values(@ownername ,@mcertid ,@mgrarea ,@mcertstate,@contactor ,@address ,@origorgan ,@countVehicle);
FETCH NEXT  FROM C2 INTO @countVehicle;
end
close c2
DEALLOCATE c2
FETCH NEXT  FROM C1 INTO @id_owner ,@ownername ,@mcertid ,@mgrarea ,@mcertstate,@contactor ,@address ,@origorgan ;
end
close c1
DEALLOCATE c1
select * from #TMP;
END
时间: 2024-10-27 11:18:23

游标的嵌套用法的相关文章

分组PARTITION BY及游标CURSOR的用法

基础数据表: select * from dbo.RecommendationChanelVersionRelation: 数据如下: 要求按照ChannelVersionID分组,对每组中的OrderId根据ID由小到大的顺序,更新为1,2,3,4,5... 方法一(分组PARTITION BY): IF OBJECT_ID('tempdb..#tempdt') IS NOT NULLDROP TABLE #tempdt;select RowNumOrderByChannelVersionID

ASP,VB,JAVASCRIPT 拼HTML时多层单引号双引号嵌套用法,实用(转载)

s.html中的单引号.双引号及其转义使用(转) 收藏   在js中对相关字符做判断或取值,或者拼HTML赋值的时候很多情况下都会用到这些,也是我刚刚遇到的问题,通过参考下面的这篇文章,一切都解决了,摘抄下来做个笔记!呵呵... ------ 在一个网页中的按钮,写onclick事件的处理代码,不小心写成如下:<input value="Test" type="button" onclick="alert(""OK"&q

SQL 游标 Cursor 基本用法

/* table1结构如下 id int name varchar(50) */ declare @id int declare @name varchar(50) declare cursor1 cursor for --定义游标cursor1 select * from table1 --使用游标的对象(跟据需要填入select文) open cursor1 --打开游标 fetch next from cursor1 into @id,@name --将游标向下移1行,获取的数据放入之前定

mysql开发之---使用游标双层嵌套对总表进行拆分为帖子表和回复表

注意点: (1)进行拆分的总表表名是不同的,所以创建临时表,把总表的数据先插入临时表 (2)为了避免最外层游标轮询数据结束时,抛出 not found 退出程序,不会执行关闭游标等后续操作,定义continue handler, declare continue handler for not found set done1=1; 1.1.外部存储过程调用主存储过程 CREATE PROCEDURE `bbs_split_thread_post_outer`(IN `in_tabname` va

sql server 游标的简单用法

sql server游标: --定义游标 declare cursor1 cursor for select ID,Name from A --打开游标 open cursor1 declare @id int declare @name varchar(50) declare @n int declare @i int=1 set @n=(select COUNT(1) from A) while(@i<@n) begin set @[email protected]+1 fetch next

Sql语句中Like嵌套用法

一般的Like用法: SELECT U_NAME FROM T_USER WHERE U_NAME LIKE '%A%' 但是,我此次like关键字后面的对应值是一个变量,需要用select语句来实现,用了CONCAT 关键字,将select到的结果与“%”连接起来,才得以实现所需功能,如下所示: SELECT U_NAME FROM T_USER WHERE U_NAME LIKE CONCAT('%',CONCAT((SELECT STUDENT_NAME FROM T_CLASS WHER

for嵌套用法 选择图形 举例

static void Main(string[] args) { while (true) { Console.Write("请选择您想要得到的图形?A正方形:B三角形:C平行四边形:D菱形:E梯形:"); string n = Console.ReadLine(); Console.Write("请输入数字:"); int m = Convert.ToInt32(Console.ReadLine()); switch (n) { case "A&quo

less中的嵌套

嵌套:less文件在网页编写时很常用,尤其是它的嵌套属性,可以使代码的结构清晰,易于阅读和理解:在团队开发中,可以防止命名重复,可提升开发效率.嵌套用法(exp):#:home{    color:blue;    #top{        border:outset;        #conter{            color:red;            background:url("img/globle.jpg);            }         }    #bot{ 

shell脚本的引用用法说明

#!/bin/bash#演示全引用和部分引用#双引号和没引号的区别variable1=2010echo "$variable1"echo $variable1variable2="x    y     z"    ##字符之间用多个空格隔开echo "$variable2"           ##双引号 echo $variable2             ##没引号 #单引号和双引号的区别echo "$PWD is the cur