```sql
# 定义存储过程的语法
CREATE PROCEDURE process_name(params_list)
[COMMENT 'string']
[LANGUAGE SQL]
[DETERMINISTIC | NOT DETERMINISTIC]
[CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA]
[SQL SECURITY {DEFINER | INVOKER}]
BEGIN
-- 业务逻辑代码,
-- 如果这里只有一条SQL语句,则可以省略BEGIN与END
END;
- process_name:自定义的存储过程名称,建议避免与MySQL中的函数重名
- params_list:参数列表,参数之间用 , 隔开
- 一个参数由三部分组成:【参数模式 参数名 参数类型】,如 in params varchar(255)
- 参数名:建议不要与表中的列名同名
- 参数模式:
- in:该参数可以作为输入,也就是该参数需要调用方传入值
- out:该参数可以作为输出,也就是该参数可以作为返回值
- inout:该参数既可以作为输入又可以作为输出,
也就是该参数既需要传入值,又可以返回值
- 参数类型:如varchar(255) 长度可省略
- COMMENT'string':用于对存储过程的描述,其中string为描述内容,comment为关键字
- LANGUAGE SQL:指明编写这个存储过程的语言为SQL语言
- DETERMINISTIC:表示存储过程对同样的输入参数产生相同的结果
- NOT DETERMINISTIC:表示存储过程对同样的输入参数产生不相同的结果(默认)
- CONTAINS SQL:表示存储过程包含读或写数据的SQL语句(默认)
- NO SQL:表示存储过程不包含任何SQL语句
- READS SQL DATA:表示存储过程只包含读数据的SQL语句
- MODIFIES SQL DATA:表示存储过程只包含写数据的SQL语句
- SQL SECURITY:表示存储过程的调用是用存储过程的定义者的许可(definer,默认)来执行,
还是用调用者的许可(invoker)来执行
```
```sql
# 案例演示准备数据
drop table if exists `user`;
create table `user`(
`id` int(11) primary key not null auto_increment,
`username` varchar(255) not null,
`password` varchar(255) not null
)engine=INNODB default charset=utf8;
insert into `user`(`id`, `username`, `password`) values(1, '张三', 'zhangsan');
insert into `user`(`id`, `username`, `password`) values(2, '李四', 'lisi');
```
**演示1:向表插入一条数据**
```sql
--结束符号默认为 ; ,存储过程内使用 ; 结束一个语句
--在命令行模式下,为了便于区分可以自定义一个结束符号 $
delimiter $
create procedure proce_user01()
begin
insert into user(`id`,`username`, `password`) values(3, '王五', 'wangwu');
end $
# 调用存储过程
mysql> call proce_user01() $
mysql> select * from user $
+----+----------+----------+
| id | username | password |
+----+----------+----------+
| 1 | 张三 | zhangsan |
| 2 | 李四 | lisi |
| 3 | 王五 | wangwu |
+----+----------+----------+
```
**演示2:`in`与`out`参数模式**
```sql
# 定义存储过程
delimiter $
create procedure
proce_user02(in inValue varchar(255), out outValue varchar(255))
begin
select username into outValue from user where password=inValue;
end $
# 调用存储过程
call proce_user02('zhangsan', @outVal) $
mysql> select @outval $
+---------+
| @outval |
+---------+
| 张三 |
+---------+
```
**演示3:`inout`参数**
```sql
# 定义存储过程
delimiter $
create procedure
proce_user03(inout ioValue varchar(255))
begin
-- 声明局部变量 tempVal
declare tempVal varchar(255) default null;
set tempVal = ioValue;
set ioValue = 'newIoValue';
select tempVal;
end $
# 调用存储过程
set @ioVal = 'oldIoValue' $
mysql> call proce_user03(@ioVal) $
+------------+
| tempVal |
+------------+
| oldIoValue |
+------------+
mysql> select @ioVal $
+------------+
| @ioVal |
+------------+
| newIoValue |
+------------+
```
**演示4:登录验证**
```sql
# 定义存储过程
create procedure
proce_login_user(in uname varchar(255), in pass varchar(255), out result int)
begin
select count(1) into result from `user` where password=pass and username=uname;
end $
# 调用存储过程
set @uname='王五' $
set @pass='wangwu' $
call proce_login_user(@uname, @pass, @result) $
mysql> select @result $
+---------+
| @result |
+---------+
| 1 |
+---------+
```
- MySQL
- MySQL是什么
- MySQL环境搭建
- centos7-MySQL8
- windows-MySQL8
- 数据库软件
- sqlyog软件安装
- navicat软件安装
- powerDesigner软件安装
- RDBMS术语
- SQL语句组成
- 数据库系统组成
- 数据库操作
- 数据表操作
- 查询语句
- 基本语法
- 子查询
- 表连接
- 查询语句执行顺序
- 事务
- 事务是什么
- 事务的作用
- 事务的4个特性
- 事务隔离级别
- 事务的实现
- 索引
- 索引的作用
- 索引操作
- 存储引擎
- 备份与恢复
- 视图
- 视图是什么
- 视图的作用
- 创建视图
- 查看视图
- 更改视图
- DML操作视图
- 删除视图
- 存储过程与函数
- 过程与函数是什么
- 存储过程操作
- 定义存储过程
- 调用存储过程
- 查看存储过程
- 删除存储过程
- 修改存储过程
- 函数操作
- 过程与函数区别
- 流程控制
- if语句
- case语句
- while循环语句
- repeat循环语句
- loop循环语句
- 变量
- 处理程序
- 光标
- Redis
- 简介
- 下载与安装
- 命令操作redis数据库
- 通用命令
- 数据操作
- 持久化
- Windows上的持久化操作
- 数据库设计
- 数据库设计过程
- ER模型图
- MongoDB
- MongoDB是什么?
- MongoDB特性
- MongoDB 数据模型
- 安装MongoDB
- MongoDB认证
- Database操作
- Collection操作
- Document操作
- 插入
- 查询
- 更新
- 删除
- buckWrite
- MongoDB索引
- 副本集
- 聚焦分析
- 事务管理
- 写关注
- 读关注