코드에서 파일 입출력을 공부 해 봤다면 쉽게 이해 할 수 있다.
select 문 으로 불러낸 하나의 table을 하나의 파일로 생각하고 통로를 open 해준다
- 물론 끝나면 닫아줘야함
그리고 파일의 시작 주소를 가지고 한줄씩 읽고 처리 하는 방식이다.
cursor 구조
ISO Syntax
DECLARE cursor_name [ INSENSITIVE ] [ SCROLL ] CURSOR
FOR select_statement
[ FOR { READ ONLY | UPDATE [ OF column_name [ ,...n ] ] } ]
[;]
Transact-SQL Extended Syntax
DECLARE cursor_name CURSOR [ LOCAL | GLOBAL ]
[ FORWARD_ONLY | SCROLL ]
[ STATIC | KEYSET | DYNAMIC | FAST_FORWARD ]
[ READ_ONLY | SCROLL_LOCKS | OPTIMISTIC ]
[ TYPE_WARNING ]
FOR select_statement
[ FOR UPDATE [ OF column_name [ ,...n ] ] ]
[;]
ISO SYNTAX 버전은 기본버전이고
TRANSACT -SQL EXTENDED 는 확장 버전이라고 생각하면 된다.
예시를 보면서 좀더 자세히 알아 보자
2중 커서문
SET NOCOUNT ON;
DECLARE @vendor_id INT, @vendor_name NVARCHAR(50),
@message VARCHAR(80), @product NVARCHAR(50);
PRINT '-------- Vendor Products Report --------';
DECLARE vendor_cursor CURSOR FOR
SELECT VendorID, Name
FROM Purchasing.Vendor
WHERE PreferredVendorStatus = 1
ORDER BY VendorID;
OPEN vendor_cursor
FETCH NEXT FROM vendor_cursor
INTO @vendor_id, @vendor_name
WHILE @@FETCH_STATUS = 0
BEGIN
PRINT ' '
SELECT @message = '----- Products From Vendor: ' +
@vendor_name
PRINT @message
-- Declare an inner cursor based
-- on vendor_id from the outer cursor.
DECLARE product_cursor CURSOR FOR
SELECT v.Name
FROM Purchasing.ProductVendor pv, Production.Product v
WHERE pv.ProductID = v.ProductID AND
pv.VendorID = @vendor_id -- Variable value from the outer cursor
OPEN product_cursor
FETCH NEXT FROM product_cursor INTO @product
IF @@FETCH_STATUS <> 0
PRINT ' <<None>>'
WHILE @@FETCH_STATUS = 0
BEGIN
SELECT @message = ' ' + @product
PRINT @message
FETCH NEXT FROM product_cursor INTO @product
END
CLOSE product_cursor
DEALLOCATE product_cursor
-- Get the next vendor.
FETCH NEXT FROM vendor_cursor
INTO @vendor_id, @vendor_name
END
CLOSE vendor_cursor;
DEALLOCATE vendor_cursor;
DECLARE vendor_cursor CURSOR FOR
(인라인뷰)
vendor_cursor 커서에 밑의 인라인 뷰가 할당된다. -> 파일을 만들어 주고 이름이 vender_cursor 라고 생각해주면 된다.
OPEN vendor_cursor -> 파일 오픈
@@FETCH_STATUS : 파일 read 함수의 결과라고 생각하면 된다.
정상적으로 데이터를 읽은 경우 0 출력
파일 끝을 만나면 -1 출력
FETCH NEXT FROM vendor_cursor INTO @vendor_id, @vendor_name
파일에서 한줄 읽어서 변수에다가 저장
CLOSE vendor_cursor;
DEALLOCATE vendor_cursor;
열려 있는 vendor_cursor CURSOR
CLOSE
'공부,일 > SQL' 카테고리의 다른 글
SET NOCOUNT ON (0) | 2021.07.11 |
---|---|
20210601_2 (0) | 2021.06.01 |
20210601 (0) | 2021.06.01 |
210531_2 (0) | 2021.05.31 |
210531 (0) | 2021.05.31 |
댓글