바다토리 웨어하우스
MSSQL 많이 활용하는 cursor문 본문
보통은 Loop를 돌며, 데이터를 처리해야 할 경우, 응용프로그램단에서 처리를 많이 하지만, Batch작업이나, Batch프로세스의 경우는 DB 자체에서 많이들 처리합니다.
Agent에서 스케쥴링을 걸 수도 있고, Log제공 등 다양한 기능을 제공하기에 DB자체에서 사용하는 게 편리할 때도 있습니다.
그중 가장 많이 사용하는 것이 바로 Cursor형.
데이터를 조하고 그 조회된 값을 기준으로 Loop를 돌면서 처리를 할 때 주로 사용합니다.
cursor를 사용하기 위해서는 먼저 선언을 해주어야합니다.
DECLARE 커서명 CURSOR FOR
Loop를 돌며 처리할 기본 데이터 조회하는 구문을 넣습니다.
SELECT name, grade FROM SCHOOL ORDER BY name
cursor작업이 다시 실행된다 하더라도 데이터의 일괄성을 위해 조회하는 구문에 Order by를 넣어 주어,
cursor 되는 순서를 일치시켜주는 것이 좋습니다.
OPEN 커서명
Select조회 값이 커서명에 저장이 되며, 그 저장 값을 불러들이기 위해 Open을 합니다.
Fetch Next From 커서명 into @name, @grade
select내용이 저장된 커서명으로부터 @name과 @grade로 가져오겠다는 의미입니다.
WHILE @@fetch_status=0
BEGIN
END
fetch_status값이 0이 될 때까지, 즉 커서명에 담긴 내용이 모두 읽힐 때까지 Loop를 돕니다.
이때 Begin과 End사이에 각 행의 값으로 실행해줄 구문을 넣어 줍니다.
또한 End가 나오기 전에 Fetch Next From 커서명 into @name, @garde를 해줌으로써,
다음행의 값을 @name과 @grade에 넣어주도록 합니다.
close 커서명
모든 cursor작업이 끝나면 열려있는 커서명을 닫아줍니다.
Deallocate 커서명
그리고 커서명에 할당된 내용을 모두 해제시켜줍니다.
위의 설명을 토대로 예시를 작성해 보겠습니다.
SCHOOL이란 테이블에서 이름과 학년 정보를 가져와서
1학년인 경우 1학년 테이블(Grade1)에 넣고, 2학년인 경우 2학년 테이블(Grade2)에 넣는
작업을 커서 문으로 작성해보도록 하겠습니다.
물론 Where조건절에 학년으로 해서 통으로 넣으면 좋지만. 이해를 돕기 위한 예제이니
살펴보도록 합니다.
DECLARE @name nvarchar(10), @grade nchar(1)
DECLARE cur_Test CURSOR FOR
SELECT name, grade FROM SCHOOL --school 테이블에서 가져온 name, grade를 cur_test에 할당
OPEN cur_Test --cursor를 오픈
FETCH NEXT FROM cur_Test INTO @name, @grade -- SCHOOL의 name과 grade가 저장된 내용을 @name과 @grade변수에 저장
WHILE @@FETCH_STATUS = 0 --cursor의 내용이 모두 읽힐 때까지 반복
BEGIN
IF @grade=1 --@grade가 1학년인 경우 1학년 테이블에 INSERT
begin
INSERT INTO GRADE1(name) value(@name)
end
ELSE IF @grade=2 --@grade가 2학년인 경우 2학년 테이블에 INSERT
begin
INSERT INTO GRADE2(name) value(@name)
end
FETCH NEXT FROM cur_Test INTO @name, @grade --cursor에서 다음행의 name, grade값을 @name, @grade에 대입
END
CLOSE cur_Test -- cur_Test를 닫아줌
DEALLOCATE cur_Test -- cur_test에 할당된 내역을 해제시킴.
이렇게 하면, 학년에 따라 서로 다른 테이블에 Insert를 시킬 수 있을 것입니다.
따라서 While 가 진행되는 동안 구문을 통해 여러 가지 조건식 및 처리 작업을 넣음으로써, 다양한 방법으로 응용을 할 수 있을 것입니다.
'IT > mssql' 카테고리의 다른 글
DB복원 후 원래 계정으로 로그인이 안될때 방법 (0) | 2022.05.26 |
---|---|
1년 전체 주말 등록하는 쿼리 스크립트 (0) | 2022.05.24 |
SQL에서 1024개 이상의 테이블 컬럼 만들기 (0) | 2022.05.23 |
MSSQL 중복없는 랜덤코드 생성하기 (0) | 2022.05.20 |
MSSQL을 이용한 JSON데이터 처리 방법 (0) | 2022.05.12 |