2013-10-02 86 views
-3

儘管我不能爲我的生活找出它是什麼,我相信它會是愚蠢的。在Pl Sql我遇到和錯誤遇到符號「CALCULATE_BONUS」

CREATE OR REPLACE FUNCTION Calculate_Bonus(p_salary IN NUMBER, p_startdate IN DATE) 
RETURN NUMBER IS 
    v_years_service NUMBER; 
BEGIN 
    v_years_service := TRUNC(Months_Between(SYSDATE, v_startdate) /12); 

    IF (v_years_service <2) THEN 
     p_bonus := v_salary * 0.02; 
    ELSE 
    IF (v_year_service >=2) THEN 
     p_bonus := v_salary * 0.04; 
    ELSE 
     p_bonus := v_salary * 0.05; 

    RETURN p_bonus; 
END IF; 
END Calculate_Bonus; 
/
show err 
+1

語法錯誤,請檢查[文檔]中的if-then-else語法(http://docs.oracle.com/cd/E11882_01/appdev.112/e25519/controlstatements.htm)。 – user272735

+0

Streetrun - 請參閱我更新的最後一個問題的答案。還要注意,你在這個最新版本中的邏輯沒有意義:你檢查年限<2,然後年> = 2,然後是「其他」。當您檢查<2 or > = 2 *時,沒有其他*。最後,'RETURN p_bonus'只會在'ELSE'條件下執行。即使在修復邏輯之後,您想在* END IF之後返回*。 –

+0

對不起Streetrun - 意思是留下一個鏈接到答案。這是[這裏](http://stackoverflow.com/a/19140864/2091410) –

回答

2

你已經被引導到檢查的if-else端語法,但你的問題仍然表明您已經嵌套IF塊與缺少END IF。縮進希望顯示問題:

... 
    IF (v_years_service <2) THEN 
    p_bonus := v_salary * 0.02; 
    ELSE 
    IF (v_year_service >=2) THEN 
     p_bonus := v_salary * 0.04; 
    ELSE 
     p_bonus := v_salary * 0.05; 
     RETURN p_bonus; 
    END IF; 
END Calculate_Bonus; 

你有兩個開放IF關鍵字,但只有一個END IF。所以當它到達END Calculate_Bonus行時,它不期望看到該函數的結尾,因爲外部IF塊尚未關閉。所以,你需要做到這一點(與return移動,艾德還指出):

... 
    IF (v_years_service <2) THEN 
    p_bonus := v_salary * 0.02; 
    ELSE 
    IF (v_year_service >=2) THEN 
     p_bonus := v_salary * 0.04; 
    ELSE 
     p_bonus := v_salary * 0.05; 
    END IF; 
    END IF; 
    RETURN p_bonus; 
END Calculate_Bonus; 

你也可以使用ELSIF而非嵌套IF

... 
    IF (v_years_service <2) THEN 
    p_bonus := v_salary * 0.02; 
    ELSIF (v_year_service >=2) THEN 
    p_bonus := v_salary * 0.04; 
    ELSE 
    p_bonus := v_salary * 0.05; 
    END IF; 
    RETURN p_bonus; 
END Calculate_Bonus; 

我忽略e else是無法訪問的,因爲你已經被告知了這一點,並且這表明如果你確實有一個使其有效的場景該怎麼辦,比如說第二個teir應該服務於2到5年的服務年,或什麼 - 在這種情況下,第二個條件是缺少and ...

或者你甚至可以這樣做:

... 
    p_bonus := v_salary * CASE WHEN v_years_service < 2 THEN 0.02 
    WHEN v_years_service >= 2 THEN 0.04 
    ELSE 0.05 END; 
    RETURN p_bonus; 
END Calculate_Bonus; 

你真的需要澄清你的第二個條件是否缺少一個上限,雖然。