<스토어드 프로시저 (stored procedure)>
DELIMITER $$
CREATE PROCEDURE 스토어드_프로시저_이름()
BEGIN
'SQL 프로그래밍 코딩'
END -- 책에는 END $$ 이지만 나의 MySQL 8.0.0 버전에서 에러 발생
DELIMTER ;
CALL 스토어드_프로시저_이름(); -- 호출
IF 문
DROP PROCEDURE IF EXISTS ifProc1;
DELIMITER $$
CREATE PROCEDURE ifProc1()
BEGIN
IF 100 = 100 THEN
SELECT '100은 100과 같습니다.'; -- 문자 출력
END IF;
END
DELIMITER ;
CALL ifProc1();
▶ IF ~ ELSE
DROP PROCEDURE IF EXISTS ifProc2;
DELIMITER $$
CREATE PROCEDURE ifProc2()
BEGIN
DECLARE myNum INT;
SET myNum = 200;
IF myNum = 100 THEN
SELECT '100입니다.';
ELSE
SELECT '100이 아닙니다.';
END IF;
END
DELIMITER ;
CALL ifProc2();
▶ IF 문 활용
DROP PROCEDURE IF EXISTS ifProc3;
DELIMITER $$
CREATE PROCEDURE ifProc3()
BEGIN
-- 변수 3개
DECLARE debutDate DATE;
DECLARE curDate DATE;
DECLARE days INT;
SELECT debut_date INTO debutDate
FROM market_db.member
WHERE mem_id = 'APN';
SET curDate = CURRENT_DATE(); -- 현재 날짜 저장
SET days = DATEDIFF(curDate, debutDate); -- 일 단위 날짜 차이
IF (days/365) >= 5 THEN -- 5년 지났다면
SELECT CONCATE('데뷔한 지', days, '일이나 지났습니다. APN 축하합니다!');
ELSE
SELECT '데뷔한 지' + days + '일빡에 안되었네요. APN 화이팅~';
END IF;
END
DELIMITER ;
CALL ifProc3();
< 날짜 관련 함수>
- CURRNET_DATE() : 오늘 날짜를 알려주는 함수
- CURRENT_TIMESTAMP() : 오늘 날짜 와 시간을 알려주는 함수
- DATEDIFF(날짜1, 날짜2) : 날짜2 부터 날짜1 까지 몇 일 인지 알려주는 함수
CASE 문
DROP PROCEDUER IF EXISTS caseProc;
DELIMITER $$
CREATE PROCEDURE caseProc()
BEGIN
DECLARE point INT ;
DECLARE credit CHAR(1);
SET point = 88 ;
CASE
WHEN point >= 90 THEN
SET credict = 'A';
WHEN point >= 80 THEN
SET credict = 'B';
WHEN point >= 70 THEN
SET credict = 'C';
WHEN point >= 60 THEN
SET credict = 'D';
ELSE
SET credit = 'F';
END CASE;
SELECT CONCAT ('취득점수 => ', point), CONCAT('학점 => ', credit);
END
DELIMITER ;
CALL caseProce();
▶ case 문 활용
SELECT m.mem_id, m.mem_name, SUM(b.price * b.amount) '총구매액'
CASE
WHEN (SUM(b.price * b.amount) >= 1500) THEN '최우수고객'
WHEN (SUM(b.price * b.amount) >= 1000) THEN '우수고객'
WHEN (SUM(b.price * b.amount) >= 1) THEN '일반고객'
ELSE '유령고객'
END '회원등급'
FROM buy b
RIGHT OUTER JOIN members m
ON b.mem_id = m.mem_id
GROUP BY m.mem_id
ORDER BY SUM(price* amount) DESC ;
WHILE 문
DROP PROCEDURE IF EXISTS whileProc;
DELIMITER $$
CREATE PROCEDURE whileProc()
BEGIN
DECLARE i INT;
DECLARE hap INT;
SET i = 1;
SET hap = 0;
WHILE (i <= 100) DO
SET hap = hap + i;
SET i = i + 1;
END WHILE;
SELECT '1 부터 100까지의 합 => ' , hap;
END
DELIMITER ;
CALL whileProc();
▶ while 문 활용
DROP PROCEDURE IF EXISTS whileProc2;
DELIMITER $$
CREATE PROCEDURE whileProc2()
BEGIN
DECLARE i INT;
DECLARE hap INT;
SET i = 1;
SET hap = 0;
myWhile: -- WHILE 문을 myWhile이라는 레이블로 지정
WHILE (i <= 100) DO
IF (i%4 = 0) THEN
SET i = i + 1;
ITERATE myWhile; -- 지정한 레이블(label)인 myWhile로 가서 계속 진행
END IF;
SET hap = hap + i;
IF (hap > 1000) THEN
LEAVE myWhile; -- 지정한 레이이블 myWhile을 빠져나간다. WHILE 종료
END IF;
SET i = i + 1;
END WHILE;
SELECT '1 부터 100 까지의 합(4의 배수 제외), 1000 넘으면 종료 => ' , hap;
END
DELIMITER ;
CALL whileProc2();
동적 SQL
-- 출입용 테이블 생성, id 는 자동으로 증가
DROP TABLE IF EXISTS gate_table;
CREATE TABLE gate_table (id INT AUTO_INCREMENT PRIMARY KEY, entry_time DATETIME);
SET @curDate = CURRENT_TIMESTAMP();
PREPARE myQuery FROM 'INSERT INTO gate_table VALUES(NULL, ?)'; -- 실행할 SQL문 준비
EXECUTE myQUery USING @curDate -- @curDate에 있는 값을 ?에 전달(입력)
DEALLOCATE PREPARE myQuery; -- ? 에 입렵된 값 지우고 같은 sql 문으로 준비
SELECT * FROM gate_table;
'DataBase > MySQL' 카테고리의 다른 글
MySQL- 가상의 테이블 View (0) | 2023.08.26 |
---|---|
MySQL- 테이블 제약조건 (0) | 2023.08.26 |
MySQL - 테이블 묶는 조인(JOIN) (0) | 2023.08.12 |
MySQL - 데이터 형 변환 (0) | 2023.08.04 |
MySQL - 변수사용 (0) | 2023.08.04 |