본문 바로가기
컴퓨터관련/MS-SQL

[MS-SQL]커서 설명 및 사용방

by 빛과 어둠사이 2019. 6. 20.
728x90
반응형
SMALL

MS-SQL에는 커서라는 기능이 있습니다.

커서는 웬만하면 안쓰는게 좋은 기능이긴 하지만,

그래도 적당한 상황에서 사용을 하면

더 편하게 잘 할 수 있는 기능이기도 하기 때문에 정리를 해보고자 합니다.



1. 커서란?

행 단위 작업을 효율적으로 하기 위한 방법으로,

여러 행을 조회한 후 한 행씩 가지고 와서 처리하는 방식입니다.

즉, SELECT를 해서 한 ROW씩 가지고 와서

데이터를 처리하고 하는 방법이라고 생각하시면 되십니다.


2. 커서의 특징

- 내장 SQL문의 수행 결과로 반환될 수 있는 복수의 튜플들을 엑세스 할 수 있도록 해줍니다.

- 질의 수행 결과로 반환되는 첫번째 튜플에 대한 포인터로 생각 할 수 있습니다.

- 질의 결과로 반환될 수 있는 튜플들을 한번에 하나씩 처리할 수 있습니다.


3. 커서 관련 명령어

- DECLARE : 커서를 정의하고, 선언하는 명령어입니다.

- OPEN : 커서가 질의 결과의 첫번째 튜플을 포인트 하도록 설정하는 명령어입니다.

- FETCH : 질의 결과 중 다음 튜플로 커서를 이동시키는 명령어입니다.

- CLOSE : 커서를 닫기 위해 사용하는 명령어입니다.


4. 사용 예제

4-1. 임시테이블 생성 및 데이터 입력

CREATE TABLE CURSOR_TEST (
	NAME VARCHAR(20),
	AGE INT
)
;
INSERT INTO CURSOR_TEST(NAME,AGE)VALUES('홍길동',20);
INSERT INTO CURSOR_TEST(NAME,AGE)VALUES('홍길순',21);
INSERT INTO CURSOR_TEST(NAME,AGE)VALUES('김영희',24);
INSERT INTO CURSOR_TEST(NAME,AGE)VALUES('김철수',22);
INSERT INTO CURSOR_TEST(NAME,AGE)VALUES('이세계',19);
INSERT INTO CURSOR_TEST(NAME,AGE)VALUES('박나래',25);

위처럼 하여 데이터를 입력하였습니다.

결과는 다음과 같습니다.



4-2. 임시데이터의 AGE를 +1 하기

DECLARE 
@NAME VARCHAR(100),
@AGE INT

DECLARE CUR_TEST CURSOR FOR  --CUR라는 이름의 커서 선언
	SELECT --쿼리 조회
		NAME,
		AGE
	FROM CURSOR_TEST;

OPEN CUR_TEST    --커서 오픈
FETCH  NEXT FROM CUR_TEST INTO @NAME,@AGE ; --SELECT한 값을 @NAME,@AGE 변수에 넣는다.

--커서를이용해 한ROW씩 읽음 
WHILE @@FETCH_STATUS = 0
	BEGIN
		--SELECT 한 데이터의 행집합을 가지고 수행할 작업
		UPDATE CURSOR_TEST
		SET AGE = @AGE+1 --나이+1
		WHERE NAME = @NAME;
		
		FETCH NEXT FROM CUR_TEST INTO @NAME,@AGE;--다음ROW로 이동
	END

--커서 닫고 초기화
CLOSE CUR_TEST;
DEALLOCATE CUR_TEST;

위처럼 하면 됩니다.

그러면 조회를 해서 한 로우씩 가지고 와서 

UPDATE를 해서 한살씩 올리도록 합니다.



5. 주의사항

커서는 한 행씩 읽어가면서 작업을 하는 것입니다.

한 행을 처리하고 난 다음에 다음 행을 가르키고, 

다음 라인값을 가지고 와서 처리를 합니다.

하지만 이렇기 때문에 성능에는 크게 영향을 줍니다.

데이터가 적을 때는 상관이 없지만

데이터 양이 많을 경우에는 커서를 사용하지 않는 것이 좋습니다.

그러니깐 그냥 웬만하면 커서를 사용하지 않는 것이 더 좋습니다.




이상으로 SQL SERVER에서 커서 사용하는 방법이였습니다~


728x90
반응형
LIST

'컴퓨터관련 > MS-SQL' 카테고리의 다른 글

[MS-SQL]데이터 형식  (0) 2019.06.26
[MS-SQL]ROWCOUNT와 TOP  (0) 2019.06.21
[MS-SQL]DB 복원하기  (0) 2019.06.14
[MS-SQL]DB 백업하기  (0) 2019.06.12
[MS-SQL]테이블 리스트 안보일 때  (0) 2019.06.04