본문 바로가기
MS SQL

MS SQL_CURSOR 연산자 사용법

by 디디찐 2022. 9. 8.
반응형

1. CURSOR 구문이란?

데이터 작업을 할 때 테이블에서 집합 단위가 아닌 행 단위로 처리를 해야할 때
테이블에서 SELECT 한 결과(행 집합)을 한 행씩 처리하여 반복 작업을 할 때 유용하게 사용 가능하다.

2. CURSOR 사용법



--커서 사용 선언: 커서를 정의, 관련된 선언을 하는 명령

DECLARE 커서명 CURSOR FOR
  SELECT 컬럼1,컬럼2,,,,FROM 테이블

--커서 사용을 위한 오픈: 커서가 질의 결과의 첫 번째 행을 포인트 하도록 설정
OPEN 커서명
--FETCH : 질의 결과의 행(튜플)들 중 현재의 다음 행으로 커서를 이동시키는 명령
FETCH NEXT FROM 커서명 
INTO @변수1,@변수2,,,  --SELECT (조회)한 컬럼 수와 동일하게 해야 된다.

--커서를 이용하여 한행씩 실행
WHILE @@FETCH_STATUS = 0
BEGIN
    --<반복 작업 수행> ex. SELECT, UPDATE, DELETE, INSERT 
    FETCH NEXT FROM 커서명 INTO @변수1,@변수2,,, --다음 ROW로 이동
END
CLOSE 커서명
DEALLOCATE 커서명



3. CURSOR 사용 예제

계약만료일이 지났거나 3개월 이내 임박 건에 대해 계약 만료일 1년 연장 

기본 테이블 CONTRACT_LIST

1) WHERE 조건을 위한 변수를 선언해준다. @GET_DATE, @FINISH_DATE

 

CONVERT(VARCHAR(10), DATETIME, 23)  =>YYYY-MM-DD형식으로 날짜 형변환
DATEADD(MONTH, -1, '날짜' )  => 1개월 전
참고: https://gent.tistory.com/429

 

[MSSQL] 날짜, 시간 더하기 빼기 (DATEADD)

SQL Server에서는 날짜, 시간을 더하거나 빼기 위해서는 DATEADD 함수를 사용한다. 현재 날짜에서 하루를 빼서 전일 데이터를 조회할 수 있으며, 일자외에도 년 월 시간 등 기준일자에 원하는 기간 만

gent.tistory.com

 

2) SELECT(조회)할 컬럼 작성 

SELECT EXPIRE_DATE                             
  FROM CONTRACT_LIST
 WHERE EXPIRE_DATE < @GET_DATE  --현재 날짜를 기준으로 만료일이 지난 건
    OR EXPIRE_DATE BETWEEN @GET_DATE AND @FINISH_DATE -- 현재날짜로부터 3개월 이내 건

SELECT 한 결과

SELECT 한 결과를 이제 한 행씩 가져와서 CURSOR 문을 통해 UPDATE 작업을 처리한다.

DECLARE @GET_DATE VARCHAR(20)       -- 현재 날짜 
DECLARE @FINISH_DATE VARCHAR(20)    -- 3개월 이내 날짜

SET @GET_DATE = CONVERT(VARCHAR,CONVERT(DATE,GETDATE()))
SET @FINISH_DATE = CONVERT(VARCHAR, DATEADD(MONTH, 3, GETDATE()),23) 

--커서문 시작
DECLARE @EXPIRE_DATE VARCHAR(20) -- SELECT한 행 값을 담을 변수 선언
DECLARE EXTENSION_CONTRACT_CURSOR CURSOR FOR SELECT EXPIRE_DATE                             
                                               FROM CONTRACT_LIST
                                              WHERE EXPIRE_DATE < @GET_DATE  --현재 날짜를 기준으로 만료일이 지난 건
                                                 OR EXPIRE_DATE BETWEEN @GET_DATE AND @FINISH_DATE -- 현재 날짜로부터 3개월 이내
OPEN EXTENSION_CONTRACT_CURSOR
FETCH NEXT FROM EXTENSION_CONTRACT_CURSOR INTO @EXPIRE_DATE

WHILE @@FETCH_STATUS = 0
BEGIN 

    UPDATE CONTRACT_LIST 
       SET EXTENSION = (CASE WHEN EXPIRE_DATE < @GET_DATE THEN '만료연장'
                             WHEN EXPIRE_DATE BETWEEN @GET_DATE AND @FINISH_DATE THEN '3개월 임박 연장' 
                             ELSE '계약 유지'END),
           EXPIRE_DATE = CONVERT (VARCHAR, DATEADD(YEAR,1, @EXPIRE_DATE),23 )
     WHERE EXPIRE_DATE = @EXPIRE_DATE
    
    FETCH NEXT FROM EXTENSION_CONTRACT_CURSOR INTO @EXPIRE_DATE
END
CLOSE EXTENSION_CONTRACT_CURSOR
DEALLOCATE EXTENSION_CONTRACT_CURSOR

3) 결과 조회시

SELECT *  FROM CONTRACT_LIST

SELECT 한 행(변수)과 동일한 행을 UPDATE 해준 결과

1년씩 증가 시켜주었다. 

 

참고: https://coding-factory.tistory.com/96

 

[MSSQL] 커서 사용법 & 예제

커서란? 행 단위 작업을 효율적으로 하기 위한 방식으로 테이블에서 여러 개의 행을 조회한 후 쿼리의 결과를 한 행씩 처리하는 방식입니다. SELECT 한 결과(행 집합)를 반복 작업해줘야 할 경우 

coding-factory.tistory.com

 

 

 


테이블 예제 파일과 CASE WHEN 에 대한

자세한 내용은 따로 정리해두었습니다.

 

 

MS SQL_CASE WHEN THEN 조건식사용법

1. CASE WHEN이란? 조건에 따라 서로 다른 값을 반환할 수 있는 CASE 표현식으로 프로그래밍 언어에서 IF 문, SWITCH 문과 비슷한 성격 SELECT, WHERE, ORDER BY에서 CASE문을 활용할 수 있다. 참고: https://gol..

jjin-todo.tistory.com

 

반응형