数据库
首页 > 数据库> > MySQL教程 - 存储过程与自定义函数(Produce & Function)

MySQL教程 - 存储过程与自定义函数(Produce & Function)

作者:互联网

更新记录
转载请注明出处。
2022年9月4日 发布。
2022年9月4日 从笔记迁移到博客。

存储过程与函数

说明

存储过程和函数是一条或多条SQL语句的集合

存储过程的返回值通过输出参数实现,函数可以直接返回标量

存储过程和自定义函数区别

相同点:

​ 都是自定义逻辑的SQL集合

不同点:

存储过程没有返回值,但是可以有多个OUT参数

函数只有一个返回值,只有IN参数,没有OUT参数

存储过程和函数作用

实现复杂的SQL逻辑

减少传输量,SQL存储在服务器端

提高查询速度

设置结束符

DELIMITER 结束符

创建存储过程

CREATE PROCEDURE 存储过程名([IN | OUT | INOUT] 参数名  参数类型.....)
[特性]
BEGIN

END

特性可取值:
LANGUAGE SQL
指明使用的是SQL语言 [默认值]
[NOT] DETERMINISTIC
表示结果是否确定
DETERMINISTIC表示确定,每次输入相同就会输出相同
NOT DETEMINISTIC 表示不确定,每次输出可能不同 [默认值]
[NOT SQL | READS SQL DATA | MODIFIES SQL DATA | CONTAINT SQL]
表示包含的语句的限制
NOT SQL 表示没有包含的语句中没有SQL
READS SQL DATA 表示包含的语句有读取的SQL
MODIFIES SQL DATA 表示包含的语句有写入、修改的SQL
CONTAINT SQL 表示包含SQL,并且包含读取、写入的SQL。[默认值]
COMMENT '注释' 注释信息
SQL SECURITY [DEFINER | INVOKER]
表示谁有权限执行
DEFINER 表示定义者可以执行[默认值]
INVOKER 表示调用者可以执行
注意:特性是可选的

调用存储过程

CALL 存储过程名(参数);

备注:

​ 参数不需要带IN/OUT

修改存储过程

ALTER PROCEDURE存储过程名 (参数)
[特性]
BEGIN

END

查看存储过程和函数

SHOW CREATE [PROCEDURE | FUNCTION ] 存储过程名;

或者

SHOW [PROCEDURE | FUNCTION ] STATUS [LIKE '存储过程名'];

或者

SELECT * FROM information_schema.Routines
WHERE ROUTINE_NAME = '存储过程名';

删除存储过程和函数

DROP [PROCEDURE | FUNCTION ] [IF EXISTS] 存储过程名;

创建函数

CREATE FUNCTION 函数名([IN | OUT | INOUT] 参数名  参数类型.....)
RETURNS 返回类型
[特性]
BEGIN
  RETURN 值;
END

调用函数

函数名(参数);

修改函数

ALTER FUNCTION 函数名(参数)
RETURNS 返回类型
[特性]
BEGIN

END

参数格式

[IN | OUT| INOUT] 参数名 数据类型

比如

IN arg1 INT, OUT arg2 DATE

变量定义与赋值

声明1

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

赋值1

SET 变量名 = 值;

赋值2-多个变量赋值

注意:可以直接在存储过程之外进行声明和赋值变量

SELECT 列名, 列名 INTO @变量名, @变量名... FROM 表名;

或者

SELECT 列名, 列名 INTO 变量名,变量名,... FROM 表名;

临时变量

注意:可以直接在存储过程之外进行声明和赋值变量

定义语法:

SET @变量名 := 值;

赋值语法:

SET @变量名 := 值;

备注:

​ 必须带@符号,不论是定义还是使用,初始化必须赋值

​ 定义和赋值是一样的语法

游标定义与使用

定义游标

DECLARE 游标名
CURSOR FOR

选择语句;

打开游标

OPEN 游标名;

使用游标

FETCH 游标名 INTO 变量名,变量名,....

关闭游标

CLOSE 游标名;

条件与循环语句

IF

IF 条件
THEN 执行语句
END IF

IF-ELSE

IF 条件
THEN 执行语句
[ELSE IF 条件
THEN 执行语句]
[ELSE 执行语句]
END IF

CASE 1

CASE 表达式
  WHEN 值
THEN 执行语句
  WHEN 值
THEN 执行语句
  ...
  [ELSE 执行语句]
END CASE

CASE 2

CASE
  WHEN 条件
THEN 执行语句
  WHEN 条件
THEN 执行语句
  ...
  [ELSE 执行语句]
END CASE

LOOP

[label]: LOOP
  语句
  LEAVE label;
END LOOP [label]

LEAVE

LEAVE label;  //类似break;用于退出循环和选择
ITERATE
ITERATE label;  //类似continue;用于退出循环和选择

WHILE

[label] WHILE 条件
DO
  执行语句
END WHILE [label]

REPEAT

[label]: REPEAT
   语句
UNTIL 条件
END REPEAT [label]

定义错误捕获

语法:

DECLARE 错误名 CONDITION FOR 错误类型;

错误类型可取值:

​ 错误码

​ SQLSTATE'状态码';

备注:

​ CONDITION FOR 后面的错误码和状态码任选一个即可,注意状态码要加上SQLSTATE

定义错误处理

语法:

DECLARE 处理方式 HANDLER FOR 错误的类型 执行的SQL语句;

处理方式可取值:

CONTINUE  继续执行
EXIT    立即停止执行

错误的类型可取值:

​ 自定义的错误名

```sql
SQLSTATE '状态码'
```

​ 错误码

SQL WARNING    (01开头的全部状态码)
NOT FIND      (02开头的全部状态码)
SQLEXCEPTION   (没有被捕获的状态码)

标签:Function,语句,存储,END,自定义,游标,Produce,SQL,变量名
来源: https://www.cnblogs.com/cqpanda/p/16654202.html