-5

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;

这里它说在 decleration 旁边有一个错误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
4

1 回答 1

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;
/
于 2013-10-02T15:36:34.473 回答