달력

032010  이전 다음

  •  
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  •  
  •  
  •  

커서란?
- 데이터 처리는 집합단위로 이루어지기도 하지만 조건에 따라서는 행 단위로 처리하기도 한다.
- 행 단위의 데이터 처리시 커서를 사용한다.

커서의 장점
- 데이터를 행 단위로 처리할 수 있음.

커서의 단점
- 데이터 처리 속도가 느려짐.(SQL문에 비해 느림)

1.1 커서의 종류
- 서버커서(Server Cursor), 클라이언트 커서(Client Cursor)

서버커서(Server Cursor)
- T-SQL 커서와 API 커서로 나뉨

T-SQL 커서 란?
- 결과 집합을 만드는 T-SQL스크립트, 트리거, 저장 프로시저에서 사용
- 변수로 한 열을 할당받는다.(변수의 크기는 열의 데이터 타입과 데이터를 모두 받을 수 있을 만큼 선언)

API 커서란?
- OLEDB, ODBC, ADO를 이용하여 SQL 문의 결과 집합에서 커서 매핑.

클라이언트 커서란?
- ODBC에서 지원하는 커서, 결과 집합을 클라이언트 캐쉬에 저장(읽기전용)

1.2 커서의 작업
- DECLARE를 이용한 커서 선언
- OPEN을 이용한 커서 열기
- FETCH를 이용한 데이터 불러오기
- CLOSE를 이용한 커서 닫기
- DEALLOCATE를 사용ㅇ한 커서 선언 제거

1.3 커서의 ANSI 문법
- Declare 커서 이름 [ INSENSITIVE ] [ SCROLL ] CURSOR
   FOR SELECT 구문
   [ FOR { READONLY | UPDATE [ OF 컬럼명 [......N]] } ]

- INSENSITIVE : 커서에서 사용할 데이터를 임시로 복사해 주는 커서를 정의
                커서에서 정의된 데이터는 tempDB에 저장됨.
                잠금이 생김, 동시성 저하.
- SCROLL : 모든 인출 옵션 사용이 가능
           인출 옵션(FIRST, LAST, PRIOR, NEXT, RELATIVE, ABSOLUTE)
           인출 옵션이란? 데이터를 불러올 행을 이동하는 방식

- SELECT 구문 : 일반적인 select 구문 형식을 따름
- READ ONLY : 커서를 통한 데이터 변경 및 삭제를 방지, DELETE, UPDATE 기능을 무시.

1.4 커서의 T-SQL 문법
- DECLARE 커서 이름 CURSOR [ LOCAL | GLOBAL ]
 [ FORWARD_ONLY | SCROLL ]
 [ STATIC | KEYSET | DYNAMIC | FAST_FORWARD ]
 [ READ_ONLY | SCROLL_LOCKS | OPTIMISTIC ]
 [ TYPE_WARING ]
 FOR SELECT 구문
  [ FOR UPDATE [ OF 컬럼명 [ ,......N]]]

- LOCAL: 커서의 범위를 로컬로 지정(로컬변수)
- GLOBAL: 커서의 범위를 전역을 지정(전역변수)
- FORWARD_ONLY: "전진만 있되 후퇴는 없도다.", 유일한 명령 옵션은 FETCH_NEXT
- SCROLL: 모든 인출 옵션(FIRST, LAST, PRIOR, NEXT, RELATIVE, ABSOLUTE)를 사용하도록 지정
- STATIC: 수정이 안됨(임시커서)
- KEYSET: 커서에 포함되는 행과 멤버와 순서가 고정되도록 지정.
- DYNAMIC: 인출할 때 마다 행의 데이터 값과 순서, 멤버가 변경됨, 동적 커서
- FAST_FORWARD: 성능 최적화가 설정된 FORWARD_ONLY, READ_ONLY 커서를 지정.
- READ_ONLY: 데이터에 대한 변경 및 삭제 방지, UPDATE, DELETE 구문의 WHERE CURRENT OF 절에서 이키를 사용할 수 없음
- SCROLL_LOCKS: 위치 지정 업데이트나 삭제가 성공하도록 지정

-- Declare 구문지정
DECLARE YearPlan_Cur CURSOR FOR
  SELECT CustCode, WkCnt, DeptCode, Week, Day, SMethodYN, DaN
  FROM RM_YearPlan
  WHERE WkCnt = '1'

-- OPEN 구문
OPEN YearPlan_Cur

-- FETCH 구문
FETCH NEXT FROM YearPlan_Cur
WHILE @@FETCH_STATUS = 0
 BEGIN
  FETCH NEXT FROM YearPlan_Cur
 END

-- CLOSE 구문
CLOSE YearPlan_Cur

-- 커서 해제
DEALLOCATE YearPlan_Cur

크리에이티브 커먼즈 라이선스
Creative Commons License

'General Tech.' 카테고리의 다른 글

Windows 7과 관련된 동영상 입니다.  (0) 2008/04/11
Velocity  (0) 2008/03/20
커서(Cursor)에 대한 요약 정리  (0) 2008/03/11
Google Analytics Interface Tutorial  (0) 2008/02/22
Semantic Web Interface  (0) 2008/02/20
인터럽트 사이클  (0) 2008/02/19
Posted by -세티-


-- ================================================================================================================================
-- 작 성 자 : 박종현
-- 작 성 일 : 2009.04.27
-- 설    명 :
-- 샘플실행 :
-- 변경이력 : EXEC [dbo].[USP_CalculateMarkedWordCnt] '0508001','2009','01','01','GT','01','06032647'
-- ================================================================================================================================
ALTER PROCEDURE [dbo].[USP_CalculateMarkedWordCnt]

 @ACADEMY_SEQ varchar(2) -- 학원코드
 , @CODE_YEA varchar(4) -- 년도
 , @TRM_CODE varchar(2) -- 학기코드
 , @WEK_CODE varchar(2) -- 주차코드
 , @PROGRAM_CODE varchar(2) -- 주차코드
 , @GRADE_CODE VARCHAR(2) -- 학년코드
 , @USER_SEQ VARCHAR(8) -- 원생코드

AS

 CREATE table dbo.#LinkedWord -- 2. 임시 테이블 생성
 (
  ols_word varchar(10) not null
  ,ols_program varchar(10) null
  , ols_grade varchar(10) null
  , ols_subject varchar(10) null
  , ols_testdate varchar(10) null
 )

 -- 3. 선택한 값을 담을 커서선언
 declare cur_word1 cursor

 -- 4. 선택한 값을 커서 변수에 담는다.
 for SELECT ols_word, ols_program, ols_grade, ols_subject, ols_testdate FROM KPIS.DBO.HOM_OLS_WORDGROUP where ols_program = @PROGRAM_CODE and ols_grade = @GRADE_CODE
  
 -- 5. 커서를 오픈한다. 
 open cur_word1
 declare @c_word1 varchar(6000)
 declare @c_program varchar(50)
 declare @c_grade varchar(50)
 declare @c_subject varchar(50)
 declare @c_idx varchar(30)
 declare @c_testdate varchar(8)
 declare @c_value varchar(6000)
  
 -- 7. 변수의 각 row를 돌면서 fetch를 실행한다.
 fetch next from cur_word1 into @c_word1, @c_program, @c_grade, @c_subject, @c_testdate
 -- select * from cur_word1
 -- 8. while문을 돌면서 정보를 집어 넣는다.
 while @@fetch_status = 0
  begin
   declare cur_value cursor
   for
    select value from dbo.split(@c_word1, ',')

   open cur_value
    declare @oValue varchar(500)
    fetch next from cur_value into @oValue
    while @@fetch_status = 0
     begin
      insert into #LinkedWord(ols_word, ols_program, ols_grade, ols_subject, ols_testdate) values(@oValue, @c_program, @c_grade, @c_subject, @c_testdate)
      fetch next from cur_value into @oValue
     end
    
    close cur_value
    deallocate cur_value 
   fetch next from cur_word1 into @c_word1, @c_program, @c_grade, @c_subject, @c_testdate
  end

 -- 커서 닫고 메모리 해제
 close cur_word1
 deallocate cur_word1

 -- 주차변수 선언
 declare @SDATE varchar(8)
 declare @EDATE varchar(8)
 declare @WordCnt varchar(3)
 declare @UserSltCnt varchar(3)

 -- 주차 가져오기
 select @SDATE = ST_DATE, @EDATE = ED_DATE from COM_COD_WEEK where code_yea = @CODE_YEA and trm_code=@TRM_CODE and wek_code = @WEK_CODE

 -- 주차에 출제된 단어수
 select @WordCnt = count(a.ols_word)   
 from  #LinkedWord as a
   inner join hom_ols_wordgroup as b
   on(
    a.ols_testdate = b.ols_testdate
    and a.ols_program = b.ols_program
    and a.ols_grade = b.ols_grade
    and a.ols_subject = b.ols_subject
    and a.ols_testdate >= @SDATE
    and a.ols_testdate <= @EDATE
    and a.ols_program = @PROGRAM_CODE
    and a.ols_grade = @GRADE_CODE
   )

 SELECT @UserSltCnt = count(academy_seq)
 from hom_ols_userword  as a
   inner join #LinkedWord as b
   on (a.word_seq = b.ols_word and b.ols_program = @PROGRAM_CODE and b.ols_grade = @GRADE_CODE and a.wek_code = @WEK_CODE and a.user_seq = @USER_SEQ)

 SELECT @WordCnt as 'WeakWordCnt' -- 출제된 단어수
   , @UserSltCnt as 'UserSelectCnt' -- 사용자 선택 단어수
   , convert(int, @WordCnt) - convert(int, @UserSltCnt) as 'MarkedCnt' -- 출제된 단어수 - 사용자 선택 단어수 = 마크 단어.
   
 DROP table dbo.#LinkedWord -- 1. 기존 임시 테이블 삭제   

저작자 표시 비영리 변경 금지
크리에이티브 커먼즈 라이선스
Creative Commons License
Posted by -세티-