Search

ํ”„๋กœ์‹œ์ €

ํ”„๋กœ์‹œ์ € (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
๋ณต์‚ฌ