본문 바로가기
공부,일/SQL

cursor 사용하기

by fromnothing1 2021. 7. 11.

코드에서 파일 입출력을 공부 해 봤다면 쉽게 이해 할 수 있다. 

 

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_STATUS

 

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

댓글