[MSSQL] CURSOR, WHILE-LOOP 코딩량 줄이기 팁

2012. 10. 22. 20:40Coders

SQL 프로시저나 트리거(트리거도 프로시저의 하나 이긴 하지만), 일괄 처리 작업 등을 할 때에 CURSOR 를 선언하고 WHILE-LOOP 와 많이 사용 합니다.


어쩌면 이번 글에서 제가 제시하는 방법이 많은 분들이 사용하고 있을 지 모르겠으나, 혹시나 해서 글 올리는데요, 지금까지 제가 봐 온 CURSOR 구문들은, 대부분, 페치->루프->페치 의 코딩인 것이 대부분이었는데요, 지금 소개하는 방법은 루프->페치 로 약간 단순화 시키는 방법입니다.


그러면, 당연히 뭐가 달라? 그래서 좋아지는 게 뭐냐? 하실 분이 있겠죠.

네, 다른 점, 좋은 점은 해당 프로시저 등의 수정이 빈번하게 일어나거나, FETCH할 컬럼들이 아주 많을 경우, 양 쪽의 FETCH 구문을 손 대지 않고, 어느 한 쪽의 구문만 건드리면 수정이 끝난다는 장점이 있습니다. "난 뭐 어차피 하나 수정하고 복사해서 붙여넣으니까 상관 없어~" 라고 말씀하시면 할 말이 없습니다. 결국엔 자기가 마음에 드는 대로 코딩하는 게 제일 좋은 방법이긴 하겠죠. :)


자 코드 나갑니다.

첫번째 코드는 FETCH 구문이 2번 중복이 일어나는 코드이고, 두번째 코드는 FETCH 구문을 1회만 사용하는 코드 입니다.

/* 1. FETCH 코드의 중복 - FETCH - WHILE-LOOP 에서 FETCH STATUS 체크 - WHILE-LOOP 내에서 FETCH(중복코드) */ DECLARE CUR_LOOP CURSOR FOR SELECT COL_1, COL_2, COL_3, ... FROM TBL_TEST; OPEN CUR_LOOP; FETCH NEXT FROM CUR_LOOP /* 첫번째 FETCH 구문 */ INTO @COL_1, @COL_2, @COL_3, ... WHILE ( @@FETCH_STATUS = 0 ) BEGIN /* 처리할 작업 코드 */ FETCH NEXT FROM CUR_LOOP /* 두번째 FETCH 구문 - 첫번째와 똑같은 코딩 중복 */

INTO @COL_1, @COL_2, @COL_3, ... END; CLOSE CUR_LOOP; DEALLOCATE CUR_LOOP; /* 2. 개선 코드 - WHILE-LOOP 를 무조건 실행 - WHILE-LOOP 내에서 FETCH(한번) - WHILE-LOOP 에서 FETCH STATUS 체크하여 FETCH 실패이면 BREAK로 빠져나옴. */ DECLARE CUR_LOOP CURSOR FOR SELECT COL_1, COL_2, COL_3, ... FROM TBL_TEST; OPEN CUR_LOOP; WHILE ( 1 = 1 ) /* 무조건 반복 */ BEGIN FETCH NEXT FROM CUR_LOOP /* FETCH 구문은 여기에서 한번만 일어남 */ INTO @COL_1, @COL_2, @COL_3, ... IF ( @@FETCH_STATUS <> 0 ) BREAK; /* 처리할 작업 코드 */ END; CLOSE CUR_LOOP; DEALLOCATE CUR_LOOP;