ANSI SQL을 본 경험이 있으시다면....
ANSI SQL의 커서를 생각하시면 됩니다.
C와 같은 3세대 언어의 행단위 처리 방식에 익숙하신 분이라면 쉽게 이해하시겠지요...
변수, 스트럭쳐, 객체 와 비슷하게.. 선언하고 만들고 쓰고 닫고 풀어주고.......
강좌를 보시겠습니다...
커서(Cursor)
커서란?
ANSI SQL커서의 작동
커서의 사용
커서란?
SELECT 문에서 생성된 결과 집합에 대해 개별적인 행 단위 작업을 가능하게 한다.
- 스크롤 기능을 제공하거나 다음, 이전행, 지정된 행, 마지막 행 등을 가져오는 작업을 가능하게 한다.
- 선택된 행들은 서버상에서 개별적으로 처리된다.
SQL서버는 두가지 커서 인터페이스를 제공한다.
- ANISI SQL커서
한번에 한행을 처리한다.
트리거나 저장 프로시져에서 사용될 수 있다.
- 서버커서
DB-Library나 ODBC 프로그램에서 사용하도록 설계 되었다.
결과 지향적 처리를 가능하게 한다.
ANSI SQL커서의 작동
DECLARE
- 커서의 속성을 생성하고 정의한다.
DECLARE cursor_name[INSENSITIVE][SCROLL]CURSOR
FOR select_statement
[FOR{READ ONLY | UPDATE [OF column_list]}]
- SELECT 문에 있는 변수들은 이때 평가된다.
- INSENSITIVE
수정을 허용하지 않는다.
커서에서 정의된 데이터들은 tempdb로 복사되고 원본이 바뀌어도 바 뀐 내용은 반영되지 않는다.
- SCROLL
커서를 앞 뒤로 마음대로 이동할 수 있다.
- FOR READ ONLY
읽기 전용으로만 사용
- FOR UPDATE
모든 컬럼을 수정할 수 있다.
- FOR UPDATE OF
지정된 컬럼만 수정할 수 있다.
다음의 경우에 커서는 읽기 전용이다.
- READ ONLY 옵션을 사용한 경우
- ORDER BY가 select_statement에 있거나 INSENSITIVE 가 지정된 경우
- GROUP BY, UNION, DISTINCT, HAVING이 select_statement에 지정된 경우
OPEN
- 커서를 열고 필요한 경우에 임시 테이블을 생성한다.
OPEN cursor_name
- 결과 집합의 정렬순서, 포함 여부의 기준은 커러사 열릴때 결정된다.
- 전역변수 @@CURSOR_ROWS
마지막으로 열린 커서의 선택된 행의 개수
FETCH
- 커서로부터 행을 가져오거나 검색한다.
FETCH
[[NEXT | PRIOR | FIRST | LAST | ABSOLUTE {n | @nvar} |
RELATIVE {n | @nvar}]
FROM] cursor_name
[INTO @variable_name1, @variable_name2,...]
- SCROLL 옵션이 지정되지 않은 경우에는 NEXT만이 가능하다.
전역변수 @@FETCH_STATUS
0 : FETCH가 성공한 경우
-1 : 커서의 위치가 결과 집합의 범위를 넘거나 아무 데이터도 검색
하지 못함
-2 : 반환된 행이 더이상 결과 집합의 구성원이 아님
CLOSE
CLOSE cursor_name
- 커서를 닫고 버퍼용으로 사용중인 메모리를 반환한다.
커서를 다시 열수는 있지만 데이터를 FETCH하거나 갱신, 삭제할 수 는 없다.
DEALLOCATE
DEALLOCATE cursor_name
- 커서의 정의를 제거하고 커서와 관련된 모든 데이터 구조를 위한 메모리를 반환한다.
커서의 사용
커서는 꼭 필요한 경우에만 사용하는 것이 좋다.
커서를 사용하는 것이 좋은 경우
- 많은 결과 집합 상에서 리스트 박스 등을 채울 때
- 결과 집합을 예상할 수 없거나 클 가능성이 있는 응용 프로그램
- 하나의 트랜젝션이나 연결에서 여러개의 결과 집합을 필요로 하는 경우
커서를 사용하지 않아야 하는 경우
- 전체 결과 집합을 검색하는 배치 작업을 수행하는 경우
- 클라이언트 상에 캐시될 수 있는 정도의 작은 결과 집합을 검색하는 경우
- 저장 프로시져에서 해당 집합을 순차적으로 처리하기 위해
DECLARE update_title CURSOR FOR
|
UPDATE titles SET price = (price / 1.1)
|
SET NOCOUNT ON
|
커서 이야기였습니다...
조금 아시겠나요..... 사실 T-SQL프로그래밍은 한 분야입니다.
오라클의 PROC처럼 한권의 책으로도 만들 수 있는 분량이 되는...
매우 방대한 하나의 시스템입니다.
이부분을 강좌로 엮어.... 이렇게 글을 적으려니....
정말 죄송하군요....
아울러 좀더 상세히 배우고 싶으시다면....
책을 구입하셔서 세세히 보시길 권장합니다.
"무슨책을 사세요....." 라고는 말 못드리죠...
그럼 이만... 저역시 머리가 후끈 하네요........
머리좀 식히고... 오겠습니다....
에궁..... 냠냠냠......
9. T-SQL 프로그래밍 _ 4.커서 문서의 끝입니다.