database.sarang.net
UserID
Passwd
Database
DBMS
MySQL
PostgreSQL
Firebird
Oracle
Informix
ㆍSybase
MS-SQL
DB2
Cache
CUBRID
LDAP
ALTIBASE
Tibero
DB 문서들
스터디
Community
공지사항
자유게시판
구인|구직
DSN 갤러리
도움주신분들
Admin
운영게시판
최근게시물
Sybase Q&A 2037 게시물 읽기
No. 2037
cursor 사용시 top 을 사용하면 이상해집니다.
작성자
영빈~(backfish)
작성일
2007-09-12 13:46ⓒ
2007-09-12 13:46ⓜ
조회수
7,593

1. top을 사용하지 않았을때


declare testcur cursor for select    name from model..sysobjects  where type = 'S'

go


declare @name char(50)

open testcur


fetch testcur into @name

while (@@sqlstatus = 0)

begin

 select 'fetch :' +@name + ' sqlstatus: ' + convert(char(2), @@sqlstatus)

 fetch testcur into @name

end


select 'fetch :' +@name + ' sqlstatus: ' + convert(char(2), @@sqlstatus)

close testcur

deallocate cursor testcur

go

=========================>결과

마지막 record를 읽고 나서 다음 record 읽을때 @@sqlstatus 값을 변경시킴

fetch :sysqueryplans                                      slqstatus: 0  

fetch :sysqueryplans                                      slqstatus: 2  


2. top 을 사용한경우

declare testcur cursor for select  top 2  name from model..sysobjects  where type = 'S'

go


declare @name char(50)

open testcur


fetch testcur into @name

while (@@sqlstatus = 0)

begin

 select 'fetch :' +@name + ' sqlstatus: ' + convert(char(2), @@sqlstatus)

 fetch testcur into @name

end


select 'fetch :' +@name + ' sqlstatus: ' + convert(char(2), @@sqlstatus)

close testcur

deallocate cursor testcur

go

=========================>결과

마직막 record를 읽고 바로 @@sqlstatus 값도 변경시킴

fetch :sysobjects                                         sqlstatus: 0 

fetch :sysindexes                                         sqlstatus: 2 


이 글에 대한 댓글이 총 4건 있습니다.

뭐가 틀린거지요?

잘 모르겠는데요

지연님이 2007-09-12 13:49에 작성한 댓글입니다. Edit

top을사용하지 않았을때 일반적으로


fetch

while @@sqlstatus = 0

begin

     fetch된값에 대한처리

     fetch

end


구조로함


하지만 top을 사용한경우


fetch

while @@sqlstatus = 0

begin

     fetch된값에 대한처리

     fetch

end

     fetch된값에 대한처리


구조로되어야함

만일 @@sqlstatus 값이 2여서 fetch된 값에 대한 처리를 하지 않을경우

1건누락됨


버그인듯

영빈~(backfish)님이 2007-09-12 13:51에 작성한 댓글입니다.
이 댓글은 2007-09-12 13:58에 마지막으로 수정되었습니다.

테스트 해보고 알았습니다
데이타가 3건있는 table로 테스트를 해봤습니다



먼저 정상적인 상태는 내가 원하는 대로 나왔습니다
 -----------------------------------------------------------------------
 fetch :1                                                  sqlstatus: 0

 fetch :2                                                  sqlstatus: 0

 fetch :3                                                  sqlstatus: 0

 ---------
 while end

 -----------------------------------------------------------------------
 fetch :3                                                  sqlstatus: 2







그러나 top 3로 한경우는 한번 덜수행되는 군요

-----------------------------------------------------------------------
 fetch :1                                                  sqlstatus: 0

 fetch :2                                                  sqlstatus: 0

 ---------
 while end

 -----------------------------------------------------------------------
 fetch :3                                                  sqlstatus: 2






이건 확연한 버그 같은데요~(수정을 하던가, 아예 수정 안하는 걸로 해서 while 문 밖에 한번 fetch한걸 처리 해줘야 겠군요...

sybase에서 근무하시는거 같은데, 어느 방향으로 할건지 알려주세요

그래야 개발하고 나서 또 수정하는 일이 발생하지 않겠죠

select into inlieview도 문제가 있던데요

지연님이 2007-09-12 14:57에 작성한 댓글입니다.
이 댓글은 2007-09-12 15:17에 마지막으로 수정되었습니다. Edit

sybase에서 근무 안하는데요.


지연님이 넘 잘하셔서... 지연님이 sybase에서 근무하시는 줄 알았어요..

영빈~(backfish)님이 2007-09-12 16:38에 작성한 댓글입니다.
[Top]
No.
제목
작성자
작성일
조회
2040UNION 대신 다른 방법으로 수정해야 하는데요 [1]
왕초보
2007-09-19
6424
2039sybase를 처음써봐서 그러는데 조금 이상하네요 [2]
김선진
2007-09-17
6634
2038시스템 테이블의 lock scheme변경 [3]
^^
2007-09-14
6780
2037cursor 사용시 top 을 사용하면 이상해집니다. [4]
영빈~
2007-09-12
7593
2035ODBC 로그 어디에서 보나요? [1]
초보
2007-09-07
7427
2034Sybase ODBC DSN 설정 추가하기. [1]
ODBC초보
2007-09-07
7535
2033Client에서 서버Sybase 접속하기??? [1]
궁금
2007-09-06
7888
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2024 DSN, All rights reserved.
작업시간: 0.016초, 이곳 서비스는
	PostgreSQL v16.2로 자료를 관리합니다