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
            SELECT title_id FROM titles
    DECLARE @title_id CHAR(6)
    OPEN update_title
    FETCH update_title INTO @title_id
    WHILE (@@FETCH_STATUS = 0)
            BEGIN
            IF (@title_id LIKE "BU%")
                    UPDATE titles SET price = (price / 1.1)
                    WHERE CURRENT OF update_title
            FETCH update_title INTO @title_id
            END
    DEALLOCATE update_title

     

 

 

     

    UPDATE titles SET price = (price / 1.1)
            WHERE title_id LIKE "BU%"

     

 

 

     

    SET NOCOUNT ON
    SELECT '***** Database : ' + db_name() + '*****'
    DECLARE @table_name CHAR(10)
    DECLARE c_upstats INSENSITIVE CURSOR FOR
            SELECT name FROM sysobjects WHERE type = 'U'
    OPEN c_upstats
    FETCH NEXT FROM c_upstats
    WHILE (@@fetch_status = 0)
            BEGIN
            EXEC('UPDATE STATISTICS ' + @table_name)
                    SELECT 'Statistics Updated on: ' + @table_name
                    FETCH NEXT FROM c_upstats INTO @table_name
            END
    SET NOCOUNT OFF
    DEALLOCATE c_upstats

     

 

 

커서 이야기였습니다...

조금 아시겠나요..... 사실 T-SQL프로그래밍은 한 분야입니다.

오라클의 PROC처럼 한권의 책으로도 만들 수 있는 분량이 되는...

매우 방대한 하나의 시스템입니다.

이부분을 강좌로 엮어.... 이렇게 글을 적으려니....

정말 죄송하군요....

 

아울러 좀더 상세히 배우고 싶으시다면....

책을 구입하셔서 세세히 보시길 권장합니다.

"무슨책을 사세요....."   라고는 말 못드리죠...

 

그럼 이만...   저역시 머리가 후끈 하네요........

머리좀 식히고... 오겠습니다....

에궁..... 냠냠냠......

 


 

9. T-SQL 프로그래밍 _  4.커서 문서의 끝입니다.





profile

부족하지만, SQLER의 누군가와 함께한 나눔을 통해 제가 더 많이 즐거웠습니다.
SQLER와 함께 즐거워 할수록, 그 나눔을 통해 더 많은 기회와 가치를 발견하게 되었습니다.
나눔의 생각이 앞으로도 계속, SQLER를 움직일 것입니다.

코난, 김대우 / SQLER 운영자 / 골라먹는 SQLER RSS 정보 구독 / 실시간 SQLER 소식 uxkorea 트위터