/**********************************************************************************************
-- Title : [2k5] 커서 SCROLL 및 TYPE_WARNING 테스트
-- Reference : hanbitbook.co.kr
-- Key word : 커서 스크롤 cursor scroll
**********************************************************************************************/
/*
-- SCROLL
*/
USE sqlDB;
GO

SELECT name, height FROM userTbl;
GO
DECLARE userTbl_cursor CURSOR GLOBAL SCROLL
    FOR SELECT name, height FROM userTbl;
OPEN userTbl_cursor;
GO
--Fetch Next
DECLARE @name NVARCHAR(10), @height INT;
FETCH NEXT FROM userTbl_cursor INTO @name, @height
SELECT @name, @height;
GO
--Fetch Last
DECLARE @name NVARCHAR(10)
DECLARE @height INT
FETCH LAST FROM userTbl_cursor INTO @name, @height
SELECT @name, @height
-- Fetch Prior
DECLARE @name NVARCHAR(10)
DECLARE @height INT
FETCH PRIOR FROM userTbl_cursor INTO @name, @height
SELECT @name, @height
--Fetch First
DECLARE @name NVARCHAR(10)
DECLARE @height INT
FETCH FIRST FROM userTbl_cursor INTO @name, @height
SELECT @name, @height
CLOSE userTbl_cursor;
DEALLOCATE userTbl_cursor;
GO

/*
-- TYPE_WARNING
*/
USE sqlDB;
GO
DROP TABLE keysetTbl;
GO
CREATE TABLE keysetTbl(id INT, txt CHAR(5));
GO
INSERT INTO  keysetTbl VALUES(1,'AAA');
INSERT INTO  keysetTbl VALUES(2,'BBB');
INSERT INTO  keysetTbl VALUES(3,'CCC');
GO
DECLARE keysetTbl_cursor CURSOR GLOBAL FORWARD_ONLY  KEYSET TYPE_WARNING
FOR SELECT id, txt FROM keysetTbl;
--"생성된 커서는 요청한 유형이 아닙니다."라는 메세지 출력
GO
ALTER TABLE keysetTbl
 ADD CONSTRAINT uk_keysetTbl
 UNIQUE (id);
GO
DEALLOCATE keysetTbl_cursor;
GO
DECLARE keysetTbl_cursor CURSOR GLOBAL FORWARD_ONLY  KEYSET TYPE_WARNING
FOR SELECT id, txt FROM keysetTbl;
--"생성된 커서는 요청한 유형이 아닙니다."라는 메세지 출력되지 않음
-- 위에서 UNIQUE를 생성해서 그렇다.
GO
--model(2:keyset)
DECLARE @result CURSOR
EXEC sp_describe_cursor @cursor_return = @result OUTPUT,
        @cursor_source = N'GLOBAL', @cursor_identity = N'keysetTbl_cursor'
FETCH NEXT from @result
WHILE (@@FETCH_STATUS <> -1)
    FETCH NEXT FROM @result
OPEN keysetTbl_cursor;
FETCH NEXT FROM keysetTbl_cursor;
--값이 바뀐다.
--왜냐하면 keyset의 경우 키인ID만 tempdb에 가지고 있기에
--아래 txt값은 실제 테이블에서 변경된다.
UPDATE keysetTbl SET txt = 'ZZZ';
FETCH NEXT FROM keysetTbl_cursor;
DEALLOCATE keysetTbl_cursor;
GO
--실제 테이블 확인
SELECT * FROM keysetTbl;
GO

 

신고

+ Recent posts

티스토리 툴바