在Pl Sql中遇到并遇到错误符号“CALCULATE_BONUS”

时间:2013-10-02 18:42:08

标签: sql oracle plsql syntax-error

错误似乎与结束语句一起发生虽然我不能在我的生活中发现它是什么我相信它会是愚蠢的。

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 个答案:

答案 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;

你真的需要澄清你的第二个条件是否缺少上限。