9问这道数据库到底怎么写?

已知工资计算公式为:工资=基本工资+职级工资+职级绩效
根据tbl_employees、tbl_departments和tbl_rank_salary使用游标创建存储过程:employeesalary()
该存储过程目的是生成职工工资表emsalary,包括职工编号(employee_id)、部门名称(department)、职工姓名(name)、职级名称(rank_title )、工资(allsalary)5个字段。

img

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