레이블이 PROCEDURE(프로시저)인 게시물을 표시합니다. 모든 게시물 표시
레이블이 PROCEDURE(프로시저)인 게시물을 표시합니다. 모든 게시물 표시

2017년 3월 29일 수요일

[MS-SQL] Mssql Cursor(커서) 사용하기 2 - (mssql 커서(cursor) 응용)


1. Cursor(커서) 를 이용한 결과 값 출력

- USERTABLE 의 SELECT 값을 CURSOR 을 이용하여 출력을 하는데 이때, PRINT 함수를
이용하여 메시지로 꾸며서 출력을 하겠습니다.

- USERTABLE SELECT 값

 - CURSOR 을 이용하여 PRINT 함수로 출력

* Query 문 분석

- SQL 문을 한줄 씩 살펴 보겠습니다.

+ DECLARE @temp_username NVARCHAR(50), @temp_tel NVARCHAR(50)
-> 커서 에서 반환하는 유저이름, 유저전화번호를 저장할 변수를 생성합니다.

+ DECLARE test_cur CURSOR FOR SELECT USERNAME, TEL FROM USERTABLE
-> 커서 생성 및 커서에 대입할 SELECT 구문을 작성 합니다.

+ OPEN test_cur
-> 커서 사용 준비를 합니다.

+ FETCH NEXT FROM test_cur INTO @temp_username, @temp_tel
-> 커서에서 첫번째 행 값을 읽어 변수에 대입합니다.

+ PRINT '----- CURSOR DOCUMENT START -----'
-> PRINT 함수를 사용하여 문서 시작을 알립니다.

+ WHILE @@FETCH_STATUS = 0
-> @@FETCH_STATUS 는 FETCH 문의 실행 상태를 반환 합니다. ( 0 : 수행, -1 : 실패, -2 : 행 없음)
즉 FETCH NEXT 문이 성공적으로 수행되면 WHILE 문이 수행되며 실패, 또는 커서의 행을 모두 반환하여
행이 없을 경우 WHILE 문이 종료 됩니다.
+ PRINT '유저이름 || 유저전화번호'
PRINT '[ ' + @temp_username + ' ] || [ ' + @temp_tel + ' ]'
-> 변수에 저장된 값을 PRINT 함수를 이용하여 출력합니다.

+ FETCH NEXT FROM test_cur INTO @temp_username, @temp_tel
-> 커서에서 다음행을 불러와 변수에 대입합니다.

+ CLOSE test_cur
-> OPEN 된 커서를 닫습니다.
+ DEALLOCATE test_cur
-> 커서에 할당된 리소스를 제거 합니다.

[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