SELECT COUNT(*) INTO NUM2 FROM Employees WHERE EmployeeID=EM_ID;
IF NUM1=1 AND NUM2=0 THEN
DELETE FROM Salary WHERE EmployeeID=EM_ID; RETURN TRUE;
ELSE
RETURN FALSE; END IF; END$$ DELIMITER ;
调用该存储函数:
SELECT DELETE_EM ('000001');
往Salary表中插入一行记录后调用该存储函数。
INSERT INTO Salary values('000002',1212,123); SELECT DELETE_EM ('000002');
观察并总结上面两次调用结果的不同。
思考题:
1. 创建存储函数,判断员工是否在研发部工作,若是则返回其学历,若不是则返回字符串“NO”。
CREATE FUNCTION JUDGE_EM(EM_ID CHAR(6) ) RETURNS CHAR(4) BEGIN
DECLARE DEP CHAR(20); DECLARE EDU CHAR(4); SELECT
DepartmentName,Education
INTO
DEP,EDU
FROM
EMPLOYEES,DEPARTMENTS
WHERE EMPLOYEES.DepartmentID=DEPARTMENTS.DepartmentID AND EmployeeID=EM_ID;
IF DEP='研发部' THEN
6
RETURN EDU; ELSE
RETURN 'NO'; END IF; END
3.触发器
(1)创建触发器,在Employees表中删除员工信息的同时将Salary表中该员工的信息删除,以确保数据完整性。
CREATE TRIGGER DELETE_EM AFTER DELETE
ON Employees FOR EACH ROW
DELETE FROM Salary WHERE EmployeeID=OLD. EmployeeID;
创建完后删除Employees表中的一行数据,然后查看Salary表中的变化情况。
(2)创建表Departments1,其结构和内容与表Departments都相同
CREATE TABLE Departments1 LIKE Departments;
INSERT INTO Departments1 SELECT * FROM Departments;
在表Departments上创建一个触发器,如果添加一个新的部门,该部门也会添加到表Departments1中。
DELIMITER $$
CREATE TRIGGER Departments_Ins AFTER INSERT BEGIN END$$ DELIMITER ;
创建完后添加一个部门到Departments,然后查看Departments1表中的变化情况。
ON Departments FOR EACH ROW INSERT INTO Departments1
VALUES(NEW.DepartmentID,NEW.DepartmentName,NEW.Note);
(3)创建触发器,当修改Employees表时,若将Employees表中员工的工作时间增加1年,则将收入增加500,增加2年则增加1000,依次类推。若工作时间减少则无变化。
DELIMITER $$
7
CREATE TRIGGER ADD_SALARY AFTER UPDATE BEGIN
DECLARE YEARS INT;
SET YEARS=NEW.WorkYear-OlD.WorkYear; IF YEARS>0 THEN
UPDATE Salary SET InCome=InCome+500*YEARS WHERE
EmployeeID=NEW. EmployeeID;
END IF;
END$$ DELIMITER ;
创建完后修改Employees表中的一个职工的工作时间,然后查看Salary表中对应职工的收入变化情况。
ON Employees FOR EACH ROW
思考题:
1. 创建UPDATE触发器,当表Departments中的部门号发生变化时,Employees表中的员工所属的部门号也将改变。
CREATE TRIGGER T_11 AFTER UPDATE
ON Departments FOR EACH ROW UPDATE
Employees
SET DepartmentID=NEW.DepartmentID WHERE
DepartmentID=OLD.DepartmentID;
2. 创建UPDATE触发器,当表Salary中的InCome值增加500时,OutCome值增加50。
CREATE TRIGGER T_12 BEFORE UPDATE
ON Salary FOR EACH ROW
BEGIN
DECLARE N INT; DECLARE S FLOAT;
SET S=NEW.INCOME-OLD.INCOME; SET N=S/500;
8
IF N>=1 THEN
SET NEW.OUTCOME=old.outcome+N*50; END IF; END;
4.事件
(1)创建一个立即执行的事件,查询Employees表的信息。
CREATE EVENT DIRECT
ON SCHEDULE AT NOW() DO
SELECT * FROM Employees;
(2)创建一个事件,每天执行一次,它从明天开始直到2011年12月31日结束。
CREATE EVENT every_day
ON SCHEDULE EVERY 1 DAY
STARTS CURDATE()+INTERVAL 1 DAY ENDS '2011-12-31' DO
SELECT * FROM Employees; 思考题:
本次实验中遇到的问题及解决方法。
9