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년 연장
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 한 결과를 이제 한 행씩 가져와서 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
'MS SQL' 카테고리의 다른 글
MS SQL_문자열 관련 함수 정리2(문자열 합치기, 문자열 자르기, 문자열 치환, 공백 제거) (0) | 2022.09.22 |
---|---|
MS SQL_문자열 관련 함수 정리1(문자열 자르기, 특정 문자 위치 찾기, 문자열 치환, 공백 제거) (0) | 2022.09.15 |
MS SQL_LIKE 연산자 사용법 (0) | 2022.08.17 |
MS SQL_CASE WHEN THEN 조건식사용법 (0) | 2022.08.16 |
MS SQL_PIVOT 사용법 (0) | 2022.08.03 |