2017년 3월 29일 수요일

[MSSQL] PROCEDURE(프로시저)와 CURSOR(커서)의 활용

set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
go
--  실행문
--  EXEC TEST_PROCEDURE '강길동', '05600000'

--  현재의 DATABASE에 아래에서 선언한 내용이 없기 때문에 프로시저를 생성하면 오류 발생하므로
--  아래의 구문에 맞게 DATABASE를 생성하거나 이미 만들어 놓은 DATABASE에 맞게 아래의 PROCEDURE내용을 바꿔야 함

CREATE PROCEDURE [dbo].[TEST_PROCEDURE] -- 프로시저를 생성할 때 사용(생성하고 또 실행하게 될 경우 이미 존재했다면서 오류 발생)
ALTER PROCEDURE [dbo].[TEST_PROCEDURE]  -- 프로시저의 내용을 변경할 때 사용(CREATE를 한번 실행한 후 계속 ALTER로 사용하면 됨)
    --프로그램에서 넘겨 받을 변수선언
    @strName            VARCHAR(10)   = '',              -- 1. 이름
    @strNumber         VARCHAR(10)   = '',              -- 2. 번호

    --프로그램으로 넘겨줄 변수선언
    @Rtn               INT                  = 0   OUTPUT,    -- 3. 리턴 값(숫자)
    @Msg             VARCHAR(255)  = ''  OUTPUT     -- 4. 리턴 값(문자)
AS
BEGIN
  DECLARE @strTEL         VARCHAR(11);              -- 일반 변수      
                   
  -- 변수 초기화(SET명령어는 해당 변수에 값을 넣어준다)
  SET     @Msg            = '프로시저를 시작했습니다.'

  -- 이처럼 SELECT문의 결과를 SET명령어를 사용하여 변수에 저장할 수 있음
  SET @strTEL = (SELECT HACKBUN
                         FROM   STUDENT
                         WHERE  STUDENT_NAME = @strName
                         AND    STUDENT_NUMBER = @strNumber)

  -- CURSOR 생성
  DECLARE CURSOR_NAME CURSOR FOR
    -- CURSOR안에서 사용할 값을 SETTING
    SELECT STUDENT_TEL
    FROM   STUDENT
    WHERE  STUDENT_NAME = @strName
    AND    SEQ = @strNumber

  OPEN CURSOR_NAME  --CURSOR_NAME은 임시로 만든 이름으로 사용자에 맞게 변경해주어도 된다
  --다만 FETCH문도 동일하게 바꿔주어야 하며, CLOSE, DEALLOCATE문에도 같은 이름을 사용해야 한다
  FETCH NEXT FROM CURSOR_NAME INTO @strTEL----------------- 1
                         
  -- FETCH_STATUS의 값이 성공(0)일때 WHILE문 실행
  WHILE @@FETCH_STATUS = 0  BEGIN  
    INSERT INTO ADDRESS (STUDENT_NAME, ADDRESS,    TEL)
    VALUES                       (@strName,           '대한민국',   @strTEL);

    -- 이 부분에 새로운 CURSOR를 생성해서 사용해도 된다
    -- 즉, 다중 CURSOR문이 가능
    -- 이 안에 CURSOR를 생성하게 되면 결과는
    -- 첫번째 CURSOR에서 생성되는 값을 두번째 CURSOR에서 또 사용할 수 있어서 후처리를 할 때 편하다   

  FETCH NEXT FROM CURSOR_NAME INTO @strTEL------------------2
  END;

  -- 1, 2번의 INTO뒤에 있는 변수는 CURSOR를 생성할 때 받는 값을 저장할 변수로써,
  -- 생성 부분의 SELECT문의 결과 개수와 1, 2의 FETCH문의 개수가 일치해야 됨
  -- 1, 2번은 똑같아야 한다.

  CLOSE CURSOR_NAME -- CURSOR 닫기
  DEALLOCATE CURSOR_NAME  -- CURSOR 해체

  SET @Msg = '정상적으로 처리가 되었을까요??'
END


댓글 없음:

댓글 쓰기