Notice
Recent Posts
Recent Comments
Link
250x250
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
Tags
- 데이터베이스
- SQL
- QT
- SQLD
- 전산전자공학부
- 찬양
- 웹개발
- 날솟샘
- Database
- 한동대학교
- 날마다 솟는 샘물
- 설교
- 화학
- FE
- 남재창교수님
- 글로벌리더십학부
- 혼자공부하는sql
- 어노인팅
- dbms
- 묵상
- 프론트엔드
- Software Engineering
- 일반화학
- 유태준교수님
- CCM
- csee
- 예배
- GLS
- CHEMISTRY
- typeScript
Archives
- Today
- Total
멈추지 않는 기록
[혼자공부하는SQL] 18강 본문
728x90
07-1. 스토어드 프로시저 사용 방법
01. 시작하기 전에
- 스토어드 프로시저(Stored Procedure) : SQL에 프로그래밍에 기능을 추가해서 일반 프로그래밍 언어와 비슷한 효과를 낼 수 있다.
1. 스토어드 프로시저 기본
1) 스토어드 프로시저의 개념과 형식
- 스토어드 프로시저는 쿼리 문의 집합으로도 볼 수 있다.
- 어떠한 동작을 일괄 처리하기 위한 용도로도 사용한다.
- 자주 사용하는 일반적인 쿼리를 반복하는 것보다는, 스토어드 프로시저로 묶어 놓고, 필요할 때마다 간단히 호출만 하면 훨씬 편리하게 MySQL을 운영할 수 있다.
(1) 스토어드 프로시저 생성
DELIMITER $$
CREATE PROCEDURE 스토어드_프로시저_이름 (IN 또는 OUT 매개변수)
BEGIN
-- 이 부분에 SQL 프로그래밍을 코드를 작성
END %%
DELIMITER;
- $$는 $를 1개만 사용해도 되지만, 명확하게 표시하기 위해 2개를 사용하며, ##, &&, %%, // 등으로 바꿔도 된다.
- 이름은 마음대로 지어도 되지만, 가능하면 이름만으로 스토어드 프로시저라는 것을 알 수 있도록 표현하는 것이 좋다.
- CREATE PROCEDURE는 스토어드 프로시저를 만든 것뿐이며, 아직 실행(호출)한 것은 아니다.
(2) 스토어드 프로시저 호출
CALL 스토어드_프로시저_이름();
(3) 예시
-- 스토어드 프로시저 생성
DELIMITER $$
CREATE PROCEDURE user_proc()
BEGIN
SELECT * FROM member;
end $$
DELIMITER ;
-- 스토어드 프로시저 호출
CALL user_proc();
-- 스토어드 프로시저 삭제
DROP PROCEDURE user_proc;
2. 스토어드 프로시저 실습
1) 매개변수의 사용
- 스토어드 프로시저에서는 실행 시, 입력 매개변수를 지정할 수 있다.
(1) 종류
- 입력 매개변수
- 출력 매개변수
2) 입력 매개변수
(1) 형식
IN 입력_매개변수_이름 데이터_형식
(2) 사용
CALL 프로시즈_이름(전달_값);
3) 출력 매개변수
(1) 형식
OUT 출력_매개변수_이름 데이터_형식
(2) 사용
CALL 프로시저_이름(@변수명);
SELECT @변수명;
3) 예시를 통한 매개변수의 활용
(1) 입력 매개변수
DROP PROCEDURE IF EXISTS user_proc1;
DELIMITER $$
CREATE PROCEDURE user_proc1(IN userName VARCHAR(10))
BEGIN
SELECT * FROM member WHERE mem_name = userName;
end $$
DELIMITER ;
CALL user_proc1('에이핑크');
(2) 여러 개의 입력 매개변수
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);
(3) IN / OUT 매개변수
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 ;
-- 없는 테이블이라고 뜬다.
-- 앞서 user_proc3에서는 noTable이 없는데 스토어드 프로시저가 생성되었다.
-- 테이블이 없어도 스토어드 프로시저 안에서 사용하고, 실행하기 전에만 CREATE TABLE로 만들면 된다.
DESC noTable;
CREATE TABLE IF NOT EXISTS noTable(
id INT AUTO_INCREMENT PRIMARY KEY,
txt CHAR(10)
);
CALL user_proc3 ('테스트1', @myValue);
SELECT CONCAT('입력된 ID 값 --> ', @myValue);
(4) 조건문
DROP PROCEDURE IF EXISTS ifelse_proc;
DELIMITER $$
CREATE PROCEDURE ifelse_proc(
IN memName VARCHAR(10)
)
BEGIN
-- 변수 선언
DECLARE debutYear INT;
-- 연도만 추출해서 debutYear 변수에 대입
SELECT YEAR(debut_date) into debutYear FROM member
WHERE mem_name = memName;
IF (debutYear >= 2015) THEN
SELECT '신인 가수네요. 화이팅하세요' AS '메세지';
ELSE
SELECT '고참 가수네요. 그동한 수고하셨어요.' AS '메세지';
end if;
end $$
DELIMITER ;
CALL ifelse_proc('오마이걸');
CALL ifelse_proc('소녀시대');
(5) 반복문
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
SET hap = hap + num;
SET num = num + 1;
end while;
SELECT hap AS '1~100 합계';
end $$
DELIMITER ;
CALL while_proc();
(6) 동적 SQL
DROP PROCEDURE IF EXISTS dynamic_proc;
DELIMITER $$
CREATE PROCEDURE dynamic_proc(
IN tableName VARCHAR(20)
)
BEGIN
SET @sqlQuery = CONCAT('SELECT * FROM ', tableName);
PREPARE myQuery FROM @sqlQuery;
EXECUTE myQuery;
DEALLOCATE PREPARE myQuery;
end $$
DELIMITER ;
CALL dynamic_proc('member');
CALL dynamic_proc('buy');
728x90
'웹 개발 > MySQL' 카테고리의 다른 글
[혼자공부하는SQL] 20강 (0) | 2025.03.01 |
---|---|
[혼자공부하는SQL] 19강 (0) | 2025.03.01 |
[혼자공부하는SQL] 17강 (0) | 2025.02.26 |
[혼자공부하는SQL] 16강 (0) | 2025.02.26 |
[혼자공부하는SQL] 15강 (0) | 2025.02.26 |