ํจ์(Function)
ํน์ ๋์์ ์ํํ๊ณ ๊ฒฐ๊ณผ๊ฐ์ ๋ฐํํ๋ ์๋ธ ํ๋ก๊ทธ๋จ
MySQL์์ ํจ์๋ ํ๋์ ๊ฐ์ ํ์์ ์ผ๋ก ๋ฐํํด์ผ ํฉ๋๋ค.
ํจ์์ ํน์ง
โข
ํ๋์ ๊ฐ์ ๋ฐ๋์ ๋ฐํํด์ผ ํจ (RETURN ๋ฌธ ํ์)
โข
ํ๋ก์์ ์ ๋ฌ๋ฆฌ SELECT ๋ฌธ์์ ์ฌ์ฉ ๊ฐ๋ฅ
โข
ํธ๋ฆฌ๊ฑฐ๋ ์ด๋ฒคํธ์์๋ ํธ์ถ ๊ฐ๋ฅ
โข
IN ํ๋ผ๋ฏธํฐ๋ง ์ฌ์ฉ ๊ฐ๋ฅ (OUT, INOUT ์ฌ์ฉ ๋ถ๊ฐ)
โข
ํธ๋์ญ์
์ฒ๋ฆฌ๋ ์์ธ ์ฒ๋ฆฌ ๊ตฌ๋ฌธ ์ฌ์ฉ ๋ถ๊ฐ
์ฝ๋
1. ํจ์ ์์ฑ
DELIMITER //
CREATE FUNCTION ํจ์๋ช
(ํ๋ผ๋ฏธํฐ1 ๋ฐ์ดํฐํ์
, ํ๋ผ๋ฏธํฐ2 ๋ฐ์ดํฐํ์
, ...)
RETURNS ๋ฐํ๋ฐ์ดํฐํ์
[ํน์ฑ]
BEGIN
ํจ์ ๋ณธ๋ฌธ
RETURN ๋ฐํ๊ฐ;
END //
DELIMITER ;
SQL
๋ณต์ฌ
2. ํจ์ ์์
ALTER FUNCTION ํจ์๋ช
ํน์ฑ;
SQL
๋ณต์ฌ
3. ํจ์ ์ญ์
DROP FUNCTION [IF EXISTS] ํจ์๋ช
;
SQL
๋ณต์ฌ
ํจ์ ์ ์ ์ต์
ํน์ฑ | ์ค๋ช
|
DETERMINISTIC | ๋์ผํ ์
๋ ฅ์ ๋ํด ํญ์ ๋์ผํ ์ถ๋ ฅ ๋ฐํ |
NOT DETERMINISTIC | ๋์ผํ ์
๋ ฅ์๋ ๋ค๋ฅธ ๊ฒฐ๊ณผ ๋ฐํ ๊ฐ๋ฅ |
CONTAINS SQL | SQL ๋ฌธ์ฅ ํฌํจ |
NO SQL | SQL ๋ฌธ์ฅ ๋ฏธํฌํจ |
READS SQL DATA | ๋ฐ์ดํฐ๋ฅผ ์ฝ๊ธฐ๋ง ํจ |
MODIFIES SQL DATA | ๋ฐ์ดํฐ ์์ ๊ฐ๋ฅ |
ํจ์ ์์ (employees ์คํค๋ง)
๋ค์์ employees ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ์ฌ์ฉํ ํจ์ ์์์
๋๋ค.
1. ์ฌ์์ ์๊ธ ๊ณ์ฐ ํจ์
DELIMITER //
CREATE FUNCTION calculate_annual_salary(emp_no INT)
RETURNS DECIMAL(10,2)
DETERMINISTIC
READS SQL DATA
BEGIN
DECLARE annual_salary DECIMAL(10,2);
SELECT salary / 12
INTO annual_salary
FROM salaries
WHERE employee_id = emp_no
AND to_date = '9999-01-01';
RETURN annual_salary;
END //
DELIMITER ;
SQL
๋ณต์ฌ
2. ์ฌ์์ ๊ทผ๋ฌด ๊ธฐ๊ฐ(๋ ) ๊ณ์ฐ ํจ์
DELIMITER //
CREATE FUNCTION calculate_years_of_service(p_emp_no INT)
RETURNS INT
DETERMINISTIC
READS SQL DATA
BEGIN
DECLARE years INT;
SELECT TIMESTAMPDIFF(YEAR, hire_date, CURDATE())
INTO years
FROM employees
WHERE emp_no = p_emp_no;
RETURN years;
END //
DELIMITER ;
SQL
๋ณต์ฌ
3. ๋ถ์ ์ด๋ฆ ์กฐํ ํจ์
DELIMITER //
CREATE FUNCTION get_department_name(p_dept_no CHAR(4))
RETURNS VARCHAR(40)
DETERMINISTIC
READS SQL DATA
BEGIN
DECLARE v_dept_name VARCHAR(40);
SELECT dept_name
INTO v_dept_name
FROM departments
WHERE dept_no = p_dept_no;
RETURN v_dept_name;
END //
DELIMITER ;
SQL
๋ณต์ฌ
ํจ์ ์ฌ์ฉ ์์:
-- ์ฌ์์ ์ฐ๋ด ์กฐํ
SELECT first_name, last_name, calculate_annual_salary(employee_id)
FROM employees
WHERE employee_id = 10001;
-- ์ฌ์์ ๊ทผ๋ฌด ๊ธฐ๊ฐ ์กฐํ
SELECT first_name, last_name, calculate_years_of_service(employee_id)
FROM employees
WHERE employee_id = 10001;
-- ๋ถ์ ์ด๋ฆ ์กฐํ
SELECT dept_no, get_department_name(dept_no)
FROM dept_manager
WHERE to_date = '9999-01-01';
SQL
๋ณต์ฌ