2016-04-23 19 views
1

私はSQLにかなり新しいだと私はCOMPANY_TIMESHEETに時間からCOMPANY_GRADEテーブルに収縮時間(GRADE_HOURS)を減算することにより、所定外労働を計算するためのトリガ働いていた(TIMESHEET_HOURS)を作成しようとしています表。これは、行がCOMPANY_TIMESHEETテーブルに挿入されるたびに、COMPANY_TIMESHEETテーブルのTIMESHEET_OTカラムに入ります。次のように関係計算残業使用して行が

テーブルは以下のとおりです。

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

私はエラーが発生した後、エラーによって満たされるようになりました多くの時間のためにしようとしているとして、私は任意の助けをいただければ幸いです。

私はその後、別の変数から減算する変数に契約時間を試してみて、合格するために開始ブロックとして本の多数のバリエーションを試してみました:

CREATE OR REPLACE TRIGGER trg_ot 
BEFORE INSERT ON company_timesheet 
FOR EACH ROW 
DECLARE t_contracted NUMBER; 
BEGIN 
    SELECT grade_hours INTO t_contracted 
    FROM company_grade 
    WHERE company_employee.emp_id = :new.timesheet_emp; 
END; 
/
+0

あなたの質問はMyQLとSQL Serverをタグ付けされています。しかし、これらの2つのデータベースのどちらよりも、コードはOracleによく似ています。私はデータベース固有のタグを削除しています。使用している実際のデータベースに質問にタグを付けてください。 –

答えて

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; 
/
関連する問題