9. T-SQL 프로그래밍 - 4.커서

코난 2009.11.18 15:29 조회 수 : 26843

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.커서 문서의 끝입니다.

번호 제목 글쓴이 날짜 조회 수
공지 SQL강좌: 챗GPT와 함께 배우는 SQL Server 무료 강좌 목차와 소개 (2023년 9월 업데이트) 코난(김대우) 2023.08.18 41145
공지 Python 무료 강좌 - 기초, 중급, 머신러닝(2023년 6월 업데이트) 코난(김대우) 2021.01.01 22428
92 13. BACKUP과 RESTORE의 전략 - 화일 그룹의 백업 코난 2009.11.18 3488
91 13. BACKUP과 RESTORE의 전략 - 디퍼런셜 백업 코난 2009.11.18 4128
90 13. BACKUP과 RESTORE의 전략 - 로그 백업. 코난 2009.11.18 4330
89 13. BACKUP과 RESTORE의 전략 - 백업디바이스는 무엇인가?? 코난 2009.11.18 4690
88 13. BACKUP과 RESTORE의 전략 - 백업은? 코난 2009.11.18 4078
87 12. BCP를 이용한 데이터의 전송 - 3 코난 2009.11.18 4852
86 12. BCP를 이용한 데이터의 전송 - 2 코난 2009.11.18 5150
85 12. BCP를 이용한 데이터 전송 - 1 코난 2009.11.18 4816
84 11. Data Transfer Service (DTS) - SQL서버의 데이터 전송 코난 2009.11.18 3806
83 11. Data Transfer Service (DTS) - 엑셀문서의 전송 코난 2009.11.18 4778
82 11. Data Transfer Service(DTS) - 액세스 문서의 전송 코난 2009.11.18 5496
81 10. 시스템 관리 _ 4.사용자 관리 코난 2009.11.18 4183
80 10. 시스템 관리 _ 백업 코난 2009.11.18 4093
79 10. 시스템 관리 - 2.DBCC 코난 2009.11.18 3634
78 10. 시스템 관리 _ 1.시스템 관리자 코난 2009.11.18 3528
77 10. 시스템 관리 코난 2009.11.18 3525
76 9. T-SQL 프로그래밍 - 7.트랜젝션 코난 2009.11.18 4719
75 9. T-SQL 프로그래밍 - 6.트리거 코난 2009.11.18 9425
74 9. T-SQL 프로그래밍 _ 5.저장 프로시져 코난 2009.11.18 7011
» 9. T-SQL 프로그래밍 - 4.커서 코난 2009.11.18 26843





XE Login