본문 바로가기

기타

[MySQL] Stored Procedure 만드는 방법

지난 번에, Stored Procedure가 뭔지..


그리고 Stored Procedure를 위한 최소한의 것들은 무엇이 있는지를 알아보았습니다.


이번에는 SET 이라는 것에 대해서 SET은 변수를 만들어주고 변수에 값을 집어 넣는 역할을 하죠.


MySQL에서 SET 명령어를 이용해서 변수명 count를 만들게 되면,


SET @count = 0;


이렇게 하시면 됩니다.


이제 간단한 예제는 만들어 볼 수 있습니다.


한번 Stored Procedure를 만들어 보도록 하죠~!


우리가 만들 프로시저는 shop이라는 테이블(뭐.. 가게 정보가 있다고 하죠)이 있으면, 그 shop이라는 테이블의 총 숫자를 위에서 살펴본것 처럼 변수에 다 넣는 예제를 해보도록하죠.


이번 프로시저 이름은 "getshopCount" 라고 짓겠습니다.


일단 프로시저를 만들기 전에는 어떤 역할을 할것인가를 분명하게 세워 놓고, 그 역할에 맞추어서 프로시저이 핵심 쿼리문 정도는 미리 다 마련해 놓고 테스트 하는 것이 중요합니다.


그럼 우리가 만들 "getshopCount" 프로시저에서는 가게의 총 숫자를 가져오는 쿼리문이 필요하겠죠.


그럼 count라는 기본으로 제공되는 함수를 이용해서 해보도록 하겠습니다.


SELECT COUNT(*) FROM shop;


이렇게 하면, 모든 가게의 갯수가 나오게 됩니다.


그럼 핵심 쿼리문이 나왔으니, 프로시저 껍데기를 한번 만들어 보도록 하죠.


DELIMITER $$


CREATE PROCEDURE getshopCount()

BEGIN


END $$


DELIMITER ;


이렇게 되겠네요.


그럼, 이번에는 변수를 하나 만들고~ 그 변수에 다가 쿼리 결과 값을 넣어야 하기 때문에, getshopCount는 OUT 타입의 파라미터를 하나 받아야겠죠.


그래야 나중에 다른 넘이 가져다 쓸 수 있을테니까요.


그리고 위의 쿼리문 ("SELECT COUNT(*) FROM shop;") 을 좀 손을 봐야 하겠네요.


어떻게?? INTO를 집어 넣어서 변수에다 쏘~~ 옥 넣을 겁니다.


//DELIMITER 설정

DELIMITER $$

//SET을 이용한 xcount란느 변수 설정

SET @xcount = 0$$


//처음 보죠?? 아래에서 설명드리겠습니다.

DROP PROCEDURE IF EXISTS getshopCount$$


//이것두~~ 아래에서 설명드리겠습니다.

CREATE PROCEDURE getshopCount(OUT xcount INT)

BEGIN

  SELECT count(*) INTO xcount FROM shop;

END $$


//DELIMITER를 다시 ';'로 바꿈.

DELIMITER ;


명령 한줄이 끝날때마다 DELIMITER인 $$를 붙여준다는 것을 잊으시면 안됩니다~!


[ DROP PROCEDURE IF EXISTS getshopCount$$ ]


이것은 프로시저가 생성된 상태에서 또 생성을 하게 되면, 중복 생성이 되지 않기 때문에 기존에 똑같은 이름 즉, getshopCount라는 이름의 프로시저가 있다면 과감하게 버리라는 명령입니다.



"DROP PROCEDURE 프로시저를 버려라, IF 만약 EXISTS 존재한다면, 

getshopCount getshopCount가"


라고 해석할 수 있겠네요~


그리고 이번에는 프로시저 선언 부분을 보죠.


CREATE PROCEDURE getshopCount(OUT xcount INT)

BEGIN

  SELECT count(*) INTO xcount FROM shop;

END $$


움... 파라미터를 선언 할때는 (파라미터타입 파라미터명 파라미터데이터형) 의 형태로 지정해줘야 합니다.


파라미터 타입은 IN, OUT, INOUT 중에서 우리는 값을 수정할 목적으로 끌어오는 놈이기 때문에 이중 OUT을 썼고요. (INOUT을 써도 무방~ ^^)

그리고 파라미터명은 


SET @xcount = 0$$


기억나시죠?? 이줄... 여기서 선언한 xcount를 쓰려고 하는 합니다.


그리고 파라미터데이터 형은 숫자기 때문에 INT 형으로 했고요.


그래서 CREATE PROCEDURE getshopCount(OUT xcount INT) 이 완성된겁니다.

이제는 프로시저의 시작이니 BEGIN 을 넣었고요.


SELECT count(*) INTO xcount FROM shop;


shop테이블의 모든 로우값(줄 갯수)를 xcount 변수에 밀어 넣어라~ 라는 말입니다.


이제 다, 된듯 싶습니다.


그럼 이번에는 xcount 값을 보는 프로시저를 간단히 만들어보죠.

이번 보다는 더 쉽습니다~~!


CREATE PROCEDURE showXcount()

BEGIN

  SELECT @xcount;

END$$


특별한 사항은 없습니다.


단지, SELECT @xcount; 이부분이 신기할 뿐입니다.

이것은 변수를 출력을 할때 쓰는 것이고요. 


SELECT 문법상 SELECT 글 다음에는 컬럼명이 나와야 하므로


SET @xcount 처럼 @를 붙여주게 된겁니다.


하지만, 일반적으로 변수를 다룰 때는 아래 처럼 

  

SET xcount = xcount + 10;


변수명 앞에 @를 붙이지 않습니다. 


이것이 좀 헛갈리는 부분이라 할 수 있죠.


그리고 조심하셔야 할 부분은 프로시저가 끝나고나서 반드시 END를 쓰실때

$$ 를 빼먹지 마세요~!

반응형