Duration: 2 hours (Lecture: 2 hours, Lab: 2 hours)
Syllabus Topics:
SELECT
query, enabling iterative processing when set-based operations are insufficient.UPDATE
).DECLARE: Define the cursor with a SELECT
statement.
DECLARE cursor_name CURSOR FOR SELECT_statement;
OPEN: Initialize the cursor to start processing the result set.
OPEN cursor_name;
FETCH: Retrieve the next row’s data into variables.
FETCH cursor_name INTO variable1, variable2, ...;
CLOSE: Release the cursor to free resources.
CLOSE cursor_name;
Handler: Use a CONTINUE HANDLER
to detect when no more rows are available.
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;
A stored procedure that uses a cursor to process employees and increase salaries for a specific department.
DELIMITER //
CREATE PROCEDURE IncreaseDeptSalary(IN dept_id INT)
BEGIN
DECLARE done INT DEFAULT FALSE;
DECLARE emp_id INT;
DECLARE emp_salary DECIMAL(10,2);
DECLARE emp_cursor CURSOR FOR
SELECT emp_id, salary FROM employees WHERE dept_id = dept_id;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;
OPEN emp_cursor;
salary_loop: LOOP
FETCH emp_cursor INTO emp_id, emp_salary;
IF done THEN
LEAVE salary_loop;
END IF;
UPDATE employees SET salary = emp_salary * 1.1 WHERE emp_id = emp_id;
END LOOP;
CLOSE emp_cursor;
END //
DELIMITER ;
Explanation:
emp_id
and salary
for a given dept_id
.NOT FOUND
handler).UPDATE employees SET salary = salary * 1.1 WHERE dept_id = 1;
).The lab focuses on creating stored procedures with cursors, implementing different cursor types (to the extent supported by MySQL), and testing their behavior.
Setup:
CREATE DATABASE company;
USE company;
CREATE TABLE employees (
emp_id INT PRIMARY KEY,
name VARCHAR(50),
salary DECIMAL(10,2),
dept_id INT
);
INSERT INTO employees VALUES
(1, 'Alice', 60000, 1),
(2, 'Bob', 55000, 1),
(3, 'Charlie', 40000, 2),
(4, 'David', 45000, 2),
(5, 'Eve', 70000, 3);
CREATE TABLE audit_log (
log_id INT AUTO_INCREMENT PRIMARY KEY,
action VARCHAR(50),
emp_id INT,
details VARCHAR(100),
action_time TIMESTAMP
);
Basic Cursor Procedure:
DELIMITER //
CREATE PROCEDURE LogEmployeeSalaries()
BEGIN
DECLARE done INT DEFAULT FALSE;
DECLARE emp_id INT;
DECLARE emp_name VARCHAR(50);
DECLARE emp_salary DECIMAL(10,2);
DECLARE emp_cursor CURSOR FOR
SELECT emp_id, name, salary FROM employees;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;
OPEN emp_cursor;
emp_loop: LOOP
FETCH emp_cursor INTO emp_id, emp_name, emp_salary;
IF done THEN
LEAVE emp_loop;
END IF;
INSERT INTO audit_log (action, emp_id, details, action_time)
VALUES ('LOG', emp_id, CONCAT('Salary: ', emp_salary, ' for ', emp_name), NOW());
END LOOP;
CLOSE emp_cursor;
END //
DELIMITER ;
CALL LogEmployeeSalaries();
SELECT * FROM audit_log;
emp_id
, name
, and salary
.audit_log
.