已知工资计算公式为:工资=基本工资+职级工资+职级绩效
根据tbl_employees、tbl_departments和tbl_rank_salary使用游标创建存储过程:employeesalary()
该存储过程目的是生成职工工资表emsalary,包括职工编号(employee_id)、部门名称(department)、职工姓名(name)、职级名称(rank_title )、工资(allsalary)5个字段。
MySQL数据库创建存储过程如下,在创建存储过程时,需要使用不同的语句分隔符以区分普通SQL语句:
DELIMITER $$
CREATE PROCEDURE employeesalary()
BEGIN
-- 声明变量
DECLARE done INT DEFAULT FALSE;
DECLARE employee_id CHAR(10);
DECLARE department VARCHAR(20);
DECLARE name VARCHAR(15);
DECLARE rank_title VARCHAR(20);
DECLARE base_salary DECIMAL(10, 2);
DECLARE rank_salary DECIMAL(10, 2);
DECLARE performance_pay DECIMAL(10, 2);
DECLARE allsalary DECIMAL(10, 2);
-- 声明游标
DECLARE cur CURSOR FOR
SELECT e.employee_id, d.department, e.name, rs.rank_title, e.base_salary, rs.rank_salary, rs.performance_pay
FROM tbl_employees e
INNER JOIN tbl_departments d ON e.department_id = d.department_id
INNER JOIN tbl_rank_salary rs ON e.rank_id = rs.rank_id;
-- 声明异常处理程序
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;
-- 创建临时表用于存储结果
CREATE TEMPORARY TABLE emsalary (
employee_id CHAR(10),
department VARCHAR(20),
name VARCHAR(15),
rank_title VARCHAR(20),
allsalary DECIMAL(10, 2)
);
-- 打开游标
OPEN cur;
-- 读取游标数据
read_loop: LOOP
FETCH cur INTO employee_id, department, name, rank_title, base_salary, rank_salary, performance_pay;
IF done THEN
LEAVE read_loop;
END IF;
-- 计算工资
SET allsalary = base_salary + rank_salary + performance_pay;
-- 插入数据到 emsalary 表
INSERT INTO emsalary (employee_id, department, name, rank_title, allsalary)
VALUES (employee_id, department, name, rank_title, allsalary);
END LOOP;
-- 关闭游标
CLOSE cur;
-- 返回 emsalary 表的数据
SELECT * FROM emsalary;
-- 删除临时表
DROP TEMPORARY TABLE emsalary;
END;
DELIMITER ;
测试:
CALL employeesalary();