함수 질문합니다 왜안될까요...PLS-00103: 심볼 "END"를 만났습니다 다음 중 하나가 기대될 때: case 0 4 4,317

by 치즈와두부 [2016.10.24 16:34:30]


create or replace FUNCTION "FN_TEMP" 

( p_inspno IN VARCHAR2 -- 신청번호
) RETURN VARCHAR2 
is

v_lnkind   VARCHAR2(7);      -- 상품군
v_agentid  VARCHAR2(6) :=''; --  ID
v_saleamt  VARCHAR2(8);      -- ㄷ금액
v_return   VARCHAR2(8);      -- ㅇㅇㅂㄷ비용


--


BEGIN

  BEGIN
    select
      l1.agent_id
      , l1.sale_amt
      , (select ln_kind from cmc004tm where goods_cd = l1.goods_cd)
    into
      v_agentid
      , v_saleamt
      , v_lnkind
    from lnc001tm l1
    where l1.insp_no = p_inspno;
   END;
  
--  
    --ㅈㅈㅇ
    IF  V_lnkind = 'LAA0010' THEN       
      CASE
        WHEN v_saleamt <= 5000000 THEN
          v_return := v_saleamt * 0.05;
        WHEN v_saleamt > 5000000 and v_saleamt <= 10000000 THEN
          v_return := 250000 + (v_saleamt - 5000000)*0.04 ;
        WHEN v_saleamt > 10000000 and v_saleamt <= 20000000 THEN
          v_return := 450000 + (v_saleamt - 10000000)*0.03 ;
      END      
      END IF;
    
    --ㅎ
    IF v_lnkind = 'LAA0020' THEN
      CASE
       WHEN v_agentid = AG0001 THEN  v_return := v_saleamt * 2.75;
       WHEN v_agentid != AG0001 THEN  v_return := v_saleamt * 2.42;
    END
    END IF;
    
    --ㅅ
    IF v_lnkind = 'LAA0040' THEN v_return := v_saleamt * 3.85;
    END
    END IF;
   
--
return v_return;

END FN_TEMP;

 

 

 

 

 

 

 

 

 

 

 

오류메세지로 이게 뜹니다..

PLS-00103: 심볼 "END"를 만났습니다 다음 중 하나가 기대될 때: case

 

 

by jkson [2016.10.24 16:47:32]

function, procedure에서는 case when 이 아니라 if 문 쓰세요. 그리고 전반적으로 예외처리가 전혀 안 되어있네요. 예외처리 구문 추가하시구요.

그리고 계산값인데 RETURN형이 VARCHAR2형인데 맞나요?

CREATE OR REPLACE FUNCTION "FN_TEMP"
( P_INSPNO IN VARCHAR2 -- 신청번호
) 
RETURN VARCHAR2
IS

V_LNKIND   VARCHAR2(7);      -- 상품군
V_AGENTID  VARCHAR2(6) :=''; --  ID
V_SALEAMT  VARCHAR2(8);      -- ㄷ금액
V_RETURN   VARCHAR2(8);      -- ㅇㅇㅂㄷ비용

BEGIN

    BEGIN
     SELECT
         L1.AGENT_ID
       , L1.SALE_AMT
       , (SELECT LN_KIND FROM CMC004TM WHERE GOODS_CD = L1.GOODS_CD)
          INTO
         V_AGENTID
       , V_SALEAMT
       , V_LNKIND
      FROM LNC001TM L1
     WHERE L1.INSP_NO = P_INSPNO;
    EXCEPTION
        WHEN OTHERS THEN
            V_AGENTID := NULL;
    END;

    IF V_AGENTID IS NULL THEN
       RETURN NULL;
    END IF;

     --ㅈㅈㅇ
    IF  V_LNKIND = 'LAA0010' THEN
       IF V_SALEAMT <= 5000000 THEN
           V_RETURN := V_SALEAMT * 0.05;
       ELSIF V_SALEAMT > 5000000 AND V_SALEAMT <= 10000000 THEN
           V_RETURN := 250000 + (V_SALEAMT - 5000000)*0.04 ;
       ELSIF V_SALEAMT > 10000000 AND V_SALEAMT <= 20000000 THEN
           V_RETURN := 450000 + (V_SALEAMT - 10000000)*0.03 ;
       END IF;
    END IF;

     --ㅎ
    IF V_LNKIND = 'LAA0020' THEN
       IF V_AGENTID = 'AG0001' THEN
          V_RETURN := V_SALEAMT * 2.75;
       ELSIF V_AGENTID != 'AG0001' THEN
          V_RETURN := V_SALEAMT * 2.42;
       END IF;
    END IF;

     --ㅅ
    IF V_LNKIND = 'LAA0040' THEN
       V_RETURN := V_SALEAMT * 3.85;
    END IF;

    RETURN V_RETURN;
EXCEPTION
    WHEN OTHERS THEN
        RETURN NULL;
END FN_TEMP;

 


by 치즈와두부 [2016.10.25 13:16:25]

정말 감사합니다^^!!!!


by 마농 [2016.10.24 17:11:29]

대입식에 Case 를 이용해야 하는데... Case 에 대입식을 넣었네요.
 - 변경전 : CASE WHEN 조건1 THEN v_return := 값1; WHEN 조건2 THEN v_return := 값2; END
 - 변경후 : v_return := CASE WHEN 조건1 THEN 값1 WHEN 조건2 THEN 값2 END;


by 치즈와두부 [2016.10.25 13:16:37]

정말 감사합니다^_^

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입