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