【问题标题】:These bits of code all have errors in how can i fix this? [duplicate]这些代码位都有错误,我该如何解决? [复制]
【发布时间】:2013-10-09 01:27:29
【问题描述】:

这在VARCHAR2(4) 旁边有一个错误:

CREATE OR REPLACE FUNCTION Employee_exists
 (p_employee_id IN NUMBER)
RETURN VARCHAR2(4);
AS
BEGIN
        SELECT employee_id
        FROM employees
        WHERE employee_id = p_employee_id;

        RETURN 'true';

END Employee_exists;

这里说v_years_service的声明旁边有一个错误:

CREATE OR REPLACE FUNCTION Calculate_Bonus(p_salary IN NUMBER, p_startdate IN DATE)
RETURN NUMBER -- here it errors
AS
  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

【问题讨论】:

  • 在您的第二个代码块中,最后一个 else 语句永远不会被命中,因为前两个 if 语句处理所有有效值。首先是小于 2 的任何值,第二个是大于或等于 2 的任何值,最后一个 else 语句没有留下任何东西。

标签: sql oracle plsql syntax-error


【解决方案1】:

对于Employee_exists 函数,更改如下:

RETURN VARCHAR2(4)

到这里:

RETURN VARCHAR

对于Calculate_bonus 函数,移动这一行...

v_years_service NUMBER;

...所以它在AS 行下:

CREATE OR REPLACE FUNCTION Calculate_bonus(p_salary IN NUMBER, p_startdate IN DATE)
RETURN NUMBER
AS
  v_years_service NUMBER; --here is where the error appears
BEGIN
  ... and the rest

最后是这一行:

v_years_service = TRUNC(MONTHS_BETWEEN(SYSDATE, v_startdate) /12);

变量赋值总是:=,所以改成这样:

v_years_service := TRUNC(MONTHS_BETWEEN(SYSDATE, v_startdate) /12);

附录 A 另请注意@JoeW 在您的问题下的评论。乔说 - 正确 - 你的 ELSE 条件永远不会被击中。


附录 B

这是完整的功能。您可能还想对返回值进行四舍五入,因为薪水乘以 0.02 或 0.05 可以得到分数。要四舍五入,请将RETURN ROUND(p_bonus, 2); 替换为RETURN p_bonus;

CREATE OR REPLACE FUNCTION Calculate_Bonus(p_salary IN NUMBER, p_startdate IN DATE)
RETURN NUMBER
AS
  v_years_service NUMBER;
  v_bonus NUMBER;
BEGIN
  v_years_service := TRUNC(Months_Between(SYSDATE, p_startdate) /12);
  IF (v_years_service <2) THEN
        v_bonus := p_salary * 0.02;
  ELSE
        v_bonus := p_salary * 0.05;
  END IF;
  RETURN v_bonus;
END Calculate_Bonus;
/

【讨论】:

  • 谢谢,但是当我这样做时,它现在在 RETURN NUMBER 第 2 行之后出错,并且它说结尾应该替换为 if 请参阅上面的代码以了解我所做的更改
  • 关于任务2部分代码
  • 您的新代码有很多错误:变量p_startdatep_salary 在参数列表中定义,但稍后您引用v_salaryv_startdate - 这些应该以p_,不是v_。您有两个 IF 语句失控,并且您没有声明 p_bonus 变量。请参阅我的更新答案。我的建议是放松,在编写函数时尽量小心谨慎。从存根开始,然后逐渐添加,随时修复错误,您很快就会掌握它:)
猜你喜欢
  • 1970-01-01
  • 2011-09-04
  • 1970-01-01
  • 2018-09-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-14
  • 2012-08-31
相关资源
最近更新 更多