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
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
댓글 없음:
댓글 쓰기