create table Employee
(
fname Varchar2(10),
minit Varchar2(1),
lname Varchar2(10),
ssn Number(10) NOT NULL,
dbate Date,
address Varchar2(30),
sex Varchar2(1),
Salary Number(6) constraint check_sal CHECK(salary>=0),
superssn Number(10) NOT NULL DEFAULT 00,
dno Number(4),
constraint pssn PRIMARY KEY (ssn),
constraint fk_mgr FOREIGN KEY (superssn)
references Employee(ssn) ON DELETE set default ON UPDATE cascade
);
create table Project
(
pname Varchar2(20),
pnumber Number(2) NOT NULL,
plocation Varchar2(10),
dnum Number(4),
constraint pn PRIMARY KEY (pnumber),
constraint fk_dnum FOREIGN KEY (dnum)
references Department(dnumber) ON DELETE cascade ON UPDATE cascade
);
create table Works_On
(
essn Number(10),
pno Number(2),
hours Number(2),
constraint pesspn PRIMARY KEY (essn, pno),
constraint fk_pno FOREIGN KEY (pno)
references Project( pnumber)
);
CREATE OR REPLACE PACKAGE WorksPack
AS w_essn Number;
END;
/
CREATE OR REPLACE TRIGGER Wk1
BEFORE INSERT OR UPDATE ON WORKS_ON
FOR EACH ROW
BEGIN
WorksPack.w_essn := :new.essn;
END;
/
CREATE OR REPLACE TRIGGER Wk2
AFTER INSERT OR UPDATE ON WORKS_ON
DECLARE
totalhrs Number(6,2);
BEGIN
select sum(hours) into totalhrs
from Works_On
where essn=WorksPack.w_essn
group by essn;
IF (totalhrs) IS NULL THEN
RAISE_APPLICATION_ERROR(-20001,'Total hours is null');
ELSIF (totalhrs < 25 ) THEN
RAISE_APPLICATION_ERROR(-20002,'Total hours is less than 25 hours');
ELSIF (totalhrs > 45) THEN
RAISE_APPLICATION_ERROR(-20003,'Total hours is more than 45 hours');
ELSE
dbms_output.put_line('Hours worked complies with company policy');
END IF;
END Wk2;
/
Is what I have done for the above trigger correct?
Works_On table references Employee and Project.
I need to fire the trigger on Works-on when a row is inserted/updated.
Thanks.