關於遊標狀態的一個問題,請指教!

liyanmingkong 2008-02-22 09:24:42
爲什麽 IF CURSOR_STATUS('local', 'mycursor' )>0 判斷不好用 ,而local換成 global 就可以 判斷成功

IF EXISTS(SELECT NAME FROM sysobjects
WHERE NAME = 'PK_Test' AND TYPE = 'P')
DROP PROCEDURE PK_Test

Go
CREATE PROCEDURE PK_Test
AS
--声明3个变量
declare @emp_cd varchar(5)
declare @emp_name varchar(20)

--声明一个游标mycursor,select语句中参数的个数必须要和从游标取出的变量名相同
declare mycursor cursor for select emp_cd,emp_name from m_employee

--打开游标
IF not EXISTS (SELECT name FROM sysobjects
WHERE name = 'm_customer' AND type = 'u')
goto EXCEPTION
open mycursor

--从游标里取出数据赋值到我们刚才声明的2个变量中
fetch next from mycursor into @emp_cd,@emp_name

--判断游标的状态
--0 fetch语句成功
---1 fetch语句失败或此行不在结果集中
---2被提取的行不存在
while (@@fetch_status=0)
begin

--显示出我们每次用游标取出的值
print '遊標成功取出一條數據'
print @emp_cd
print @emp_name

--用游标去取下一条记录
fetch next from mycursor into @emp_cd,@emp_name
end

--IF CURSOR_STATUS('local', 'mycursor' )>0
BEGIN

--关闭游标
CLOSE mycursor

--撤销游标
DEALLOCATE mycursor
END

--:異常処理
EXCEPTION:

--关闭游标
CLOSE mycursor

--撤销游标
DEALLOCATE mycursor

GO
...全文
65 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
wzy_love_sly 2008-02-22
  • 打赏
  • 举报
回复
好象该是局部,但怎么会是显示呵呵呢?
这个我也不特懂,等其他人帮忙吧!
liyanmingkong 2008-02-22
  • 打赏
  • 举报
回复
局部游标:只在声明阶段使用
全局游标:可以在声明它们的过程,触发器外部使用

能幫我詳細説明一下他們的不同 嗎
ojuju10 2008-02-22
  • 打赏
  • 举报
回复
謝謝,還是不大明白,declare @mycursor 和 declare mycursor 有什麽區別嗎

declare mycursor cursor for select emp_cd,emp_name from m_employee

默認定義是全局的 嗎?

---------
默认为局部游标
wzy_love_sly 2008-02-22
  • 打赏
  • 举报
回复
declare cursor_tb cursor for
select id ,name FROM tb
declare @name varchar(10),@con int
open cursor_tb
IF CURSOR_STATUS('global','cursor_tb')> 0
print '呵呵'
else
print '西西'
close cursor_tb
deallocate cursor_tb

结果:
呵呵


应该是默认全局吧
declare @mycursor的是游标变量,我说错了,以为就是local了
liyanmingkong 2008-02-22
  • 打赏
  • 举报
回复
謝謝,還是不大明白,declare @mycursor 和 declare mycursor 有什麽區別嗎

declare mycursor cursor for select emp_cd,emp_name from m_employee

默認定義是全局的 嗎?
wzy_love_sly 2008-02-22
  • 打赏
  • 举报
回复
declare cursor_tb cursor local for
select id ,name FROM tb
declare @name varchar(10),@con int
open cursor_tb
IF CURSOR_STATUS('local','cursor_tb')> 0
print '呵呵'
else
print '西西'
close cursor_tb
deallocate cursor_tb


果然错了

wzy_love_sly 2008-02-22
  • 打赏
  • 举报
回复
我对吗?
wzy_love_sly 2008-02-22
  • 打赏
  • 举报
回复
游标也有局部和全局两种类型

局部游标:只在声明阶段使用
全局游标:可以在声明它们的过程,触发器外部使用
wzy_love_sly 2008-02-22
  • 打赏
  • 举报
回复
declare @mycursor

用local
declare mycursor
用global


昵称被占用了 2008-02-22
  • 打赏
  • 举报
回复
你定义的是全局游标,判断局部游标当然找不到,改下定义吧

--声明一个游标mycursor,select语句中参数的个数必须要和从游标取出的变量名相同 
declare mycursor cursor for select emp_cd,emp_name from m_employee


======〉

--声明一个游标mycursor,select语句中参数的个数必须要和从游标取出的变量名相同
declare mycursor cursor local for select emp_cd,emp_name from m_employee




34,590

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧