使用来自3个不同表的行计算加班时间

时间:2016-04-23 19:19:33

标签: sql oracle triggers sqlplus

我对SQL很新,我试图创建一个触发器来计算加班时间,从工作小时数减去GRADE_HOURS表中约定的小时数(COMPANY_GRADE){{1 } {}在TIMESHEET_HOURS表中。只要在COMPANY_TIMESHEET表中插入行,这将进入TIMESHEET_OT表的COMPANY_TIMESHEET列。

有关表格如下:

COMPANY_TIMESHEET

我会感激任何帮助,因为我已经尝试了很多个小时,现在只是在错误后遇到错误。

我已尝试过多种变体作为起始块,尝试将收缩时间传递给变量,然后从另一个变量中减去:

CREATE TABLE COMPANY_TIMESHEET
( 
timesheet_ID number(3) constraint timesheet_pk primary key, 
Timesheet_emp number(3) constraint timesheet_empnotnull not null references company_employee, 
Timesheet_wc date constraint timesheet_wcnotnull not null, 
Timesheet_hours number(2), 
Timesheet_OT number(2) default 0, 
Timesheet_approved number(3) references company_employee 
); 

CREATE TABLE COMPANY_GRADE
( 
grade_ID number(3) constraint grade_pk primary key, 
Grade_rate number(5,2) constraint grade_ratenotnull not null, 
Grade_hours number(2) 
) ; 

CREATE TABLE COMPANY_EMPLOYEE 
( 
emp_ID number(3) constraint emp_pk primary key, 
Emp_firstname varchar2(50) constraint emp_firstnamenotnull not null, 
Emp_surname varchar2(50), 
Emp_department number(2) constraint employeeFKdepartment references company_department, 
emp_street varchar2(50),
emp_town varchar2(50), 
emp_district varchar2(50), 
Emp_grade number(3) default 4 constraint checkempgrade check (Emp_grade between 1 and 9) references company_grade, 
Emp_site varchar2(30) default 'LONDON' 
);

1 个答案:

答案 0 :(得分:0)

CREATE OR REPLACE TRIGGER trg_ot
BEFORE INSERT ON company_timesheet
FOR EACH ROW
DECLARE t_contracted NUMBER;
BEGIN
  SELECT g.grade_hours
  INTO   t_contracted
  FROM   company_grade g
         INNER JOIN
         company_employee e
         ON ( e.emp_grade = g.grade_id )
  WHERE  e.emp_id = :new.timesheet_emp;

  :new.timesheet_ot := :new.timesheet_hours - t_contracted;
END;
/