【问题标题】:In Pl Sql I encounter and error encountered the symbol "CALCULATE_BONUS" [closed]在 Pl Sql 中,我遇到了错误,遇到了符号“CALCULATE_BONUS”[关闭]
【发布时间】:2013-10-02 18:42:08
【问题描述】:

错误似乎出现在 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

【问题讨论】:

  • 语法错误,请检查the docs中的if-then-else语法。
  • Streetrun - 请查看我为您的上一个问题更新的答案。另请注意,您在此最新版本中的逻辑没有意义:您检查 years=2,然后是“else”。当您检查 =2 没有别的。最后,RETURN p_bonus 只会针对ELSE 条件执行。即使在您修复了逻辑之后,您也希望在 END IF 之后返回。
  • Sorry Streetrun - 旨在留下答案的链接。这是here
  • @EdGibbs,从技术上讲,可以是一个“else”。如果years 为空,则years=2 条件均不成立。

标签: sql oracle plsql syntax-error


【解决方案1】:

您已被指示检查 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;

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-10-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-11
    • 2019-05-05
    相关资源
    最近更新 更多