본문 바로가기

Database/MS-SQL

DB 커서

반응형


개요
행의 집합을 다루는 데 제공해주는 편리한 기능
SQL Server의 성능을 느리게 하는 요인이 될 수 있으므로, 
특별한 경우가 아니라면 되도록 사용하지 않을 것을 권장함
파일처리시의 파일 포인터와 비슷한 작동을 함



커서의 선언

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 ] ] ]






커서 관련 쿼리문

SELECT * FROM titles

DECLARE curs_1author_titles CURSOR
-- 변수선언 curs_1author_titles 커서명령어
-- LOCAL -- 지역 커서로 지정하기 위해 필수적
-- STATIC -- 정확한 @@CURSOR_ROWS결과를 위해
FOR
SELECT title_id
FROM titleauthor
-- titleauthor 테이블의 title_id를 보여달라
WHERE royaltyper = 100
ORDER BY title_id
-- 그리고 royaltyper = 100인값의 title_id 목록을 보여달라

DECLARE @title_id varchar(6), @subtotal int, @price int, @qtyy int
-- @title_id, @subtotal, @price 변수선언
OPEN curs_1author_titles
-- curs_1author_titles 를 열어라
FETCH NEXT FROM curs_1author_titles INTO @title_id
--curs_1author_titles 커서에서 title_id의 값을 가져달라
WHILE(@@FETCH_STATUS=0)
-- FETCH STATUS가 0인동안 데이터를 계속 돌려라
BEGIN
-- while문 실행점
  SELECT @subtotal = ISNULL(ISNULL(t.price,0)*ISNULL(s.qty,0),0),
-- t.price, q.qty Null값이 있으면 0을 넣어라.
-- 그리고 t.price * q.qty의 값을 @subtotal 정의해라
           @price = t.price,
           @qtyy = s.qty
-- subtotal, price, qtyy의 값들을 @subtotal,price, qtyy에 넣어라
      FROM titles AS t
         JOIN sales AS s
          ON t.title_id = s.title_id
-- INNER 조인해줘라.
    WHERE t.title_id = @title_id 

PRINT '단일 저자 책(' + @title_id + ')판매 금액: '
+ CONVERT(varchar(10), @price*@qtyy) + ', 서브토탈: ' +
CONVERT(varchar(20), @subtotal)
/*
화면에 표시해라 단일저자책 + title_id + 판매금액 +
varchar(10)형으로 @price*@qtyy값 + 서브토탈 +
varchar(20)형으로 @subtotal값
*/
 
FETCH NEXT FROM curs_1author_titles INTO @title_id
-- while 문이 끝날때는 한번더 써줘야함
-- 지금은 19번째줄에 써져있음
END
-- while문 종료

close curs_1author_titles
-- 커서 닫아주기

DEALLOCATE curs_1author_titles
-- 커서를 메모리에서 해제