创建存储过程和函数 === 创建存储过程和函数时,通常需要先切换语句结束符,因为过程体内部往往会包含多条 SQL。 ### 创建存储过程 基本语法如下: ```sql DELIMITER // CREATE PROCEDURE 过程名() BEGIN SQL语句; END // DELIMITER ; ``` 示例: ```sql DELIMITER // CREATE PROCEDURE get_all_user() BEGIN SELECT * FROM user; END // DELIMITER ; ``` 创建完成后,就可以通过过程名调用它。 ### 创建存储函数 基本语法如下: ```sql DELIMITER // CREATE FUNCTION 函数名(参数列表) RETURNS 返回类型 BEGIN RETURN 表达式; END // DELIMITER ; ``` 示例: ```sql 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 ; ``` ### 变量的使用 在存储过程和函数中可以定义局部变量。 语法: ```sql DECLARE 变量名 数据类型 [DEFAULT 默认值]; ``` 示例: ```sql DELIMITER // CREATE PROCEDURE demo_var() BEGIN DECLARE total INT DEFAULT 0; SET total = 100; SELECT total; END // DELIMITER ; ``` ### 定义条件和处理程序 当过程执行时可能遇到异常或特定状态,可以定义条件和处理程序。 常见写法如下: ```sql DECLARE CONTINUE HANDLER FOR SQLEXCEPTION SET @has_error = 1; ``` 这表示当发生 SQL 异常时,不终止过程,而是执行对应处理逻辑。 它适合: - 捕获异常 - 控制事务回滚 - 记录错误状态 ### 光标的使用 光标(Cursor)用于逐行处理查询结果集。 常见步骤包括: 1. 定义光标 2. 打开光标 3. 逐行读取 4. 关闭光标 例如: ```sql DECLARE cur CURSOR FOR SELECT id, name FROM user; ``` 光标更适合需要逐行处理的复杂业务逻辑,但在很多场景中,集合化 SQL 往往比逐行处理更高效。 ### 流程控制的使用 存储过程和函数中也支持基本流程控制,例如: - `IF ... THEN ... ELSE` - `CASE` - `WHILE` - `LOOP` - `REPEAT` 例如: ```sql IF total > 0 THEN SELECT '有数据'; ELSE SELECT '无数据'; END IF; ``` ### 小结 创建存储过程和函数的关键在于三点:切换分隔符、明确过程体结构、合理使用变量和流程控制。真正复杂的地方不是语法,而是过程内部的业务逻辑设计。