本文详细讲解SQL中游标和触发器的使用方法,包含完整的代码示例。通过员工薪资筛选和学生表审计两个实战案例,展示如何逐行处理查询结果和实现数据变更自动响应。
🚀 在SQL中使用游标和触发器(附示例)
在SQL中,游标和触发器是强大的功能,允许您逐行处理查询并在数据更改时自动执行操作。让我们通过实际示例来学习如何使用它们。
🔹 游标示例:薪资大于50,000的员工
我们想要使用游标显示薪资大于50,000的员工姓名。
步骤1:员工表
1
2
3
4
5
6
7
8
9
10
11
|
CREATE TABLE Employee (
EmpID INT PRIMARY KEY,
EmpName VARCHAR(50),
Salary DECIMAL(10,2)
);
-- 示例数据
INSERT INTO Employee VALUES (1, 'John', 60000);
INSERT INTO Employee VALUES (2, 'Alice', 45000);
INSERT INTO Employee VALUES (3, 'Bob', 75000);
INSERT INTO Employee VALUES (4, 'Emma', 52000);
|
步骤2:带条件的游标
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
SET SERVEROUTPUT ON;
DECLARE
v_EmpName Employee.EmpName%TYPE; -- 用于保存员工姓名的变量
CURSOR emp_cursor IS
SELECT EmpName FROM Employee WHERE Salary > 50000;
BEGIN
OPEN emp_cursor;
LOOP
FETCH emp_cursor INTO v_EmpName;
EXIT WHEN emp_cursor%NOTFOUND;
DBMS_OUTPUT.PUT_LINE('Employee Name: ' || v_EmpName);
END LOOP;
CLOSE emp_cursor;
END;
/
|
🔹 触发器示例:学生表的AFTER INSERT触发器
每当添加新学生时,我们希望自动将其记录到审计表中。
步骤1:创建学生表和审计表
1
2
3
4
5
6
7
8
9
10
11
12
|
CREATE TABLE Students (
StudentID INT PRIMARY KEY,
StudentName VARCHAR(50),
Department VARCHAR(50)
);
CREATE TABLE Student_Audit (
AuditID INT IDENTITY(1,1) PRIMARY KEY,
StudentID INT,
ActionTime DATETIME,
ActionPerformed VARCHAR(50)
);
|
步骤2:AFTER INSERT触发器
1
2
3
4
5
6
7
8
|
CREATE OR REPLACE TRIGGER trg_AfterInsert_Student
AFTER INSERT ON Students
FOR EACH ROW
BEGIN
INSERT INTO Student_Audit (StudentID, ActionTime, ActionPerformed)
VALUES (:NEW.StudentID, SYSTIMESTAMP, 'INSERT');
END;
/
|
步骤3:测试触发器
1
2
3
|
INSERT INTO Students VALUES (1, 'Mike', 'CSE');
INSERT INTO Students VALUES (2, 'Sophia', 'IT');
SELECT * FROM Student_Audit;
|
🎯 结论
- 游标允许我们逐行获取数据并应用条件
- 触发器在事件(INSERT/UPDATE/DELETE)后自动执行操作
- 两者结合有助于实时数据处理和审计