前言
Github:https://github.com/yihonglei/road-of-arch/tree/master/thinking-in-mysql
概述
MySql 存儲過程參數有 IN、OUT、INOUT 三種模式。
一 執行個體準備條件
建立表:
CREATE TABLE `t_user_main` (
`f_userId` int(10) NOT NULL AUTO_INCREMENT COMMENT '使用者id,作為主鍵',
`f_userName` varchar(5) DEFAULT NULL COMMENT '使用者名',
`f_age` int(3) DEFAULT NULL COMMENT '年齡',
PRIMARY KEY (`f_userId`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
插入資料:
INSERT INTO t_user_main (f_userName, f_age)
VALUES('one',24),('two',25),('three',26),('four',27),('five',28),('six',29);
二 IN 模式 : 參數輸入模式
DELIMITER $$ # 定界符
CREATE PROCEDURE user_main_pro1(IN v_id INT)
BEGIN
#定義變量
DECLARE v_userName VARCHAR(50);
#通過select...into...給變量指派
SELECT f_userName INTO v_userName FROM t_user_main WHERE f_userId = v_id;
#執行DDL語句
INSERT INTO t_user_main (f_userName) VALUES (v_userName);
END $$ #存儲過程建立結束
DELIMITER; #恢複mysql分号定界符
調用:
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiIyVGduV2QvwVe0lmdhJ3ZvwFM38CXlZHbvN3cpR2Lc1TPB10QGtWUCpEMJ9CXsxWam9CXwADNvwVZ6l2c052bm9CXUJDT1wkNhVzLcRnbvZ2LcZXUYpVd1kmYr50MZV3YyI2cKJDT29GRjBjUIF2LcRHelR3LcJzLctmch1mclRXY39DOwAzNzEjMwEDNygDM2EDMy8CX0Vmbu4GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.jpg)
三 OUT 模式 : 參數輸出模式
DELIMITER $$
CREATE PROCEDURE user_main_pro2(OUT v_count INT)
BEGIN
SELECT COUNT(*) INTO v_count FROM t_user_main;
END $$
DELIMITER
調用:
定義存儲過程 user_main_pro2 用于計算 t_user_main 表的使用者總數,處理完後通過參數 out 模式傳回處理結果,
指令視窗通過 set @v_count = 1; 定義變量并初始化,通過定義的變量去接受存儲過程處理完成 out 輸出的結果,
最後通過 select @v_count 檢視接受後的變量值,也即是存儲過程處理完成的結果。
四 INOUT 模式 : 作為輸入和輸出模式
DELIMITER $$
CREATE PROCEDURE user_main_pro3(INOUT v_id INT)
BEGIN
# 定義變量
DECLARE v_count INT(11);
# 判斷
IF v_id > 3 THEN
SET v_count = 100;
ELSE
SET v_count = 500;
END IF;
# 傳回指派
SET v_id = v_count;
END $$
DELIMITER;
調用:
建立存儲過程 user_main_pro3,參數模式為 INOUT 模式,該模式參數既作為輸入,也可作為輸出。
定義一個變量 set @v_id=1,通過call user_main_pro3(@v_id)調用存儲過程,
将參數 @v_id 輸入後滿足判斷的 else,存儲過程處理結果為 500,同時也通過
變量 @v_id 接受存儲過程處理的結果。
是以,INOUT 模式參數 v_id 既可以作為輸入,也可以作為輸出。