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

ここでは、宣言の横にエラーがあると書かれています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 に答える