MySQL储存过程详解

本文详细介绍了MySQL的存储过程,包括概述、特点、创建及修改案例、参数、流控制语句、游标等内容,强调了存储过程在简化开发、提高安全性、减少数据传输方面的作用,并探讨了存储过程的访问控制和权限管理。
摘要由CSDN通过智能技术生成

1 概述

存储过程就像是程序中的子程序,存储在数据库中。存储过程可以有名称、参数列表和 SQL 语句。使用 CALL 语句调用。

2 特点

  • 运行速度快。利用缓存的优势等。
  • 可移植的

好处:

  • 简化应用开发人员的工作。
  • 增强安全性。
  • 减少数据在数据库和应用服务器之间的传输。

3 案例

实际运行创建一个存储存储过程

DELIMITER;;
CREATE DEFINER=`root`@`localhost` PROCEDURE `selectitem`()
BEGIN
	#Routine body goes here...
SELECT * from sys_role;
END;;
DELIMITER;

说明:

分为几部分:
DELIMITER 设置结束符,设置;;的原因是避免使用;时会直接导致创建存储过程中出现;时会结束。
create 创建
DEFINER=`root`@`localhost` 声明定义者
PROCEDURE 存储过程关键字
`selectitem`() 存储过程名称

-- 执行的逻辑体
BEGIN
	#Routine body goes here...
SELECT * from sys_role;
END

调用存储过程,使用call命令

call selectitem`

4 特征子句(了解)

在创建一个存储过程时可以添加对这个过程的特征,称为特征子句。有以下特征

  • COMMENT

它用于描述存储的例程

  • LANGUAGE SQL

表明储存过程使用SQL编写

  • NOT DETERMINISTIC

不确定性,相同的输入参数产生不同结果

  • CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA

CONTAINS SQL:包含 SQL (默认值)

NO SQL:不包含 SQL 语句

READS SQL DATA:含读取数据的语句,不含写入数据的语句

MODIFIES SQL DATA:包含写入数据的语句

  • SQL SECURITY { DEFINER | INVOKER }

指定安全上下文,默认值是 DEFINER,就是执行该储存过程的方式。

如果是DEFINER ,执行存储过程前验证definer对应的用户是否存在,是否拥有执行权限。

如果是INVOKER ,执行存储过程前验证调用该储存过程的用户是否有对应权限。

4.1举例

CREATE PROCEDURE p2 ()
    LANGUAGE SQL
    NOT DETERMINISTIC
    SQL SECURITY DEFINER
    COMMENT ''
    SELECT * FROM student; 

5 复合语句

复合语句是一个包含执行块,变量,条件等的处理程序。

5.6版本开始Mysql有以下复合语句:

  • BEGIN … END

  • Statement Label 陈述标签

  • DECLARE 声明

  • Variables in Stored Programs 存储程序中的变量

  • Flow Control Statements 流程控制声明

  • Cursors 游标

  • Condition Handling 状况处理

5.1 BEGIN … END

BEGIN … END是很常用的语句块,通常代表的是一个操作域。用于编写复合语句。

CREATE DEFINER=`root`@`localhost` PROCEDURE `userpre`()
 COMMENT '测试存储过程'
BEGIN
	#Routine body goes here...
	SELECT * from user;
END

在一个BEGIN … END块内的局部变量与其他BEGIN … END块的局部变量不共享

5.2 DECLARE

DECLARE 能够用于在存储过程中声明变量。 需要在BEGIN… END 复合语句中使用。在使用前先声明。

CREATE DEFINER=`root`@`localhost` PROCEDURE `user_test_pre`()
    COMMENT '测试存储过程'
BEGIN
	-- 局部变量
	DECLARE fr int;
	#Routine body goes here...
	SELECT * from user;
END

局部变量,只在声明它们的 BEGIN END 块中有效。

CREATE DEFINER=`root`@`localhost` PROCEDURE `user_test_pre`()
    COMMENT '测试存储过程'
BEGIN
	DECLARE fr int;
	set fr = 6 + 2;
	SELECT fr;
END

image-20211214113631700

6 用户变量

除了有局部变量,还有用户变量,定义使用@变量名。一个客户端定义的变量不能被其它客户端看到或使用。当客户端退出时,该客户端连接的所有变量将自动释放。

CREATE DEFINER=`root`@`localhost` PROCEDURE `user_test_pre`(
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值