```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索引
- 副本集
- 聚焦分析
- 事務管理
- 寫關注
- 讀關注