标题:关于游标的问题!
只看楼主
power6d
Rank: 1
等 级:新手上路
帖 子:162
专家分:0
注 册:2006-5-23
 问题点数:0 回复次数:4 
关于游标的问题!
今天知道了数据库中原来还有个叫“游标”的东西,貌似还很重要,所以想问问各位高手,游标是个什么东西,在SQLSERVER中该怎么用,能举两个常用点的例子吗?我这里先谢谢了。

[此贴子已经被作者于2006-12-12 11:23:15编辑过]


搜索更多相关主题的帖子: 游标 数据库 SQLSERVER 例子 
2006-12-12 11:19
棉花糖ONE
Rank: 7Rank: 7Rank: 7
等 级:贵宾
威 望:32
帖 子:2987
专家分:0
注 册:2006-7-13
得分:0 

查帮助,里面有例子


26403021 sql群 博客 blog./user15/81152/index.shtml
2006-12-12 12:56
就这样自信
Rank: 1
等 级:新手上路
帖 子:30
专家分:0
注 册:2006-11-24
得分:0 
这里的“游标”就相当于C中的指针。好好理解吧!

2006-12-12 13:17
wkm2000
Rank: 1
等 级:新手上路
帖 子:119
专家分:0
注 册:2006-3-6
得分:0 

这里有个例子,拿去看看吧
CREATE procedure [dbo].[up_GetEquitsAll]
@sctype varchar(10), --存续/上市
@year varchar(4), --年度
@EquitType_id int, --设备类型内码
@builddepart_id int --建设单位内码
as
begin
declare @sql varchar(3000)
--创建输出表
create table #out( apply_id int, --非安设备内码
type_id int, --非安设备类型内码
classname varchar(64), --非安设备类型名称
dept_id int, --建设单位内码
builddeptname varchar(128), --建设单位名称
createdate datetime, --申请日期
name varchar(256), --设备名称
special varchar(256), --规格
unit varchar(16), --单位
num int, --数量
price money, --单价
invest money, --投资
reason varchar(1024), --配备理由
note varchar(1024), --备注
planname varchar(512), --计划名称
yearplantitle varchar(2000) null, --列入哪些年计划
adjustplantitle varchar(2000) null, --列入哪些年调整计划
canDelete bit --是否能删除[根据是否列入年计划,是否列入调整计划] )
--取出所有非安设备信息,插入到临时表中
set @sql = 'insert into #out(apply_id,type_id,classname,dept_id,builddeptname,createdate,name,special,unit,num,price,invest,reason,note)
select a.apply_id,a.type_id,b.classname,a.dept_id,c.name,a.createdate,a.name,a.special,a.unit,a.num,a.price,a.invest,a.reason,a.note
from tequitapply a, dequitclass b, zdumanager..tdepartdefine c
where a.type_id = b.id and a.dept_id = c.depart_id'
--根据@sctype的值进行过滤
set @sql = @sql + (' and sctype = ''' + @sctype +'''')
--根据@year的值进行过滤
if @year <> ''
begin
set @sql = @sql + ' and year(a.createdate) = ' + @year
end
--根据设备类型@equittype_id进行过滤
if @equittype_id <> -1
begin
set @sql = @sql + ' and a.type_id = ' + cast(@equittype_id as varchar(16))
end
if @builddepart_id <> -1
begin
set @sql = @sql + ' and a.dept_id = ' +cast(@builddepart_id as varchar(16))
end
--执行查询
exec(@sql)
*******************************************************************************************************************************************
--使用游标获取一个非安设备申请列入哪些年计划的名称
declare @apply_id int, @count int, @index int, @yearPlanTitle varchar(2000),@adjustPlanTitle varchar(2000), @canmake bit --是否可以删除
set @yearPlanTitle = ''
set @adjustPlanTitle = ''
set @count = 0
set @index = 1
declare title cursor for select apply_id from #out
open title
fetch next from title into @apply_id
while @@fetch_status = 0
begin
------------------------------------获取列入年计划名称字符串------------------------------------------------------------------------------------------------------
--创建临时表-(列入年计划的计划名称)
create table #planName(id int IDENTITY(1,1), planname varchar(512))--存放查询出来的计划名称结果集
insert into #planName(planname)
SELECT a.planname FROM tInvestPlan a, tPlanEquitR b, dbo.tEquitApply c
where a.plan_id = b.plan_id and b.apply_id = c.apply_id and c.apply_id = @apply_id order by a.createdate asc
--存储从临时表里面查出来的单个planname
declare @pName varchar(512)
--取出最大id[多少条记录]
select @count = max(id) from #planName
--循环处理表生成字符串
while (@index -1) < @count
begin
select @pName = planname from #planName where id = @index
set @yearPlanTitle = @yearPlanTitle + '<br>' + cast(@index as varchar(16)) + '、' + @pName
set @index = @index + 1
end
drop table #planName --删除临时表
---------------------------------------获取列入调整计划名称字符串----------------------------------------------------------------------------------------------------
set @count = 0
set @index = 1
--创建临时表-(列入调整计划的计划名称)

create table #adjustName(id int IDENTITY(1,1), planname varchar(512))--存放查询出来的计划名称结果集
insert into #adjustName(planname)
SELECT a.planname FROM tAdjustInvestPlan a, tAdjustPlanEquitR b, tEquitApply c
where a.plan_id = b.plan_id and b.apply_id = c.apply_id and c.apply_id = @apply_id order by a.createdate asc
--存储从临时表里面查出来的单个planname
declare @aName varchar(512)
--取出最大id[多少条记录]
select @count = max(id) from #adjustName
--循环处理表生成字符串
while (@index -1) < @count
begin
select @aName = planname from #adjustName where id = @index
set @adjustPlanTitle = @adjustPlanTitle + '\n' + cast(@index as varchar(16)) + '、' + @aName
set @index = @index + 1
end
drop table #adjustName --删除临时表
------------------------------------------------获取删除字段---------------------------------------------------------------------------------------------------------------
--获取列值[canmake = 0 已下达][列入年计划]
SELECT @canmake = a.canmake FROM tInvestPlan a, tPlanEquitR b, tEquitApply c
where a.plan_id = b.plan_id and b.apply_id = c.apply_id and c.apply_id = @apply_id
--获取列值[canmake = 0 已下达][列入年调整计划]
if @canmake <> 0
begin
select @canmake = a.canmake from tAdjustInvestPlan a, tAdjustPlanEquitR b, tEquitApply c
where a.plan_id = b.plan_id and b.apply_id = c.apply_id and c.apply_id = @apply_id
end
--更新表[#out]字段[年计划名称yearplantitle],[年调整计划名称字符串adjustplantitle],[是否能删除canDelete]-------------------------
update #out set yearplantitle = @yearPlanTitle, adjustPlanTitle = @adjustPlanTitle, canDelete = @canmake
where apply_id = @apply_id

fetch next from title into @apply_id
end
close title
deallocate title


MSN:wkm821215@ OICQ:49297869 ^_^
2006-12-14 13:57
冰封情愁
Rank: 1
等 级:新手上路
威 望:1
帖 子:32
专家分:0
注 册:2006-12-7
得分:0 
canDelete bit --是否能删除[根据是否列入年计划,是否列入调整计划] ) 括号放错了"(" 应该放在 bit 后面


"*************************************************************************************************************************
******************" 要删除这行

最后一行:close title
deallocate title
后加到 end
上面是我把楼上的代码COPY到查询分析器后发现的错误.^_^


2006-12-14 19:32



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-108978-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.108140 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved