Trouble-Shooting

MySQL ํ•จ์ˆ˜ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ž‘์„ฑํ–ˆ์œผ๋‚˜ ๋ฐ˜ํ™˜๊ฐ’์ด ์ •์ƒ์ ์ด์ง€ ์•Š์€ ๊ฒฝ์šฐ

์ฑ”๐Ÿป 2024. 1. 24. 19:54

์ž‘์„ฑ์ผ์ž: 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์‹œ๊ฐ„ ์‚ฝ์งˆํ•œ ์›์ธ์ด ์ด๊ฑฐ์˜€๋‹ค๋‹ˆ ํ—ˆ๋ฌดํ•˜๊ธด ํ•œ๋ฐ.. ๊ทธ๋ž˜๋„ ๋•๋ถ„์— ํ•จ์ˆ˜ ๋‚ด๋ถ€์—์„œ ์‚ฌ์šฉํ•  ๋ณ€์ˆ˜๋ช… ์ ‘๋‘์‚ฌ ๊ทœ์น™๋„ ์ •ํ•˜๊ฒŒ๋˜์—ˆ๋‹ค!

  1. ๋งค๊ฐœ๋ณ€์ˆ˜ ์ ‘๋‘์‚ฌ: 'P_'
    • ์˜ˆ์‹œ: P_ORD_AMT, p_CPN_ID
  1. ํ•จ์ˆ˜ ๋‚ด๋ถ€ ๋ณ€์ˆ˜ ์ ‘๋‘์‚ฌ: 'V_'
    • ์˜ˆ์‹œ: V_ORGN_PAY_AMT, V_BNEF_TP, V_CPN_BNEF
  1. ํ•จ์ˆ˜ ๋‚ด๋ถ€ ์ƒ์ˆ˜ ์ ‘๋‘์‚ฌ: 'C_'
    • ์˜ˆ์‹œ: C_DISCOUNT_RATE, C_MAX_AMOUNT

Uploaded by N2T