Skip to content

Latest commit

 

History

History
156 lines (107 loc) · 2.36 KB

File metadata and controls

156 lines (107 loc) · 2.36 KB

创建存储过程和函数

创建存储过程和函数时,通常需要先切换语句结束符,因为过程体内部往往会包含多条 SQL。

创建存储过程

基本语法如下:

DELIMITER //

CREATE PROCEDURE 过程名()
BEGIN
  SQL语句;
END //

DELIMITER ;

示例:

DELIMITER //

CREATE PROCEDURE get_all_user()
BEGIN
  SELECT * FROM user;
END //

DELIMITER ;

创建完成后,就可以通过过程名调用它。

创建存储函数

基本语法如下:

DELIMITER //

CREATE FUNCTION 函数名(参数列表)
RETURNS 返回类型
BEGIN
  RETURN 表达式;
END //

DELIMITER ;

示例:

DELIMITER //

CREATE FUNCTION get_level(score INT)
RETURNS VARCHAR(10)
BEGIN
  RETURN CASE
    WHEN score >= 90 THEN '优秀'
    WHEN score >= 60 THEN '及格'
    ELSE '不及格'
  END;
END //

DELIMITER ;

变量的使用

在存储过程和函数中可以定义局部变量。

语法:

DECLARE 变量名 数据类型 [DEFAULT 默认值];

示例:

DELIMITER //

CREATE PROCEDURE demo_var()
BEGIN
  DECLARE total INT DEFAULT 0;
  SET total = 100;
  SELECT total;
END //

DELIMITER ;

定义条件和处理程序

当过程执行时可能遇到异常或特定状态,可以定义条件和处理程序。

常见写法如下:

DECLARE CONTINUE HANDLER FOR SQLEXCEPTION
SET @has_error = 1;

这表示当发生 SQL 异常时,不终止过程,而是执行对应处理逻辑。

它适合:

  • 捕获异常
  • 控制事务回滚
  • 记录错误状态

光标的使用

光标(Cursor)用于逐行处理查询结果集。

常见步骤包括:

  1. 定义光标
  2. 打开光标
  3. 逐行读取
  4. 关闭光标

例如:

DECLARE cur CURSOR FOR
SELECT id, name FROM user;

光标更适合需要逐行处理的复杂业务逻辑,但在很多场景中,集合化 SQL 往往比逐行处理更高效。

流程控制的使用

存储过程和函数中也支持基本流程控制,例如:

  • IF ... THEN ... ELSE
  • CASE
  • WHILE
  • LOOP
  • REPEAT

例如:

IF total > 0 THEN
  SELECT '有数据';
ELSE
  SELECT '无数据';
END IF;

小结

创建存储过程和函数的关键在于三点:切换分隔符、明确过程体结构、合理使用变量和流程控制。真正复杂的地方不是语法,而是过程内部的业务逻辑设计。