์ฌ์ฉ์ ์ ์ํจ์(User-Defined Funtion)
์ฌ์ฉ์ ์ ์ํจ์๋ ์ ์ฐจํ SQL์ ์ด์ฉํ์ฌ ์ฌ์ฉ์๊ฐ ์ง์ ์ ์ํ๊ณ ์์ฑํ ๊ธฐ๋ฅ์ ์ํํฉ๋๋ค. ์ํ์ด ์ข ๋ฃ๋๋ฉด ๋จ์ผ ๊ฒฐ๊ณผ ๊ฐ์ ๋ฐํํฉ๋๋ค.
์ด์ ์ฌ์ฉ์ ์ ์ํจ์์ ๊ตฌ์กฐ์ ๋ํด์ ์ด์ผ๊ธฐํ๊ฒ ์ต๋๋ค.
์ฒซ๋ฒ์งธ๋ก ์ด์ผ๊ธฐํ ๊ตฌ์กฐ๋ ์ ์ธ๋ถ(DECLARE)์ ๋๋ค. ์ ์ธ๋ถ์์๋ ์ฌ์ฉ์ ์ ์ํจ์์ ์ด๋ฆ๊ณผ ๋ณ์, ๋ฐ์ดํฐ ํ์ ๋ฑ์ ์ ์ํ๋ ๋ถ๋ถ์ ๋๋ค.
CREATE FUNCTION GET_AGE(V_BIRTH_DATE IN CHAR(8))
IS
๋ค์ ์ฝ๋๋ CREATE FUNTION์ ์ด์ฉํด GET_AGE๋ผ๋ ์ฌ์ฉ์ ํจ์๋ฅผ ์ ์ํฉ๋๋ค. ๊ทธ ํ ์ด์์ฒด์ ์์ ํ๋ผ๋ฏธํฐ๋ฅผ ์ ๋ ฅ๋ฐ๋ ๋ฌธ์์ด V_BIRTH_DATE์ ์ ์ํฉ๋๋ค.
๋ค์์ ์์(BEGIN)๊ณผ ์ข ๋ฃ๋ถ(END)์ ๋๋ค.
์์๋ถ์ ์ข ๋ฃ๋ถ๋ ๋ค์์ ์คํ์ ์ ์ดํ๋ ๊ธฐ๋ณธ ๋จ์๋ก ํ๋ก์์ ์ ์์๊ณผ ์ข ๋ฃ๋ฅผ ํํํ๊ณ ์์ต๋๋ค. ๋ฐ๋์ ์์๋ถ๊ฐ ๋์ค๋ฉด ์ข ๋ฃ๋ถ๋ก ๋ง๋ฌด๋ฆฌ ์ง์ด์ผํฉ๋๋ค.
BEGIN์ ์ ์ธ๋ถ์ ๋ค์ ์ค๋ฉฐ ์ ์ธ๋ถ๋ฅผ ์ ์ธํ ํ๋ก์์ ์ ๋ชจ๋ ๊ตฌ์กฐ๋ค์ BEGIN๊ณผ END์ฌ์ด์ ์ ์๋์ด์ผํฉ๋๋ค.
BEGIN
V_CURRENT_YEAR CHAR(4);
V_BIRTH_YEAR CHAR(4);
V_AGE NUMBER;
-- ์ ์ด๋ถ, SQL, ์์ธ๋ถ, ๋ฐํ๋ถ๊ฐ BEGIN๊ณผ END์ฌ์ด์ ๋ค์ด๊ฐ๋ค.
END;
BEGIN๋ฌธ ๋ค์ ์ฌ์ฉ์ ์ ์ ํจ์์์ ์ฌ์ฉํ V_CURRENT_YEAR, V_BIRTH_YEAR, V_AGE ๋ณ์๋ฅผ ์ ์ธํฉ๋๋ค.
์ธ๋ฒ์งธ๋ก ์ด์ผ๊ธฐ ํ ์ฌ์ฉ์ ์ ์ ํจ์์ ๊ตฌ์กฐ๋ ์ ์ด๋ถ(CONTROL)์ ๋๋ค.
์ฌ์ฉ์ ์ ์ ํจ์์์๋ ์กฐ๊ฑด๋ฌธ์ธ IF๋ฌธ, CASE๋ฌธ์ ์ด์ฉํด ๋ฌธ์ฅ์ ์คํํ๊ฒ ๋ฉ๋๋ค.
๋ค๋ฒ์งธ๋ SQL๋ก ๋ฐ์ดํฐ ์กฐํ ์ฉ๋๋ก๋ง ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์ SELECT๋ง ์ด์ฉํฉ๋๋ค.
SELECT TO_CHAR(SYSDATE, 'YYYY'), SUBSTR(V_BIRTH_DATE,1,4)
INTO V_CURRENT_YEAR, V_BIRTH_YEAR
FROM DUAL;
SET AGE = TO_NUMBER(V_CURRENT_YEAR) - TO_NUMBER(V_BIRTH_YEAR) + 1;
SQL์์๋ SYSDATE๋ก ํ์ฌ ๋ ์ง๋ฅผ ์กฐํ๋ฅผ ํฉ๋๋ค. ์กฐํ๋ ๋ ์ง์ ์ฐ๋ ๊ฐ๋ง ํ์ฑ ํ ๋ณ์ V_CURRENT_YEA์ ์ ๋ ฅํฉ๋๋ค.
๊ทธ ํ V_BIRTH_DATE์์ ์ฐ๋๊ฐ๋ง ์๋ฅธ ๋ค ๋ณ์ V_BIRTH_DATE์ ๋ค์ ์ ๋ ฅํ๋ ๋์์ ์ํํฉ๋๋ค.
๋ง์ง๋ง์ผ๋ก๋ ๋ ๋ณ์์ ์ฐจ์ด๋ฅผ ๊ตฌํด 1์ ๋ํด ๋์ด๋ฅผ ๊ตฌํ ํ AGE์ ์
๋ ฅํ๋ ๋์์ ํ๋ SQL์
๋๋ค.
๋ค์์ผ๋ก ์ค๋ช ํ ์์ธ๋ถ (EXCEPTION)๋ BEGIN~END๋ฌธ ์ฌ์ด์ SQL๋ฌธ์ ์คํ ์ค ์์ธ ๋ฐ์์ ์ฒ๋ฆฌ ๋ฐฉ๋ฒ์ ์ ์ํ๊ณ ์์ต๋๋ค.
๋ง์ง๋ง์ ์ฌ์ฉ์ ์ ์ ํจ์๋ง ๊ฐ์ง๊ณ ์๋ ๊ตฌ์กฐ์ธ ๋ฐํ๋ฌธ(RETURN)์ ๋๋ค. ๋ฐํ๋ฌธ์์๋ ํ๋์ ๊ฐ๋ง ๊ฒฐ๊ณผ๋ก ๋๊ธธ ์ ์์ต๋๋ค.
RETURN AGE;
์ฌ์ฉ์ ์ ์ ํจ์์ ์ต์ข ๊ฒฐ๊ณผ๊ฐ์ผ๋ก AGE๋ผ๋ ๊ฐ์ ๋๊ฒจ์ฃผ๊ณ ํจ์๋ ์ข ๋ฃ๋ฉ๋๋ค.
์ ์๋ ์ฌ์ฉ์ ํจ์๋ฅผ ์ด์ฉํ๊ธฐ ์ํด์๋ ๋ค์ํ ๋ฐฉ๋ฒ์ผ๋ก ํธ์ถ ๊ฐ๋ฅํฉ๋๋ค.
SELECT๋ฌธ์ ์ด์ฉํ ๋ฐฉ๋ฒ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
SELECT GET_AGE("20100525")
FROM DUAL;
SELECT๋ฌธ์์ "20100525"๋ผ๋ ๊ฐ์ V_BIRTH_DATE์ ๋๊ฒจ์ฃผ๊ฒ ๋๋ฉด SELECT์ ๊ฒฐ๊ณผ๋ก AGE๋ผ๋ ์ฌ์ฉ์ ํจ์์ ๊ฒฐ๊ณผ๋ฅผ ๋ฐํ๋ฐ์ต๋๋ค.
๋ค๋ฅธ ๋ฐฉ๋ฒ์ผ๋ก๋ ์ ๋ฐ์ดํธ์์ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ ๋๋ค.
UPDATE EMPLOYEE
SET AGE = GET_AGE(BIRTH_DATE)
WHERE EMPOYEE_ID = '202020';
์ง์ ํ ์ด๋ธ์ ์ ๋ฐ์ดํธํ๊ธฐ ์ํด์ ์ง์๋ฒํธ๊ฐ 202020์ธ ์ง์์ ๋์ด๋ฅผ ์ฌ์ฉ์ ์ ์ํจ์๋ฅผ ํตํด ๋ณ๊ฒฝ๊ฐ๋ฅํฉ๋๋ค.
'๊ณต๋ถ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
์ ๋ณด์ฒ๋ฆฌ๊ธฐ์ฌ PART 8 ์ ๋ฆฌ - ์ง๊ณํจ์ (0) | 2021.05.23 |
---|---|
์ ๋ณด์ฒ๋ฆฌ๊ธฐ์ฌ PART 8 ์ ๋ฆฌ - ํธ๋ฆฌ๊ฑฐ (0) | 2021.05.06 |
์ ๋ณด์ฒ๋ฆฌ๊ธฐ์ฌ PART 8 ์ ๋ฆฌ - ํ๋ก์์ (0) | 2021.05.06 |
์ ๋ณด์ฒ๋ฆฌ๊ธฐ์ฌ PART 7 ์ ๋ฆฌ - ํตํฉ ํ ์คํธ์ ํ ์คํธ ์ปค๋ฒ๋ฆฌ์ง (0) | 2021.04.24 |
์ ๋ณด์ฒ๋ฆฌ๊ธฐ์ฌ PART 7 ์ ๋ฆฌ - ์ํํธ์จ์ด ํ ์คํธ (0) | 2021.04.24 |