Search

ํ•จ์ˆ˜

ํ•จ์ˆ˜(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
๋ณต์‚ฌ