错误似乎与结束语句一起发生虽然我不能在我的生活中发现它是什么我相信它会是愚蠢的。
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
答案 0 :(得分:2)
您已被定制检查if-else-end语法,但您的问题仍然显示您已嵌套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
块尚未关闭。所以你需要这样做(如同Ed指出的那样移动了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;
你真的需要澄清你的第二个条件是否缺少上限。