您已被指示检查 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
块尚未关闭。所以你需要这样做(return
正如 Ed 所指出的那样移动):
...
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;
我忽略了 eelse
是无法访问的,因为您也已经被告知过,这说明了如果您确实有一个使它有效的场景,比如第二个 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;
您确实需要澄清您的第二个条件是否缺少上限。