Computer Study

[MySQL] Stored Procedure, Stored Function 이론 및 예제

Ny4m 2023. 12. 11. 23:46

목차

Stored Program

Stored Procedure

Exception

Stored Function

 


Stored Program

MySQL에서 제공하는 프로그래밍 언어 기능을 통틀어 일컫는 말

쿼리를 하나로 묶어 이름을 붙이고 호출하는 원리로 동작

Stored Program의 종류

- Stored Procedure

- Stored Function

- Trigger

- Cursor

 

변수 선언

DECLARE [변수 이름] [데이터 형식];

DECLARE num1 INT; -> num1 변수 선언

 

값 대입

SET [변수 이름] = 값;

SET num1 = 100; -> num1 변수에 값 대입

 


Stored Procedure (저장 프로시저)

MySQL에서 제공하는 프로그래밍 기능

쿼리의 집합으로서 어떠한 동작을 일괄 처리하는데 사용됨

모듈화해서 필요할 때마다 호출

DELIMITER $$
CREATE PROCEDURE 스토어드프로시저이름(매개변수)
BEGIN
~SQL 프로그래밍 코딩부분
END $$
DELIMITER ;

CALL 스토어드프로시저이름(); -> 생성한 프로시저 호출(실행)

 

입력 매개변수 지정

IN 입력매개변수이름 데이터형식

 

출력 매개변수 지정

OUT 출력매개변수이름 데이터형식

 

입력 매개변수가 있는 스토어드 프로시저 실행

CALL 프로시저이름(전달값);

 

예제

DELIMITER $$
CREATE PROCEDURE userPROC()
BEGIN
SELECT * FROM EMP;
SELECT * FROM DEPT;
END $$
DELIMITER ;

CALL userPROC();

 

작성된 Stored Procedure 확인

SHOW CREATE PROCEDURE 프로시저명;

 

Stored Procedure의 활용 1

CRATE TABLE STD(
SNO INT PRIMARY KEY,
SNAME VARCHAR(14) NOT NULL,
AGE INT NOT NULL);

STD 테이블에 데이터를 삽입할 때

INSERT INTO STD VALUES (...) 를 여러 번 수행해야 한다.

이 때, Stored Procedure를 활용해보자.

 

매개변수 : P_SNO, P_SNAME, P_AGE

DELIMITER $$
CREATE PROCEDURE ADD_STD(
IN P_SNO INT,
IN P_SNAME VARCHAR(14),
IN P_AGE INT)
BEGIN
INSERT INTO STD VALUES(P_SNO, P_SNAME, P_AGE);
END $$
DELIMITER ;

CALL ADD_STD(10,'PARK',21);
CALL ADD_STD(20,'KIM',20);

 

Stored Procedure 의 활용 2

DELIMITER $$
CREATE PROCEDURE PRINT_STD(
IN P_SNO INT)
BEGIN
SELECT * FROM STD WHERE SNO=P_SNO;
END $$
DELIMITER ;

CALL PRINT_STD(20);

 


IF ... ELSE ... END IF 문

조건에 따라 분기하는 명령 (이중 분기)

IF 조건1 THEN
SQL 명령1;
ELSEIF 조건2 THEN
SQL 명령2;
...
ELSE
SQL 명령N;
END IF;

 

Stored Procedure의 활용 3

DELIMITER $$
CREATE PROCEDURE PRINT_NUM(IN NUM INT)
BEGIN
IF (NUM>10) THEN
SELECT NUM;
ELSEIF (NUM<10) THEN
SELECT NUM*10;
ELSE
SELECT POW(NUM,2);
END IF;
END $$
DELIMITER ;

CALL PRINT_NUM(5);
CALL PRINT_NUM(10);

 


CASE 문

조건에 따라 분기하는 명령 (다중 분기)

//SELECT 문에서의 CASE 사용

CASE
WHEN 조건1 THEN '반환값'
WHEN 조건2 THEN '반환값'
...
ELSE '반환값'
END;


//Stored Procedure 내에서의 CASE 사용

CASE
WHEN 조건1 THEN
SQL 명령1;
WHEN 조건2 THEN 
SQL 명령2;
...
ELSE
SQL 명령N;
END CASE;

 

Stored Procedure의 활용 4

EMP 테이블에 존재하는 7876번 사원의 급여가 1300 미만이면 LOW,

1300 이상 2900 미만이면 MIDDLE, 2900 이상이면 HIGH로 표시하는 SQL 문 작성

SELECT EMPNO, ENAME, JOB, SAL,
(CASE
WHEN SAL<1300 THEN 'LOW'
WHEN SAL<2900 THEN 'MIDDLE'
ELSE 'HIGH'
END) AS 'RANK'
FROM EMP
WHERE EMPNO=7876;

 

이 SQL문을 응용하여 EMPNO를 입력 받아

'이름(ENAME), 급여(SAL), 급여정도(HIGH, MIDDLE, LOW)' 를 구분하는 Stored Procedure를 작성해보자.

- 프로시저 이름은 RANK_SAL

- 입력 받는 매개변수 이름은 P_EMPNO, 데이터 형식은 INT(10)

- 급여정도 (HIGH, MIDDLE, LOW) 의 컬럼명은 GRADE 로 출력

DELIMITER $$
CREATE PROCEDURE RANK_SAL(IN P_EMPNO INT(10))
BEGIN
SELECT ENAME, SAL,
(CASE
WHEN SAL<1300 THEN 'LOW'
WHEN SAL<2900 THEN 'MIDDLE'
ELSE 'HIGH'
END) AS 'GRADE'
FROM EMP
WHERE EMPNO=P_EMPNO;
END $$
DELIMITER ;

CALL RANK_SAL(7876);

 


WHILE문

조건이 참인 동안 WHILE 문 내의 명령을 반복함

WHILE 조건 DO
SQL 명령문;
END WHILE;

 

LABEL 지정

- WHILE문에 LABEL을 지정

 

ITERATE 문

- ITERATE 문을 만나면 바로 WHILE 문으로 이동하여 다시 조건 비교

 

LEAVE 문

- LEAVE 문을 만나면 WHILE 문을 빠져나옴

 

예제

1~100의 수 중 5의 배수를 제외한 나머지 수들의 합계를 구하는데,

합이 500이 넘지 않도록 하는 프로그램

 

DECLARE i INT;
DECLARE sum INT;
SET i=1;
SET sum=0;

myLoop: WHILE(i<=100) DO
IF (i%5=0) THEN
SET i=i+1;
ITERATE myLoop; //지정한 LABEL문으로 이동
END IF;

SET sum=sum+i;

IF (sum>500) THEN
SET sum=sum-i;
LEAVE myLoop;
END IF;

SET i=i+1;
END WHILE;

 


Exception 오류 처리

액션

- 오류가 발생했을 때의 행동을 정의

- CONTINUE : 처리할 문장 부분을 처리하고 계속 진행

- EXIT : 처리할 문장 부분을 처리하고 Stored Procedure 종료

오류 조건

- 어떤 오류를 처리할 것인지 지정

- MYSQL_ERRORCODE : MySQL에서만 유효한 에러 식별 번호 (4자리 숫자)

- SQLSTATE : ANSI SQL 표준을 준수하는 DBMS에서 갖는 여러 가지 상태를 의미하는 코드 (5자리 문자열)

- SQLEXCEPTION : 에러가 발생하는 상황을 제어하는 데사용

- SQLWARNING : 경고가 발생하는 상황을 제어하는 데 사용

- NOT FOUND

DECLARE 액션 HANDLER FOR 오류조건 처리할문장;

 

Table이 없는 경우 예제

오류 코드 : 1146 OR 상태 코드 : '42S02'

DELIMITER $$
CREATE PROCEDURE errorProc1()
BEGIN
DECLARE CONTINUE HANDLER FOR 1146
SELECT '이 테이블은 존재하지 않습니다.' AS '메시지';
SELECT * FROM DEPT;
SELECT * FROM noTable;
SELECT * FROM EMP;
END $$
DELIMITER ;

*CONTINUE 나 EXIT으로

 


Stored Function (스토어드 함수)

사용자 정의 함수

SELECT 문 안에서 호출

RETURNS 문으로 하나의 값을 반환

DELIMITER $$
CREATE FUNCTION 스토어드함수이름(매개변수)
RETURNS 반환형식
BEGIN
~SQL 프로그래밍 코딩부
RETURN 반환값;
END $$
DELIMITER ;

SELECT 스토어드함수이름();

 

스토어드 함수 생성 시

시스템 변수인 log_bin_trust_function_creators를 on으로 변경

//ON/OFF 확인

SHOW global variables like 'log_bin_trust_function_creators';

//ON 으로 변경

SET global log_bin_trust_function_creators=1;

 

Stored Function 의 활용 1

출생연도를 입력하면 나이가 출력되는 함수

DELIMITER $$
CREATE FUNCTION getAgeFunc(byear INT)
RETURNS INT
BEGIN
DECLARE age INT
SET age=YEAR(CURDATE())-byear+1;
RETURN age;
END $$
DELIMITER ;

SELECT getAgeFunc(1988);

 

Stored Function 의 활용 2

10%의 세율을 얻는 함수

DELIMITER $$
CREATE FUNCTION tax(p_value INT)
RETURNS DECIMAL(5,2)
BEGIN
RETURN (p_value*0.1);
END $$
DELIMITER;

SELECT tax(1300);

 

생성한 Stored Function 확인

SHOW CREATE FUNCTION 함수명;

 

프로시저 삭제

DROP PROCEDURE 프로시저명;

 

함수 삭제

DROP PROCEDURE 함수명;

 

Stored Procedure / Stored Function 차이점

  Stored Procedure Stored Function
매개변수 입력, 출력 매개변수 모두 사용 입력 매개변수만 사용
반환 반환 구문 x, OUT으로 값 반환 RETURN 문으로 하나의 값 반환
호출 CALL로 호출 SELECT문 안에서 호출
SELECT 문 사용 프로시저 내 SELECT 문 사용 가능 함수 내 SELECT 문 사용 불가
주 역할 여러 쿼리문을 하나로 묶어 일괄 처리 어떤 계산을 통해 하나의 값을 반환