SQL游标与触发器实战教程:掌握数据库高级操作

本文详细讲解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)后自动执行操作
  • 两者结合有助于实时数据处理和审计
comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计