...

μ€ν μ΄λ νλ‘μμ
νλ‘μμ λ μΌλ ¨μ 쿼리λ₯Ό λͺ¨μ λ§μΉ νλμ ν¨μμ²λΌ μ€ννκΈ° μν 쿼리μ μ§ν©μ΄λ€.
β
[ νλ‘μμ μ₯μ ]
- νλμ μμ²μΌλ‘ μ¬λ¬ SQLλ¬Έμ μ€νν μ μλ€.(λ€νΈμν¬μ λν λΆνλ₯Ό μ€μΌ μ μλ€.)
- 미리 ꡬ문 λΆμ λ° λ΄λΆ μ€κ° μ½λλ‘ λ³νμ λλ΄μΌ νλ―λ‘ μ²λ¦¬ μκ°μ΄ μ€μ΄λ λ€.
- λ°μ΄ν°λ² μ΄μ€ νΈλ¦¬κ±°μ κ²°ν©νμ¬ λ³΅μ‘ν κ·μΉμ μν λ°μ΄ν°μ μ°Έμ‘°λ¬΄κ²°μ± μ μ§κ° κ°λ₯νκ² λλ€.
κ°λ¨ν λ§νλ©΄ μμ© νλ‘κ·Έλ¨ μΈ‘ λ‘μ§μ κ°μ§μ§ μκ³ λ λ°μ΄ν°λ² μ΄μ€μ λ°μ΄ν° μλ€κ° λ§κ² λ μ μλ€.
β
[ νλ‘μμ λ¨μ ]
- μ½λ μμ°μΌλ‘μμ μ¬μ¬μ©μ±μ΄ λμλ€.(μ΄λΆλΆ λλ¬Έμ μ€λ¬΄μμ κ±°μ μμ°λ νΈμ΄λ€)
- μ 무μ μ¬μ λ³κ²½ μ μΈλΆ μμ© νλ‘κ·Έλ¨κ³Ό ν κ» νλ‘μμ μ μ μλ₯Ό λ³κ²½ν νμκ° μλ€.
μ€ν μ΄λ νλ‘μμ μ¬μ©λ²
νλ‘μμ λ€ λͺ©λ‘ νμΈ
show procedure status;
β
νλ‘μμ μ μ (μμ±)
-- DELIMITERλ νλ‘μμ μ,λ€μ μμΉνμ¬ μμ μλ λΆλΆμ νλ²μ μ€νλ μ μκ² νλ μν μ νλ€.
DELIMITER $$
-- νλ‘μμ μ μ
CREATE PROCEDURE search_user(IN txtValue CHAR(10), OUT outValue int) #INμ 맀κ°λ³μ μ
λ ₯κ°, outμ RETURN κ°μ κ°λ
μ΄λ€. μΆλ ₯κ°
-- νλ‘μμ μ€ν λ΄μ© μ μ
BEGIN
SELECT USER, HOST FROM MYSQL.USER;
END $$
DELIMITER;
νλ‘μμ νΈμΆ
CALL νλ‘μμ λͺ
(맀κ°λ³μλ€);
β
νλ‘μμ λ΄μ© μ‘°ν
show create procedure νλ‘μμ λͺ
;
β
νλ‘μμ λ¬Έλ² κ΅¬μ±
DROP PROCEDURE IF EXISTS calculate_grade;
DELIMITER $$
CREATE PROCEDURE calculate_grade(
IN in_mid DOUBLE, -- 맀κ°λ³μλ INμΌλ‘ κ°μ Έμ¨λ€.
IN in_end DOUBLE,
IN in_att INT,
IN in_rep INT,
IN in_class_num INT,
IN in_student_num INT )
BEGIN
-- μ§μ λ³μ μ μΈ
DECLARE total DOUBLE DEFAULT 0; -- double total = 0; κ³Ό κ°λ€κ³ 보면 λλ€.
DECLARE grade VARCHAR(2);
-- λ³μ μ΄κΈ°ν
SET total = in_mid + in_end + in_att + in_rep; -- μΈμλ₯Ό λ€ λνλ€.
-- λΆκΈ°
IF total >= 95 AND total <= 100 THEN
SET grade = 'A+';
ELSEIF total >=90 AND total < 95 THEN
SET grade = 'A';
ELSEIF total >=85 AND total < 90 THEN
SET grade = 'B+';
ELSEIF total >=80 AND total < 85 THEN
SET grade = 'B';
ELSEIF total >=75 AND total < 80 THEN
SET grade = 'C+';
ELSEIF total >=70 AND total < 75 THEN
SET grade = 'C';
ELSEIF total >=65 AND total < 70 THEN
SET grade = 'D+';
ELSEIF total >=60 AND total < 65 THEN
SET grade = 'D';
ELSEIF total >=0 AND total < 60 THEN
SET grade = 'F';
END IF;
-- 쿼리문
UPDATE university.course
SET
course_mid = in_mid,
course_end = in_end,
course_report = in_rep,
course_attendance = in_att,
course_total = total,
course_grade = grade
WHERE course_student_num = in_student_num AND course_class_num = in_class_num AND course_num >= 1;
END $$
DELIMITER ;
-- νλ‘μμ μ€ν (νΈμΆ)
CALL calculate_grade(40.0, 30.0, 9,9,1,2019160160);
β
DELIMITER
- νλ‘μμ λ νΈλ¦¬κ±°μμ μ¬μ©λλ€.
- νλ‘μμ λ₯Ό μμ±ν λ νλ‘μμ μμ μλ 쿼리λ€μ΄ ;μΌλ‘ μΈν΄ μ€νλλ©΄ μλκΈ° λλ¬Έμ μ΄λ₯Ό λ§κΈ° μν΄ DELIMITERλ₯Ό μ΄μ©νμ¬ DELIMITERλ₯Ό μ΄μ©νμ¬ μ§μ λ λ¬Έμκ° λνλκΈ° μ κΉμ§λ ;μ λ§λλ μ€νλμ§ μκ² λ§μμ€λ€.
β
IN / OUT
- in : νλ‘μμ λ₯Ό νΈμΆνκΈ° μν΄ νμν μ 보λ€λ‘ ν¨μμ 맀κ°λ³μ(μΈμ)μ ν΄λΉνλ€.
- out : ν¨μμ λ°νκ°μΌλ‘ μ΄ν΄νλ©΄ λλ€.
β
DECLARE
- νλ‘μμ λ΄λΆμμ μ¬μ©νλ μ§μ λ³μλ₯Ό μ μΈν λ μ¬μ©νλ€.
β
SET
- λ³μμ κ°μ μ€μ ν λ μ¬μ©νλ€.
β
IF 쑰건μ THEN μ€νλ¬Έ END IF

DELIMITER $$
CREATE PROCEDURE GetCustomerLevel(
IN p_customerNumber int(11),
OUT p_customerLevel varchar(10))
BEGIN
DECLARE creditlim double;
SELECT creditlimit INTO creditlim -- selectν κ²°κ³Ό creditlimit νλ κ°μ μμμ μ μΈν μ§μλ³μ creditlimμ λ£λλ€
FROM customers
WHERE customerNumber = p_customerNumber;
IF creditlim > 50000 THEN
SET p_customerLevel = 'PLATINUM';
ELSEIF (creditlim <= 50000 AND creditlim >= 10000) THEN
SET p_customerLevel = 'GOLD';
ELSEIF creditlim < 10000 THEN
SET p_customerLevel = 'SILVER';
END IF;
END$$
DELIMITER ;
β
while문
DELIMITER $$
create procedure myProc()
BEGIN
declare i int;
declare hap int;
set i = 1;
set hap = 0;
myWhile: while (i<1000) do
if (i % 3 = 0) then
set i = i + 1;
iterate myWhile; -- iterate == continue κ°μ κ°λ
end if;
set i = i + 1;
set hap = hap + i;
if (hap==900) then
leave myWhile; -- leave == break κ°μ κ°λ
end while;
select hap;
END $$
DELIMITER ;
μ€ν μ΄λ ν¨μ
MySQLμ΄ μ¬μ©μκ° μνλ ν¨μλ₯Ό μ λΆ μ 곡νμ§ μμΌλ―λ‘, νμμ λ°λΌ μ§μ λ§λ€μ΄μ μ¬μ©νλ ν¨μλ₯Ό μ€ν μ΄λ ν¨μλΌ νλ€.
νλ‘μμ μ λΉμ·νκ² λ³΄μ΄μ§λ§ μ¬μ©μ²κ° νμ°ν λ€λ₯΄λ€.
μ€ν μ΄λ ν¨μ vs μ€ν μ΄λ νλ‘μμ μ°¨μ΄μ
- νλ‘μμ μ νλΌλ―Έν° IN, OUTμ μ¬μ©ν μ μλ€.
- μ€ν μ΄λ ν¨μ νλΌλ―Έν°λ λͺ¨λ μ λ ₯ νλΌλ―Έν°λ‘ μ¬μ©λλ€.
- μ€ν μ΄λ ν¨μλ returnλ¬ΈμΌλ‘ λ°ν ν κ°μ λ°μ΄ν° νμ
μ μ§μ νκ³ , λ³Έλ¬Έ μμμ returnλ¬ΈμΌλ‘ νλμ κ°μ λ°νν΄μΌ νλ€.
λ°λ©΄μ μ€ν μ΄λ νλ‘μμ λ λ³λμ λ°ννλ κ΅¬λ¬Έμ΄ μμΌλ©°, μ¬λ¬κ°μ OUTνλΌλ―Έν°λ₯Ό μ¬μ©ν΄μ κ°μ λ°νν μ μλ€. - νλ‘μμ λ callλ‘ νΈμΆλμ§λ§,
μ€ν μ΄λ ν¨μλ selectλ‘ νΈμΆλλ€. - νλ‘μμ μμμλ selectλ¬Έμ μ¬μ©ν μ μμ§λ§,
μ€ν μ΄λ ν¨μ μμμλ μ§ν© κ²°κ³Όλ₯Ό λ°ννλ selectλ¬Έμ μ¬μ© ν μ μλ€.
βμ€ν μ΄λ νλ‘μμ λ μ¬λ¬ 쿼리문λ€μ λ¬Άκ³ κ³ κΈμΈμ΄ μ²λΌ λΆκΈ°μ²λ¦¬λ₯Ό μν΄ μ¬μ©νλ λ¬Άμμ΄λΌκ³ 보면,
μ€ν μ΄λ ν¨μλ κ°λ¨νκ³ μ§§μ κ°μ μ»κΈ°μν΄ μ¬μ©νλ λ¬Άμμ΄λΌκ³ 보면 λλ€.
μ€ν μ΄λ ν¨μ μ¬μ©λ²
μ€ν μ΄λ ν¨μ μμ±
DROP FUNCTION IF EXISTS getAge;
DELIMITER $$
CREATE FUNCTION getAgeFunc(birthYear INT) -- μ
λ ₯ νλΌλ―Έν° μ§μ
RETURNS INT -- λ°ν νμ
μ§μ
BEGIN
DECLARE age INT
SET age = YEAR(CURDATE()) - bYear;
RETURN age; -- κ° λ°ν
END $$
DELIMITER ;
μ€ν μ΄λ ν¨μ μ€ν
SELECT getAgeFunc(1979);
β
SELECT userName, getAgeFunc(birthYear) AS 'λμ΄' FROM userTable
β
μ€ν μ΄λ ν¨μ μ‘°ν / μμ
SHOW CREATE FUNCTION μ€ν μ΄λ ν¨μλͺ
;
β
DROP FUNCTION μ€ν μ΄λ ν¨μλͺ
;
μΈμ©ν λΆλΆμ μμ΄ λ§μΌ λλ½λ μΆμ²κ° μλ€λ©΄ λ°λμ μλ €μ£Όμλ©΄ κ°μ¬νκ² μ΅λλ€
μ΄ κΈμ΄ μ’μΌμ ¨λ€λ©΄ ꡬλ & μ’μμ
μ¬λ¬λΆμ ꡬλ
κ³Ό μ’μμλ
μ μμκ² ν° νμ΄ λ©λλ€.