Mysql基础篇(7)—— 存储过程和存储函数
admin
2024-05-13 01:32:27
0

存储过程

含义

Store Procedure,是一组经过预先编译的SQL语句的封装。

执行过程

存储过程预先存储在 MySQL 服务器上,需要执行的时候,客户端只需要向服务器端发出调用存储过程的命令,服务器端就可以把预先存储好的这一系列 SQL 语句全部执行。

好处

  • 简化操作,提高了sql语句的重用性,减少了开发程序员的压力
  • 一次编译,多次使用。
  • 减少网络传输量(客户端不需要把所有的 SQL 语句通过网络发给服务器)
  • 减少了 SQL 语句暴露在网上的风险,也提高了数据查询的安全性

缺点

  • 可移植性差:不能跨数据库存储
  • 调试困难
  • 不适合高并发的场景

分类

存储过程的参数类型可以是IN(入参)、OUT(出参)和INOUT(出入参)

  • 没有参数(无参数无返回)
  • 仅仅带 IN 类型(有参数无返回)
  • 仅仅带 OUT 类型(无参数有返回)
  • 既带 IN 又带 OUT(有参数有返回)
  • 带 INOUT(有参数有返回)

创建存储过程

DELIMITER //
CREATE PROCEDURE 存储过程名(IN id int, OUT name VARCHAR(50), INOUT age int)
[characteristics]
BEGINSELECT emp_name into name, emp_age into age FROM t1 where emp_id = id and emp_age = age;
END //
DELIMITER;

DELIMITER结束表记,因为存储过程提里面的sql结束标记;和存储过程结束符;会有冲突,所以会重新定义存储过程的结束标记;

characteristics表示约束条件,取值信息如下:

LANGUAGE SQL
| [NOT] DETERMINISTIC
| { CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA }
| SQL SECURITY { DEFINER | INVOKER }
| COMMENT 'string
  • LANGUAGE SQL:说明存储过程执行体是由SQL语句组成的,当前系统支持的语言为SQL。

  • [NOT] DETERMINISTIC: 指明存储过程执行的结果是否确定。DETERMINISTIC表示结果是确定的。每次执行存储过程时,相同的输入会得到相同的输出。NOT DETERMINISTIC表示结果是不确定的,相同的输入可能得到不同的输出。如果没有指定任意一个值,默认为NOT DETERMINISTIC。

  • { CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA } :指明子程序使用SQL语句的限制。

    • CONTAINS SQL表示当前存储过程的子程序包含SQL语句,但是并不包含读写数据的SQL语句
    • NO SQL表示当前存储过程的子程序中不包含任何SQL语句
    • READS SQL DATA表示当前存储过程的子程序中包含读数据的SQL语句
    • MODIFIES SQL DATA表示当前存储过程的子程序中包含写数据的SQL语句
    • 默认情况下,系统会指定为CONTAINS SQL
  • SQL SECURITY { DEFINER | INVOKER }:执行当前存储过程的权限,即指明哪些用户能够执行当前存储过程。

    • DEFINER 表示只有当前存储过程的创建者或者定义者才能执行当前存储过程
    • INVOKER 表示拥有当前存储过程的访问权限的用户能够执行当前存储过程
  • COMMENT: "string"注释信息

调用存储过程

CALL 存储过程名(实参列表)

格式

in模式
CALL p1(10);
out模式
SET @name;
CALL P1(@name);
SELECT @name;
inout模式
SET @name;
CALL P1(@name);
SELECT @name;

存储函数

和之前学过的单行函数、聚合函数是一个意思

创建函数

DELIMITER //
CREATE FUNCTION 函数名(参数名 参数类型, ...)
RETURNS 返回值类型
[characteristics ...]
BEGIN带有RETURN的函数体
END //

调用存储函数

SELECT 函数名(实体列表)

### 举例

DELIMITER //
CREATE FUNCTION name_by_id(id int)
returns varchar(50)
DETERMINISTIC
CONTAINS SQL
BEGINRETURN (SELECT name FROM user where id = id);
END //
DELIMITER ;
注意

若在创建存储函数中报错you might want to use the less safelog_bin_trust_function_creators variable,有两种处理方法:

  • 加上必要的函数特性[NOT] DETERMINISTIC{CONTAINS SQL | NO SQL | READS SQL DATA |MODIFIES SQL DATA}
  • 执行SET GLOBAL log_bin_trust_function_creators = 1

存储函数和存储过程

关键字调用语法返回值应用场景
存储过程PROCEDURECALL 存储过程名()可以当成0个或者多个一般用于更新
存储函数FUNCTIONSELECT 函数()只能是一个一般用于查询且结果为一个值并返回时

查看存储过程或存储函数

show create {procedure | function} 存储过程名或者函数名

查看存储函数或存储过程的信息

SHOW {PROCEDURE | FUNCTION} STATUS [LIKE 'pattern'];
SELECT * FROM information_schema.Routines 
WHERE ROUTINE_NAME='存储过程名或者函数的名'
[AND ROUTINE_TYPE = {'PROCEDURE|FUNCTION'}];

修改存储函数或者存储过程

只能修改characteristics部分

ALTER {PROCEDURE | FUNCTION} 存储过程或函数的名 [characteristic ...];

删除存储过程或者存储函数

DROP {PROCEDURE | FUNCTION} 存储过程名或者函数名

相关内容

热门资讯

欧佩克+同意5月增产20.6万... 4月5日消息,欧佩克+同意5月增产20.6万桶/日。
4月5日新闻联播速览19条 4月5日消息,今天《新闻联播》的主要内容有:1.【新思想引领新征程】清明祭英烈 奋进新征程;2.春和...
特朗普称被击落战机的第二名机组... 4月5日消息,美国总统特朗普5日在社交媒体上发文,披露在伊朗被击落的F-15E战斗机上的第二名机组人...
应政府要求,美企暂缓发布冲突地... 4月5日消息,据美国方面消息,美国卫星影像供应商行星实验室公司4日表示,应美国政府要求,该公司将无限...
意大利多座机场限量供应航空燃油 4月5日消息,受中东局势影响,意大利部分机场近日已开始实施燃油供应限制措施。据意大利媒体报道,全球主...
本周新增银河航天、沃飞长空等7... 4月5日消息,证监会网站披露信息显示,本周(3月30日至4月5日)共新增上市辅导备案企业7家,分别为...
伊朗外长就美以袭击伊核设施致信... 4月5日消息,伊朗外交部长阿拉格齐当地时间5日致信联合国,就美国和以色列针对伊朗和平且受监督(受国际...
4月4日,全社会跨区域人员流动... 4月5日消息,交通运输部消息,2026年4月4日,全社会跨区域人员流动量30028.5万人次,环比增...
富士康:3月营收8037.4亿... 4月5日消息,富士康3月营收8037.4亿新台币,同比增长45.6%,一季度营收同比增长29.7%。...
美国卫星影像供应商暂缓发布中东... 4月5日消息,美国媒体4日报道,美国卫星影像供应商行星实验室公司当天表示,应美国政府要求,该公司将无...