触发编译错误

Trigger compilation error

我需要一些帮助来创建触发器。

create or replace trigger trigger_one 
before insert on Funtom_timesheet
for each row
Declare
V_id    number;
V_hours number;
Begin
Select max(timesheet_ID)+1 into v_id from Funtom_timesheet
:new.timesheet_ID :=v_id;
select grade_hours into V_hours
from funtom_grade join funtom_employee
on emp_grade = grade_id
where empid = :new.timesheet_emp;
if V_hours >:new.timesheet_hours
else
:new.timesheet_overtime :=
:new.timesheet_hours-V_hours
:new.timesheet_hours:= V_hours;
END IF;
END;
/

请告诉我我的代码的哪一部分是错误的,以便我可以处理它, 谢谢

您有很多语法错误 - 缺少 ;then。不能有 if 只有 else 部分而没有表达式。

CREATE OR REPLACE TRIGGER TRIGGER_ONE
  BEFORE INSERT ON FUNTOM_TIMESHEET
  FOR EACH ROW
DECLARE
  V_ID    NUMBER;
  V_HOURS NUMBER;
BEGIN
  SELECT MAX(TIMESHEET_ID) + 1 INTO V_ID FROM FUNTOM_TIMESHEET;
  :NEW.TIMESHEET_ID := V_ID;
  SELECT GRADE_HOURS
    INTO V_HOURS
    FROM FUNTOM_GRADE
    JOIN FUNTOM_EMPLOYEE
      ON EMP_GRADE = GRADE_ID
   WHERE EMPID = :NEW.TIMESHEET_EMP;
  IF V_HOURS > :NEW.TIMESHEET_HOURS THEN
    NULL;
  ELSE
    :NEW.TIMESHEET_OVERTIME := :NEW.TIMESHEET_HOURS - V_HOURS;
    :NEW.TIMESHEET_HOURS    := V_HOURS;
  END IF;
END;
/

也最好使用 SEQUENCES 而不是:

SELECT MAX(TIMESHEET_ID) + 1 INTO V_ID FROM FUNTOM_TIMESHEET;
:NEW.TIMESHEET_ID := V_ID;

选择符号相同table与插入时,您可以得到突变触发 error(http://www.dba-oracle.com/t_avoiding_mutating_table_error.htm