-- 커서 수행시에 커서 정의구문부터 커서 삭제구문까지 일괄로 블록을 잡아서 한번에 수행하는
    것이 좋다. 개별로 수행 시킬 수도 있지만 오류가 날 가능성이 있으므로 한번에 수행하자.

-- 실습용 테이블 생성 및 Temp 데이터 추가
CREATE TABLE 우편물(
번호 int identity(1,1)
, 우편번호 varchar(3)
, 우편주소 varchar(6)
)
INSERT INTO 우편물(우편번호, 우편주소)
VALUES('001', '코난동')
INSERT INTO 우편물(우편번호, 우편주소)
VALUES('002', '악마동')
INSERT INTO 우편물(우편번호, 우편주소)
VALUES('003', '악어동')
INSERT INTO 우편물(우편번호, 우편주소)
VALUES('004', '태오동')
INSERT INTO 우편물(우편번호, 우편주소)
VALUES('', '코난동')
INSERT INTO 우편물(우편번호, 우편주소)
VALUES('', '악마동')

CREATE TABLE 우편번호(
우편번호 varchar(3)
, 우편주소 varchar(6)
)
INSERT INTO 우편번호 VALUES('001', '코난동')
INSERT INTO 우편번호 VALUES('002', '악마동')
INSERT INTO 우편번호 VALUES('003', '거북동')
INSERT INTO 우편번호 VALUES('004', '태오동')
INSERT INTO 우편번호 VALUES('005', '악어동')

SELECT * FROM 우편물
SELECT * FROM 우편번호

--커서 선언
DECLARE cur_konan_Test CURSOR
FOR
SELECT 번호, 우편번호, 우편주소 FROM 우편물
--커서 오픈
OPEN cur_konan_Test
--변수 선언
DECLARE @v_번호 INT
DECLARE @v_우편번호 VARCHAR(3)
DECLARE @v_우편주소 VARCHAR(6)
--첫 로우 FETCH
FETCH NEXT FROM cur_konan_Test INTO @v_번호, @v_우편번호, @v_우편주소
WHILE @@FETCH_STATUS = 0
BEGIN
--FETCH된 데이터를 tempdb에 삽입
UPDATE 우편물
SET 우편번호 = (SELECT 우편번호 FROM 우편번호 WHERE 우편주소 = @v_우편주소)
WHERE 번호 = @v_번호
--다음 로우 FEETCH - 루프
FETCH NEXT FROM cur_konan_Test INTO @v_번호, @v_우편번호, @v_우편주소
END
--커서 CLOSE
CLOSE cur_konan_Test
--커서 DEALLOCATE
DEALLOCATE cur_konan_Test
GO

-----------------------------------------------------------
-- 1. 학생 테이블에서 각 학생의 시험 점수를 가지고,
-- ‘수,우,미,양,가’ 형식의 값을 지정하는 커서 작성 예
create table student
(
 id int primary key,
 name varchar(20) not null,
 value tinyint not null,  -- 점수
 grade nchar(1)  -- '수,우,미,양,가'
)

insert into student(id, name, value)
values(1, '철수', 60)
insert into student(id, name, value)
values(2, '영희', 80)
insert into student(id, name, value)
values(3, '인호', 50)

select * from student

-- 커서 선언
DECLARE CUR_STUDENT_GRADE CURSOR
FOR
SELECT ID, NAME, VALUE, GRADE FROM STUDENT
-- 커서 오픈
OPEN CUR_STUDENT_GRADE
-- 변수 선언
DECLARE @id int,
@name varchar(20),
@value tinyint,
@grade nchar(2)
-- 첫 행 패치
FETCH NEXT FROM CUR_STUDENT_GRADE INTO @ID, @NAME, @VALUE, @GRADE
-- 업데이트 구문 (WHILE~END), 다음 행 패치
WHILE @@FETCH_STATUS = 0
BEGIN
IF (@VALUE >= 90)
 BEGIN SET @GRADE = '수' END
ELSE IF (@VALUE >= 80)
 BEGIN  SET @GRADE = '우' END
ELSE IF (@VALUE >= 70)
 BEGIN  SET @GRADE = '미'  END
ELSE IF (@VALUE >= 60)
 BEGIN  SET @GRADE = '양' END
ELSE
 BEGIN  SET @GRADE = '가'  END
UPDATE STUDENT SET GRADE = @GRADE WHERE ID = @ID
FETCH NEXT FROM CUR_STUDENT_GRADE INTO @ID, @NAME, @VALUE, @GRADE
END
-- 커서 클로즈
CLOSE CUR_STUDENT_GRADE
-- 커서 삭제
DEALLOCATE CUR_STUDENT_GRADE
-- 결과 확인
SELECT * FROM STUDENT

------------------------------------------
-- 실습 테이블 재정의 --
drop table student
create table student
(
 id int primary key,
 name varchar(20) not null,
 value tinyint not null,  -- 점수
 grade nchar(1)  -- '수,우,미,양,가'
)

insert into student(id, name, value)
values(1, '철수', 60)
insert into student(id, name, value)
values(2, '영희', 80)
insert into student(id, name, value)
values(3, '인호', 50)

select * from student

-- 2. 위에서 작성한 커서를 if … else 문 대신에
-- case … when 문을 사용하여 작성하라.

-- 커서 정의
DECLARE CUR_STUDENT_GRADE2 CURSOR
FOR
SELECT * FROM STUDENT
-- 커서 오픈
OPEN CUR_STUDENT_GRADE2
-- 변수 선언
DECLARE @id int,
@name varchar(20),
@value tinyint,
@grade nchar(2)
-- 첫 행 패치
FETCH NEXT FROM CUR_STUDENT_GRADE2 INTO @ID, @NAME, @VALUE, @GRADE
-- 업데이트 (WHILE~END), 다음 행 패치
WHILE @@FETCH_STATUS = 0
BEGIN
UPDATE STUDENT
SET GRADE = (CASE WHEN @VALUE >= 90 THEN '수'
WHEN @VALUE >= 80 THEN '우'
WHEN @VALUE >= 70 THEN '미'
WHEN @VALUE >= 60 THEN '양'
ELSE '가' END)
WHERE ID = @ID
FETCH NEXT FROM CUR_STUDENT_GRADE2 INTO @ID, @NAME, @VALUE, @GRADE
END
-- 커서 클로즈
CLOSE CUR_STUDENT_GRADE2
-- 커서 삭제
DEALLOCATE CUR_STUDENT_GRADE2
-- 확인
SELECT * FROM STUDENT

Trackbacks 0 | Comments 0




microdesk's Blog is powered by Daum & tistory