字节流的博客

MySQL 存储过程和函数

存储过程和函数的区别是函数必须有返回值。

1. 创建

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
-- 修改定界符为$$,因为在创建存储过程中会用到 分号,系统会误以为结束而实际为结束,所以需要修改掉原来的分号界定符;
DELIMITER $$
CREATE PROCEDURE Bschool (
IN p_age INT,
IN p_id INT,
OUT p_result VARCHAR (100)
)

READS SQL DATA
SQL SECURITY DEFINER
BEGIN
SELECT school
FROM student
WHERE age = p_age
AND id = p_id ;
SELECT
FOUND_ROWS() INTO p_result ;
END;

2. 特征值

  • CONTAINS SQL:子进程不包含读写数据的语句;
  • NO SQL:表示子程序中不使用SQL语句;
  • READS SQL DATA:表示子进程包含读数据的语句;
  • MODIFIES SQL DATA:表示子进程包含修改数据的语句;
  • SQL SECURIT:
    • DEFINER:定义子程序改用创建子程序的者的许可来执行,还是调用者的许可来执行,这里是定义者;
    • INVOKER:调用者;【因为调用该存储过程中,用户并不一定有执行子程序的权限】

3. 删除

1
DROP {PROCEDURE | FUNCTION} [IF EXISTS] sp_name;

4. 查看

1
2
3
SHOW {PROCEDURE | FUNCTION} STATUS [LIKE 'PATTERN'];
-- 查看定义
SHOW CREATE {PROCEDURE | FUNCTION} sp_name;

5. 调用

1
2
CALL Bschool(p_age, p_id, @result);
SELECT @result;

6. 变量

1
2
3
4
5
DECLARE var_name[,...] TYPE [DEFAULT value]
-- demo
DECLARE last_month_start DATE;
-- 赋值
SET var_name = {CONST | EXPR} [, var_name=...]

7. 条件的定义和处理

  • 条件的定义和处理可以用来定义在处理过程中遇到问题的处理步骤;
  • 对出现的错误码和或相应的值进行处理,如异常处理。

8. 光标的使用

  • 存储过程和函数中可以使用光标对结果集进行循环的处理;
  • 使用方法:
    1
    2
    3
    4
    5
    6
    7
    8
    -- 声明光标
    DECLARE cursor_name CURSOR FOR select_statement;
    -- OPEN光标
    OPEN cursor_name
    -- FETCH光标
    FETCH cursor_name
    -- CLOSE光标
    CLOSE cursor_name

9. 流程控制

  • IF
  • CASE
  • LOOP
  • LEAVE
  • ITERATE
  • REPEAT
  • WHILE
Thanks! 😊