我需要假設每個員工每個專案的上限為 100 小時。我的任務是開發一個觸發器來跟蹤員工超過專案上限時的加班時間?我需要有關觸發器陳述句的幫助
創建表 EMP_PROJ(empNo number(4,0) NOT NULL, projNo number(4,0) NOT NULL, hoursWorked number(4,2) NOT NULL, 約束 EMP_PROJ_empNo_projNo_PK 主鍵 (empNo, projNo));

CREATE TABLE EMP_PROJ_OVERTIME(EMPNO NUMBER(4,0) NOT NULL, PROJNO NUMBER(4,0) NOT NULL, HOUROT NUMBER(22) NOT NULL, CONSTRAINT EMP_PROJ_OVERTIME_EMPNO_PROJNO_PK PRIMARY KEY (EMPNO, PROJNO));

這就是我到目前為止所擁有的。
CREATE OR REPLACE TRIGGER OVERTIME_HOURS
AFTER INSERT OR UPDATE OF hoursWorked ON EMP_PROJ
declare
hoursWorked number(22);
BEGIN
IF(hoursWorked > 100)
THEN
INSERT INTO emp_proj_overtime(empNo, projNo, hourOt)
SELECT empNo, projNo, hoursWorked - 100
FROM EMP_PROJ;
END IF;
END;
這個觸發器的問題是它沒有將超過 100 的小時數發送到加班表。
uj5u.com熱心網友回復:
你不在select觸發器中;只需使用:new偽記錄的值。
示例表:
SQL> CREATE TABLE emp_proj (
2 empno NUMBER(4, 0) NOT NULL,
3 projno NUMBER(4, 0) NOT NULL,
4 hoursworked NUMBER(6, 2) NOT NULL, -- can't be NUMBER(4, 2) as you can't insert values => 100
5 CONSTRAINT emp_proj_empno_projno_pk PRIMARY KEY ( empno,
6 projno )
7 );
Table created.
SQL> CREATE TABLE emp_proj_overtime (
2 empno NUMBER(4, 0) NOT NULL,
3 projno NUMBER(4, 0) NOT NULL,
4 hourot NUMBER(22) NOT NULL,
5 CONSTRAINT emp_proj_overtime_empno_projno_pk PRIMARY KEY ( empno,
6 projno )
7 );
Table created.
觸發器:由于定義為復合鍵的主鍵約束,每個 [empno, projno] 組合只能有一行。
SQL> CREATE OR REPLACE TRIGGER overtime_hours AFTER
2 INSERT OR UPDATE OF hoursworked ON emp_proj
3 FOR EACH ROW
4 WHEN ( new.hoursworked > 100 )
5 BEGIN
6 INSERT INTO emp_proj_overtime (
7 empno,
8 projno,
9 hourot
10 ) VALUES (
11 :new.empno,
12 :new.projno,
13 :new.hoursworked - 100
14 );
15
16 END;
17 /
Trigger created.
測驗(在更新現有行中的值期間出現加班時間):
SQL> insert into emp_proj (empno, projno, hoursworked) values (1, 100, 75);
1 row created.
SQL> select * From emp_proj;
EMPNO PROJNO HOURSWORKED
---------- ---------- -----------
1 100 75
SQL> select * From emp_proj_overtime;
no rows selected
SQL> update emp_proj set hoursworked = 102 where empno = 1 and projno = 100;
1 row updated.
SQL> select * From emp_proj;
EMPNO PROJNO HOURSWORKED
---------- ---------- -----------
1 100 102
SQL> select * From emp_proj_overtime;
EMPNO PROJNO HOUROT
---------- ---------- ----------
1 100 2
更多測驗(最初插入加班時間):
SQL> insert into emp_proj (empno, projno, hoursworked) values (2, 995, 113);
1 row created.
SQL> select * From emp_proj;
EMPNO PROJNO HOURSWORKED
---------- ---------- -----------
1 100 102
2 995 113
SQL> select * From emp_proj_overtime;
EMPNO PROJNO HOUROT
---------- ---------- ----------
1 100 2
2 995 13
SQL>
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/524340.html
