ํ๋ก์์ (Stored Procedure)
์ ์
SQL๋ฌธ๋ค์ ํ๋์ ๋จ์๋ก ๋ฌถ์ด ์ ์ฅํด๋๊ณ ํ์ํ ๋๋ง๋ค ํธ์ถํ์ฌ ์คํํ ์ ์๋ ์ ์ฅ ํ๋ก๊ทธ๋จ
ํ๋ก์์ (Stored Procedure)๋ MySQL์์ ์ ๊ณตํ๋ ํ๋ก๊ทธ๋๋ฐ ๊ธฐ๋ฅ์
๋๋ค.
ํน์ง
โข
์ฌ๋ฌ SQL๋ฌธ์ ํ๋์ ํ๋ก๊ทธ๋จ์ผ๋ก ๋ฌถ์ด์ ์คํ ๊ฐ๋ฅ
โข
๋ฐ๋ณต์ ์ธ ์์
์ ํจ์จ์ ์ผ๋ก ์ฒ๋ฆฌ
โข
๋คํธ์ํฌ ํธ๋ํฝ ๊ฐ์ ํจ๊ณผ
โข
๋ณด์์ฑ ํฅ์ (ํ๋ก์์ ๋จ์๋ก ๊ถํ ๋ถ์ฌ ๊ฐ๋ฅ)
โข
๋งค๊ฐ๋ณ์๋ฅผ ํตํ ์ ์ฐํ ํ๋ก๊ทธ๋๋ฐ ๊ฐ๋ฅ
์ฝ๋
1. ํ๋ก์์ ์์ฑ
DELIMITER //
CREATE PROCEDURE procedure_name(parameter1 datatype, parameter2 datatype...)
BEGIN
-- SQL ๋ฌธ์ฅ๋ค
END //
DELIMITER ;
SQL
๋ณต์ฌ
2. ํ๋ก์์ ์์
ALTER PROCEDURE procedure_name
[characteristics...]
SQL
๋ณต์ฌ
3. ํ๋ก์์ ์ญ์
DROP PROCEDURE [IF EXISTS] procedure_name;
SQL
๋ณต์ฌ
ํ๋ก์์ ์คํ
CALL procedure_name(parameter1, parameter2...);
SQL
๋ณต์ฌ
์ฃผ์์ฌํญ
โข
ํ๋ก์์ ์์ฑ ์ DELIMITER๋ฅผ ๋ณ๊ฒฝํ์ฌ ์ฌ์ฉ
โข
ํ๋ก์์ ๋ด๋ถ์ ๊ฐ ๋ฌธ์ฅ์ ์ธ๋ฏธ์ฝ๋ก (;)์ผ๋ก ๊ตฌ๋ถ
โข
ํ๋ก์์ ์ด๋ฆ์ ์ค๋ณต๋ ์ ์์
โข
๋ฐ์ดํฐ๋ฒ ์ด์ค ๋ด์์ ์ ์ผํ ์ด๋ฆ์ ์ฌ์ฉํด์ผ ํจ
ํ๋ก์์ ์์ฑ ๊ตฌ๋ฌธ ์ค๋ช
-- ๋ช
๋ น์ด ๊ตฌ๋ถ์๋ฅผ ์์๋ก '//'๋ก ๋ณ๊ฒฝ (๊ธฐ๋ณธ ๊ตฌ๋ถ์์ธ ์ธ๋ฏธ์ฝ๋ก (;) ๋์ )
DELIMITER //
-- ์ ์ฅ ํ๋ก์์ ์ ์ ์์
CREATE PROCEDURE procedure_name(parameter1 datatype, parameter2 datatype...)
BEGIN
-- ํ๋ก์์ ๋ด๋ถ์์ ์คํํ SQL ๋ฌธ์ฅ๋ค์ ์์ฑ
-- ์: INSERT, UPDATE, SELECT ๋ฑ
END // -- ํ๋ก์์ ์ ์ ์ข
๋ฃ (์์์ ์ง์ ํ '//'๋ก ์ข
๋ฃ ๊ตฌ๋ถ)
-- ๋ค์ ๊ธฐ๋ณธ ๊ตฌ๋ถ์์ธ ์ธ๋ฏธ์ฝ๋ก (;)์ผ๋ก ๋ณต์
DELIMITER ;
SQL
๋ณต์ฌ
์ค๋ช
๊ตฌ๋ฌธ | ์๋ฏธ |
DELIMITER // | ์ธ๋ฏธ์ฝ๋ก (;)์ด ์๋ //๋ฅผ ๋ช
๋ น์ด ์ข
๋ฃ ๊ตฌ๋ถ์๋ก temporarily ๋ณ๊ฒฝ |
CREATE PROCEDURE ... | ์๋ก์ด ์ ์ฅ ํ๋ก์์ ์์ฑ |
BEGIN ... END | ํ๋ก์์ ๋ณธ๋ฌธ(์ฌ๋ฌ SQL ๋ฌธ์ฅ ํฌํจ) |
END // | //๋ฅผ ์ฌ์ฉํด ํ๋ก์์ ์ ์ ์ข
๋ฃ |
DELIMITER ; | ๋ค์ ๊ธฐ๋ณธ ๊ตฌ๋ถ์์ธ ์ธ๋ฏธ์ฝ๋ก ์ผ๋ก ๋ณต์ |
๋งค๊ฐ๋ณ์ ๋ชจ๋
๋ชจ๋ | ์ค๋ช
| ์ฌ์ฉ ์์ |
IN | ์
๋ ฅ ์ ์ฉ ๋งค๊ฐ๋ณ์. ํธ์ถ ์ ๊ฐ์ ์ ๋ฌ๋ฐ์ง๋ง,
๋ด๋ถ์์ ๋ณ๊ฒฝํด๋ ํธ์ถ์์๊ฒ ๋ฐ์๋์ง ์์. | IN p_emp_no INT |
OUT | ์ถ๋ ฅ ์ ์ฉ ๋งค๊ฐ๋ณ์. ํ๋ก์์ ๋ด๋ถ์์ ๊ฐ์ ์ค์ ํด ํธ์ถ์์๊ฒ ๋ฐํ. ํธ์ถ์๊ฐ ์ ๋ฌํ๋ ๊ฐ์ ๋ฌด์๋จ. | OUT p_result VARCHAR(20) |
INOUT | ์
์ถ๋ ฅ ๊ฒธ์ฉ ๋งค๊ฐ๋ณ์. ํธ์ถ ์ ๊ฐ์ ์ ๋ฌ๋ฐ๊ณ , ๋ณ๊ฒฝ๋ ๊ฐ์ ๋ค์ ํธ์ถ์์๊ฒ ๋ฐํํจ. | INOUT p_value INT |
ํ๋ก์์ ์์ (MySQL employees ์คํค๋ง)
employees ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ์ฌ์ฉํ ํ๋ก์์ ์์์
๋๋ค.
1. ๋ถ์๋ณ ํ๊ท ๊ธ์ฌ ์กฐํ ํ๋ก์์
DELIMITER //
CREATE PROCEDURE get_dept_avg_salary()
BEGIN
SELECT
d.dept_name,
AVG(s.salary) as avg_salary
FROM departments d
JOIN dept_emp de ON d.dept_no = de.dept_no
JOIN salaries s ON de.emp_no = s.emp_no
WHERE s.to_date = '9999-01-01'
GROUP BY d.dept_name;
END //
DELIMITER ;
SQL
๋ณต์ฌ
2. ํน์ ์ง์์ ๊ธ์ฌ ์ด๋ ฅ ์กฐํ ํ๋ก์์
DELIMITER //
CREATE PROCEDURE get_employee_salary_history(IN p_emp_no INT)
BEGIN
SELECT
e.first_name,
e.last_name,
s.salary,
s.from_date,
s.to_date
FROM employees e
JOIN salaries s ON e.emp_no = s.emp_no
WHERE e.emp_no = p_emp_no
ORDER BY s.from_date;
END //
DELIMITER ;
SQL
๋ณต์ฌ
3. ์๋ก์ด ์ง์ ์ถ๊ฐ ํ๋ก์์
DELIMITER //
CREATE PROCEDURE insert_new_employee(
IN p_first_name VARCHAR(14),
IN p_last_name VARCHAR(16),
IN p_birth_date DATE,
IN p_gender ENUM('M','F'),
IN p_dept_no CHAR(4),
IN p_salary INT
)
BEGIN
DECLARE v_emp_no INT;
-- Get the next employee number
SELECT MAX(emp_no) + 1 INTO v_emp_no FROM employees;
START TRANSACTION;
-- Insert into employees
INSERT INTO employees VALUES
(v_emp_no, p_birth_date, p_first_name, p_last_name, p_gender, CURDATE());
-- Insert into dept_emp
INSERT INTO dept_emp VALUES
(v_emp_no, p_dept_no, CURDATE(), '9999-01-01');
-- Insert initial salary
INSERT INTO salaries VALUES
(v_emp_no, p_salary, CURDATE(), '9999-01-01');
COMMIT;
END //
DELIMITER ;
SQL
๋ณต์ฌ
๊ฐ ํ๋ก์์ ์คํ ์์:
-- ๋ถ์๋ณ ํ๊ท ๊ธ์ฌ ์กฐํ
CALL get_dept_avg_salary();
-- ์ง์ ๋ฒํธ 10001์ ๊ธ์ฌ ์ด๋ ฅ ์กฐํ
CALL get_employee_salary_history(10001);
-- ์๋ก์ด ์ง์ ์ถ๊ฐ
CALL insert_new_employee('John', 'Doe', '1990-01-01', 'M', 'd005', 50000);
SQL
๋ณต์ฌ