Search
Duplicate

ํ•จ์ˆ˜

ํ•จ์ˆ˜(Function)

ํŠน์ • ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ๋˜๋Š” ์ฝ”๋“œ์˜ ๋ธ”๋ก
PL/SQL ์—์„œ์˜ ํ•จ์ˆ˜๋Š” ๋ฐ˜๋“œ์‹œ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

ํ•จ์ˆ˜ ์ƒ์„ฑ

CREATE OR REPLACE FUNCTION ํ•จ์ˆ˜๋ช… ( ํŒŒ๋ผ๋ฏธํ„ฐ1 [IN] ๋ฐ์ดํ„ฐํƒ€์ž…, ํŒŒ๋ผ๋ฏธํ„ฐ2 [IN] ๋ฐ์ดํ„ฐํƒ€์ž…, ... ) RETURN ๋ฐ˜ํ™˜ํƒ€์ž… IS | AS ์„ ์–ธ๋ถ€; BEGIN ์‹คํ–‰๋ถ€; RETURN (๋ฐ˜ํ™˜ ๊ฐ’); EXCEPTION ์˜ˆ์™ธ ์ฒ˜๋ฆฌ๋ถ€; END [ํ•จ์ˆ˜๋ช…];
SQL
๋ณต์‚ฌ

๋ฌธ๋ฒ• ๊ตฌ์„ฑ ์š”์†Œ ์„ค๋ช…

โ€ข
CREATE OR REPLACE FUNCTION ํ•จ์ˆ˜๋ช…
โ—ฆ
ํ•จ์ˆ˜๋ฅผ ์ƒ์„ฑํ•˜๊ฑฐ๋‚˜, ์ด๋ฏธ ์กด์žฌํ•˜๋Š” ๊ฒฝ์šฐ ๋ฎ์–ด์”๋‹ˆ๋‹ค
โ—ฆ
OR REPLACE๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๊ธฐ์กด ํ•จ์ˆ˜๋ฅผ ์‚ญ์ œํ•˜์ง€ ์•Š๊ณ  ์ˆ˜์ • ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค
โ€ข
ํŒŒ๋ผ๋ฏธํ„ฐ [IN] ๋ฐ์ดํ„ฐํƒ€์ž…
โ—ฆ
ํ•จ์ˆ˜์— ์ „๋‹ฌ๋˜๋Š” ์ž…๋ ฅ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค
โ—ฆ
IN์€ ์ž…๋ ฅ ๋ชจ๋“œ๋ฅผ ๋‚˜ํƒ€๋‚ด๋ฉฐ, ์ƒ๋žต ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค (๊ธฐ๋ณธ๊ฐ’)
โ—ฆ
๋ฐ์ดํ„ฐํƒ€์ž…์€ VARCHAR2, NUMBER, DATE ๋“ฑ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค
โ€ข
RETURN ๋ฐ˜ํ™˜ํƒ€์ž…
โ—ฆ
ํ•จ์ˆ˜๊ฐ€ ๋ฐ˜ํ™˜ํ•  ๊ฐ’์˜ ๋ฐ์ดํ„ฐํƒ€์ž…์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค
โ—ฆ
ํ”„๋กœ์‹œ์ €์™€์˜ ๊ฐ€์žฅ ํฐ ์ฐจ์ด์ ์œผ๋กœ, ํ•จ์ˆ˜๋Š” ๋ฐ˜๋“œ์‹œ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค
โ€ข
IS | AS
โ—ฆ
์„ ์–ธ๋ถ€๋ฅผ ์‹œ์ž‘ํ•˜๋Š” ํ‚ค์›Œ๋“œ์ž…๋‹ˆ๋‹ค
โ—ฆ
IS์™€ AS๋Š” ๋™์ผํ•œ ์˜๋ฏธ๋กœ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค
โ€ข
์„ ์–ธ๋ถ€
โ—ฆ
ํ•จ์ˆ˜ ๋‚ด๋ถ€์—์„œ ์‚ฌ์šฉํ•  ๋ณ€์ˆ˜, ์ƒ์ˆ˜, ์ปค์„œ ๋“ฑ์„ ์„ ์–ธํ•ฉ๋‹ˆ๋‹ค
โ—ฆ
์„ ์–ธํ•  ๊ฒƒ์ด ์—†๋‹ค๋ฉด ์ƒ๋žต ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค
โ€ข
BEGIN ~ END
โ—ฆ
์‹ค์ œ ํ•จ์ˆ˜์˜ ๋กœ์ง์ด ์‹คํ–‰๋˜๋Š” ๋ถ€๋ถ„์ž…๋‹ˆ๋‹ค
โ—ฆ
SQL ๋ฌธ, ์ œ์–ด๋ฌธ, ์กฐ๊ฑด๋ฌธ ๋“ฑ์„ ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค
โ€ข
RETURN (๋ฐ˜ํ™˜ ๊ฐ’)
โ—ฆ
ํ•จ์ˆ˜์˜ ๊ฒฐ๊ณผ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค
โ—ฆ
RETURN๋ฌธ์€ ํ•„์ˆ˜์ด๋ฉฐ, ๋ฐ˜ํ™˜ํƒ€์ž…๊ณผ ์ผ์น˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค
โ—ฆ
ํ•จ์ˆ˜ ์‹คํ–‰์„ ์ข…๋ฃŒํ•˜๊ณ  ํ˜ธ์ถœํ•œ ๊ณณ์œผ๋กœ ๊ฐ’์„ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค
โ€ข
EXCEPTION
โ—ฆ
์‹คํ–‰ ์ค‘ ๋ฐœ์ƒํ•˜๋Š” ์˜ˆ์™ธ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ถ€๋ถ„์ž…๋‹ˆ๋‹ค
โ—ฆ
์„ ํƒ ์‚ฌํ•ญ์ด๋ฉฐ, ํ•„์š”ํ•œ ๊ฒฝ์šฐ์—๋งŒ ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค

์—ฐ๋ด‰ ์กฐํšŒ ํ•จ์ˆ˜ ์˜ˆ์ œ

CREATE OR REPLACE FUNCTION get_annual_salary ( p_emp_id IN NUMBER -- ์ž…๋ ฅ ํŒŒ๋ผ๋ฏธํ„ฐ ) RETURN NUMBER -- ๋ฐ˜ํ™˜ ํƒ€์ž… IS v_salary NUMBER; v_bonus NUMBER; v_annual NUMBER; BEGIN SELECT salary, NVL(bonus, 0) INTO v_salary, v_bonus FROM employees WHERE emp_id = p_emp_id; v_annual := v_salary * 12 * (1 + v_bonus); RETURN v_annual; -- ๊ฐ’ ๋ฐ˜ํ™˜ EXCEPTION WHEN NO_DATA_FOUND THEN RETURN 0; END get_annual_salary; /
SQL
๋ณต์‚ฌ

ํ•จ์ˆ˜ ์‹คํ–‰

ํ•จ์ˆ˜๋Š” ๋‹ค์–‘ํ•œ ๋ฐฉ๋ฒ•์œผ๋กœ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ฃผ๋กœ PL/SQL ๋ธ”๋ก๊ณผ SELECT ๋ฌธ์—์„œ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

PL/SQL ๋ธ”๋ก์—์„œ ์‹คํ–‰

โ€ข
PL/SQL์˜ ์„ ์–ธ๋ถ€๋‚˜ ์‹คํ–‰๋ถ€์—์„œ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ๋ฐ˜ํ™˜๊ฐ’์„ ๋ณ€์ˆ˜์— ํ• ๋‹นํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค
โ€ข
ํ•จ์ˆ˜์˜ ๊ฒฐ๊ณผ๋ฅผ ๋‹ค๋ฅธ ๋กœ์ง์—์„œ ํ™œ์šฉํ•˜๊ฑฐ๋‚˜ ์ถ”๊ฐ€ ์ฒ˜๋ฆฌ๊ฐ€ ํ•„์š”ํ•œ ๊ฒฝ์šฐ์— ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค
โ€ข
์˜ˆ์™ธ ์ฒ˜๋ฆฌ์™€ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜์—ฌ ์•ˆ์ •์ ์ธ ํ”„๋กœ๊ทธ๋žจ ์ž‘์„ฑ์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค
DECLARE ๋ณ€์ˆ˜๋ช… ๋ฐ์ดํ„ฐํƒ€์ž…; BEGIN ๋ณ€์ˆ˜๋ช… := ํ•จ์ˆ˜๋ช…(์ธ์ž1, ์ธ์ž2, ...); END; /
SQL
๋ณต์‚ฌ

SELECT ๋ฌธ์—์„œ ์‹คํ–‰

โ€ข
SQL ์ฟผ๋ฆฌ์˜ SELECT ์ ˆ, WHERE ์ ˆ, ORDER BY ์ ˆ ๋“ฑ์—์„œ ํ•จ์ˆ˜๋ฅผ ์ง์ ‘ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค
โ€ข
ํ…Œ์ด๋ธ”์˜ ๊ฐ ํ–‰์— ๋Œ€ํ•ด ํ•จ์ˆ˜๋ฅผ ์ ์šฉํ•˜์—ฌ ๊ฒฐ๊ณผ๋ฅผ ์กฐํšŒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค
โ€ข
๋‚ด์žฅ ํ•จ์ˆ˜์ฒ˜๋Ÿผ ์‚ฌ์šฉ์ž ์ •์˜ ํ•จ์ˆ˜๋„ SQL ๋ฌธ์—์„œ ์ž์œ ๋กญ๊ฒŒ ํ™œ์šฉ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค
โ€ข
๋ณต์žกํ•œ ๊ณ„์‚ฐ์ด๋‚˜ ๋ฐ์ดํ„ฐ ๋ณ€ํ™˜์„ SQL ์ฟผ๋ฆฌ ์•ˆ์—์„œ ๊ฐ„๊ฒฐํ•˜๊ฒŒ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค
SELECT ํ•จ์ˆ˜๋ช…(์ธ์ž1, ์ธ์ž2, ... ) FROM ํ…Œ์ด๋ธ”๋ช…;
SQL
๋ณต์‚ฌ

ํ•จ์ˆ˜ ์‹คํ–‰ ์˜ˆ์‹œ

๋ฐฉ๋ฒ• 1: PL/SQL ๋ธ”๋ก ๋‚ด์—์„œ ์‹คํ–‰
DECLARE v_annual NUMBER; BEGIN v_annual := get_annual_salary(100); DBMS_OUTPUT.PUT_LINE('์—ฐ๋ด‰: ' || v_annual); END; /
SQL
๋ณต์‚ฌ
๋ฐฉ๋ฒ• 2: SELECT ๋ฌธ์—์„œ ์‹คํ–‰
SELECT emp_name, salary, get_annual_salary(emp_id) AS annual_salary FROM employees WHERE dept_code = 'D1';
SQL
๋ณต์‚ฌ

ํ•จ์ˆ˜ ์‚ญ์ œ

DROP FUNCTION ํ•จ์ˆ˜๋ช…;
SQL
๋ณต์‚ฌ
โ€ข
์˜ˆ์‹œ
DROP FUNCTION get_annual_salary;
SQL
๋ณต์‚ฌ