์์ฑ์ผ์: 2023๋ 7์ 12์ผ
โ๊ฒฐ๋ก
ํจ์ ๋ด๋ถ์์ ์ ์ํ ๋ณ์์ SELECT ... INTO
๊ตฌ๋ฌธ์ผ๋ก ๊ฐ์ ๋ฃ์ด์ค ๋ ์ปฌ๋ผ๋ช
๊ณผ ๋ณ์๋ช
์ด ๋์ผํ์ง ํ์ธํด๋ณด์. ์ด ๊ฒฝ์ฐ์ ๊ฐ์ ์ ๋๋ก ๋ฃ์ด์ฃผ์ง ๋ชปํจ. ๋์ด ์ถฉ๋๋์ง ์๊ฒ ๋ณ์์ ์ด๋ฆ์ ์ปฌ๋ผ ์ด๋ฆ๊ณผ ๋ค๋ฅด๊ฒ ์ง์ ํด์ฃผ๋ฉด ๋๋ค.
SELECT BNEF_TP, CPN_BNEF
INTO BNEF_TP, CPN_BNEF
FROM COUPON
WHERE CPN_ID = v_CPN_ID;
SELECT BNEF_TP, CPN_BNEF
INTO V_BNEF_TP, V_CPN_BNEF
FROM COUPON
WHERE CPN_ID = P_CPN_ID;
๐๋ฌธ์ ์ ์
GET_ORGN_PAY_AMT
๋ ์ฟ ํฐ์์ด๋๋ฅผ ์ฃผ๋ฉด ์ฃผ์ด์ง ๊ธ์ก(V_ORD_AMT)์ ๋ํด์ ์ฟ ํฐํ ์ธ์ ์ ์ฉํ ๊ธ์ก์ ๋ฐํํด์ฃผ๋ ํจ์๋ค.
์ฟ ํฐ ์์ด๋ 2๋ฒ์ ์ฃผ์ด์ 5%ํ ์ธ์ด ์ ์ฉ๋์ด 428640
์์ด ๋ฐํ๋์ด์ผ ์ ์์ด๋ ๋ด๊ฐ ์
๋ ฅํ 451200
์์ด ๊ทธ๋๋ก ๋์ด

ํจ์ ์ฝ๋ ์์ฒด๋ ์๋ชป๋ ๋ถ๋ถ์ด ์์
GET_ORGN_PAY_AMT(ํจ์)
CREATE
DEFINER = syur1@`%` FUNCTION GET_ORGN_PAY_AMT(v_ORD_AMT double, v_CPN_ID int) RETURNS double DETERMINISTIC
BEGIN
DECLARE ORGN_PAY_AMT DOUBLE; -- ์๊ฒฐ์ ๊ธ์ก
DECLARE BNEF_TP CHAR(2); -- ํํํ์
(์ฟ ํฐํ ์ธ์จ/๊ธ์ก)
DECLARE CPN_BNEF DOUBLE; -- ์ฟ ํฐํํ
-- 1. ์ฟ ํฐ์์ด๋๋ก ํํํ์
๊ณผ ์ฟ ํฐํํ์ ์กฐํํด์จ๋ค.
SELECT BNEF_TP, CPN_BNEF
INTO BNEF_TP, CPN_BNEF
FROM COUPON
WHERE CPN_ID = v_CPN_ID;
-- 2. ์ฃผ๋ฌธ๊ธ์ก์์ ์ฟ ํฐ์ ์ ์ฉํ ๊ธ์ก์ ๊ณ์ฐํ๋ค.
IF BNEF_TP = '01' THEN -- ํ ์ธ์จ์ธ ๊ฒฝ์ฐ
SET ORGN_PAY_AMT = v_ORD_AMT - (v_ORD_AMT * (CPN_BNEF / 100));
ELSEIF BNEF_TP = '02' THEN -- ํ ์ธ ๊ธ์ก์ธ ๊ฒฝ์ฐ
SET ORGN_PAY_AMT = v_ORD_AMT - CPN_BNEF;
ELSE
SET ORGN_PAY_AMT = v_ORD_AMT;
END IF;
RETURN TRUNCATE(ORGN_PAY_AMT, 0);
END;
โ์์ธ & ํด๊ฒฐ๋ฐฉ๋ฒ
ํจ์ ์ฝ๋ ์์ฒด์๋ ๋ฌธ์ ๊ฐ ์์ด์ ํจ์๋ด์์ ์ฌ์ฉํ๋ ๊ฐ๋ค์ ๋ฐํํด๋ณด๋ฉด์ ๋๋ฒ๊น ์ ํด๋ณด๊ณ ์์๋๋ฐ BNEF_TP๋ฅผ ๋ฐํํ์ ๋ NULL๋ก ๋ฐํ์ด ๋์ด์ ํน์๋ํ๊ณ ํ ์ด๋ธ์ ์ปฌ๋ผ๋ช ๊ณผ ๊ฒน์น์น์๊ฒ ๋ณ์๋ช ์ ๋ฐ๊ฟ๋ณด๋ ์ ๋๋ก ๋์ํ๋ค.
ํจ์ ๋ด๋ถ์์ ์ ์ํ ๋ณ์์ SELECT ... INTO
๊ตฌ๋ฌธ์ผ๋ก ๊ฐ์ ๋ฃ์ด์ค ๋ ์ปฌ๋ผ๋ช
๊ณผ ๋ณ์๋ช
์ด ๋์ผํ ๊ฒฝ์ฐ ๊ฐ์ ์ ๋๋ก ๋ฃ์ด์ฃผ์ง ๋ชปํจ. ๋์ด ์ถฉ๋๋์ง ์๊ฒ ๋ณ์์ ์ด๋ฆ์ ์ปฌ๋ผ ์ด๋ฆ๊ณผ ๋ค๋ฅด๊ฒ ์ง์ ํด์ฃผ๋ฉด ๋๋ค.
SELECT BNEF_TP, CPN_BNEF
INTO BNEF_TP, CPN_BNEF
FROM COUPON
WHERE CPN_ID = v_CPN_ID;
SELECT BNEF_TP, CPN_BNEF
INTO V_BNEF_TP, V_CPN_BNEF
FROM COUPON
WHERE CPN_ID = P_CPN_ID;
CREATE
DEFINER = syur1@`%` FUNCTION GET_ORGN_PAY_AMT(P_ORD_AMT double, P_CPN_ID int) RETURNS double DETERMINISTIC
BEGIN
DECLARE V_ORGN_PAY_AMT DOUBLE; -- ์๊ฒฐ์ ๊ธ์ก
DECLARE V_BNEF_TP char(2); -- ํํํ์
(์ฟ ํฐํ ์ธ์จ/๊ธ์ก)
DECLARE V_CPN_BNEF int; -- ์ฟ ํฐํํ
-- 1. ์ฟ ํฐ์์ด๋๋ก ํํํ์
๊ณผ ์ฟ ํฐํํ์ ์กฐํํด์จ๋ค.
SELECT BNEF_TP, CPN_BNEF
INTO V_BNEF_TP, V_CPN_BNEF
FROM COUPON
WHERE CPN_ID = P_CPN_ID;
-- 2. ์ฃผ๋ฌธ๊ธ์ก์์ ์ฟ ํฐ์ ์ ์ฉํ ๊ธ์ก์ ๊ณ์ฐํ๋ค.
IF V_BNEF_TP = '01' THEN -- ํ ์ธ์จ์ธ ๊ฒฝ์ฐ
SET V_ORGN_PAY_AMT = P_ORD_AMT - (P_ORD_AMT * (V_CPN_BNEF / 100));
ELSEIF V_BNEF_TP = '02' THEN -- ํ ์ธ ๊ธ์ก์ธ ๊ฒฝ์ฐ
SET V_ORGN_PAY_AMT = P_ORD_AMT - V_CPN_BNEF;
ELSE
SET V_ORGN_PAY_AMT = P_ORD_AMT;
END IF;
RETURN TRUNCATE(V_ORGN_PAY_AMT, 0);
END;
2์๊ฐ ์ฝ์งํ ์์ธ์ด ์ด๊ฑฐ์๋ค๋ ํ๋ฌดํ๊ธด ํ๋ฐ.. ๊ทธ๋๋ ๋๋ถ์ ํจ์ ๋ด๋ถ์์ ์ฌ์ฉํ ๋ณ์๋ช ์ ๋์ฌ ๊ท์น๋ ์ ํ๊ฒ๋์๋ค!
- ๋งค๊ฐ๋ณ์ ์ ๋์ฌ: 'P_'
- ์์: P_ORD_AMT, p_CPN_ID
- ํจ์ ๋ด๋ถ ๋ณ์ ์ ๋์ฌ: 'V_'
- ์์: V_ORGN_PAY_AMT, V_BNEF_TP, V_CPN_BNEF
- ํจ์ ๋ด๋ถ ์์ ์ ๋์ฌ: 'C_'
- ์์: C_DISCOUNT_RATE, C_MAX_AMOUNT
Uploaded by N2T