创建存储过程和函数时,通常需要先切换语句结束符,因为过程体内部往往会包含多条 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)用于逐行处理查询结果集。
常见步骤包括:
- 定义光标
- 打开光标
- 逐行读取
- 关闭光标
例如:
DECLARE cur CURSOR FOR
SELECT id, name FROM user;光标更适合需要逐行处理的复杂业务逻辑,但在很多场景中,集合化 SQL 往往比逐行处理更高效。
存储过程和函数中也支持基本流程控制,例如:
IF ... THEN ... ELSECASEWHILELOOPREPEAT
例如:
IF total > 0 THEN
SELECT '有数据';
ELSE
SELECT '无数据';
END IF;创建存储过程和函数的关键在于三点:切换分隔符、明确过程体结构、合理使用变量和流程控制。真正复杂的地方不是语法,而是过程内部的业务逻辑设计。