[DataBase]링크 테이블 생성을 위한 커서 사용 예제 General Tech.2007/04/27 20:13
-- ================================================================================================================================
-- 작 성 자 : 박종현
-- 작 성 일 : 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. 기존 임시 테이블 삭제
'General Tech.' 카테고리의 다른 글
| Work Breakdown Structure (WBS) (0) | 2007/12/17 |
|---|---|
| CMMI(Capability Maturity Model Integration) (0) | 2007/12/17 |
| 내부조인 / 외부조인(05) (1) | 2007/05/19 |
| SELECT로 다양한 타입의 열 가져오기(04) (0) | 2007/05/18 |
| SQL 역사 및 간단한 쿼리 만들기(03) (0) | 2007/05/18 |
| [DataBase]링크 테이블 생성을 위한 커서 사용 예제 (0) | 2007/04/27 |
