-4

错误似乎出现在 end 语句中,尽管我一生都无法找出它是什么,我相信这将是一件愚蠢的事情。

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
4

1 回答 1

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块尚未关闭。所以你需要这样做(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;

您确实需要澄清您的第二个条件是否缺少上限。

于 2013-10-02T20:23:30.990 回答