스토어드 프로시저는 SQL문과 프로그래밍 기능이 합쳐진 것이 스토어드 프로시저이다.
스토어드 프로시저의 형식은 아래와 같다.($$ 또는 ##을 많이 쓴다.)
커피에 비유를 해보면 스토어드 프로시저 생성은 커피 자판기를 만드는 것이고 스토어드 프로시저 호출은 커피를 뽑는 것이다.
아래 CALL과정이 커피를 뽑는 작업이라 보면된다.
프로시저를 생성해주고
DROP PROCEDURE IF EXISTS user_proc;
DELIMITER $$
CREATE PROCEDURE user_proc()
BEGIN
SELECT * FROM member; -- 스토어드 프로시저 내용
END $$
DELIMITER ;
실행을 시킨다. 여러 번 실행시킬 수가 있다.
CALL user_proc();
프로시저를 삭제를 해보자.
DROP PROCEDURE user_proc;
입력 매개변수를 넣어보자.
USE market_db;
DROP PROCEDURE IF EXISTS user_proc1;
DELIMITER $$
CREATE PROCEDURE user_proc1(IN userName VARCHAR(10))
BEGIN
-- 여기서 SELECT * FROM member WHERE mem_name = 에이핑크 라고 넘어간다.
SELECT * FROM member WHERE mem_name = userName;
END $$
DELIMITER ;
CALL user_proc1('에이핑크');
다른 매개변수를 넣어보자.
DROP PROCEDURE IF EXISTS user_proc2;
DELIMITER $$
CREATE PROCEDURE user_proc2(
IN userNumber INT,
IN userHeight INT )
BEGIN
SELECT * FROM member
WHERE mem_number > userNumber AND height > userHeight;
END $$
DELIMITER ;
CALL user_proc2(6, 165);
DROP PROCEDURE IF EXISTS user_proc3;
DELIMITER $$
CREATE PROCEDURE user_proc3(
IN txtValue CHAR(10),
OUT outValue INT )
BEGIN
INSERT INTO noTable VALUES(NULL,txtValue);
SELECT MAX(id) INTO outValue FROM noTable;
END $$
DELIMITER ;
-- noTable이 있는지 없는지 확인
DESC noTable;
noTable은 프로시저를 생성하는 시점 noTable이 있는지 없는지 확인을 안하고 프로시저를 실행하는 시점에 noTable이 있는지 학인한다.
CREATE로 noTable을 만들어보자.
CREATE TABLE IF NOT EXISTS noTable(
id INT AUTO_INCREMENT PRIMARY KEY,
txt CHAR(10)
);
@를 붙여서 변수명을 넘기고 SELECT 해주면 아래와 같다.
여러번 눌러주면 여러번 증가한다.
CALL user_proc3 ('테스트1', @myValue);
SELECT CONCAT('입력된 ID 값 ==>', @myValue);
프로시저를 만들고 내용을 출력해보자.
DROP PROCEDURE IF EXISTS ifelse_proc;
DELIMITER $$
CREATE PROCEDURE ifelse_proc(
IN memName VARCHAR(10)
)
BEGIN
DECLARE debutYear INT; -- 변수 선언
-- 대뷔연도만 추출하게 된다.
SELECT YEAR(debut_date) into debutYear FROM member
-- 오마이걸의
WHERE mem_name = memName;
-- 2015년보다 크면 ~~~
IF (debutYear >= 2015) THEN
SELECT '신인 가수네요. 화이팅 하세요.' AS '메시지';
ELSE
SELECT '고참 가수네요. 그동안 수고하셨어요.'AS '메시지';
END IF;
END $$
DELIMITER ;
CALL ifelse_proc ('오마이걸');
반복문을 써보자.
DROP PROCEDURE IF EXISTS while_proc;
DELIMITER $$
CREATE PROCEDURE while_proc()
BEGIN
DECLARE hap INT;
DECLARE num INT;
SET hap = 0;
SET num = 1;
WHILE (num <= 100) DO -- 100까지 반복
SET hap = hap + num;
SET num = num + 1; -- 숫자증가
END WHILE;
SELECT hap AS '1~100합계';
END $$
DELIMITER ;
CALL while_proc();
동적 SQL을 살펴보자.
DROP PROCEDURE IF EXISTS dynamic_proc;
DELIMITER $$
CREATE PROCEDURE dynamic_proc(
-- 테이블 이름이 만들어진 쿼리문이
IN tableName VARCHAR(20)
)
BEGIN
-- 동적으로 바뀐다.
SET @sqlQuery = CONCAT('SELECT * FROM ', tableName);
-- query문을 준비하고
PREPARE myQuery FROM @sqlQuery;
-- query문을 실행
EXECUTE myQuery;
DEALLOCATE PREPARE myQuery;
END $$
DELIMITER ;
CALL dynamic_proc ('member');
CALL dynamic_proc ('buy');
<출처 한빛미디어: 스토어드 프로시저(stored procedure)의 개념과 사용 방법(입출력 매개변수의 활용 방법)>
https://www.youtube.com/watch?v=cw1wGN0ZdFA&list=PLVsNizTWUw7GCfy5RH27cQL5MeKYnl8Pm&index=19
'SQL(MySQL)' 카테고리의 다른 글
자동으로 실행되는 트리거(trigger)의 개념과 트리거를 활용하여 데이터 백업하는 방법 (0) | 2022.04.19 |
---|---|
스토어드 함수와 커서의 개념, 커서(cursor)의 단계별 실습 방법 (0) | 2022.04.19 |
인덱스의 생성과 제거 문법 (0) | 2022.04.12 |
인덱스의 내부 작동 원리와 구조 & 데이터 검색하기 (0) | 2022.04.12 |
인덱스 개념과 장단점, 클러스터형 인덱스와 보조 인덱스 (0) | 2022.04.12 |