ํจ์(Function)
ํน์ ์์
์ ์ํํ๊ธฐ ์ํด ์ฌ์ฉ๋๋ ์ฝ๋์ ๋ธ๋ก
ํจ์ ์์ฑ
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
๋ณต์ฌ


