mysql中的存儲(chǔ)過(guò)程傳參問(wèn)題
1.無(wú)參數(shù) call 存儲(chǔ)過(guò)程名()
DELIMITER $ CREATE PROCEDURE select_all_data() BEGIN SELECT * FROM dog; END $ DELIMITER ; -- 2.存儲(chǔ)過(guò)程的調(diào)用 CALL select_all_data(); /* mysql> CALL select_all_data(); +------+--------------+------+ | id | name | age | +------+--------------+------+ | 2 | 旺財(cái)小七 | 19 | +------+--------------+------+ 1 row in set (0.00 sec)
2.in類型
PS:如果僅僅想傳給mysql存儲(chǔ)過(guò)程,那就用in類型
#創(chuàng)建存儲(chǔ)過(guò)程 DELIMITER $$ CREATE PROCEDURE getUserBySex (IN p_sex VARCHAR(255)) BEGIN SELECT * FROM USER WHERE sex=p_sex; SET p_sex = '未知'; SELECT p_sex; END $$ DELIMITER; mysql> SET @p_sex="女"; -- 把這個(gè)參數(shù)設(shè)置成女,傳入到存儲(chǔ)過(guò)程 Query OK, 0 rows affected (0.00 sec) mysql> CALL getUserBySex(@p_sex); +----+-----------+------+------+----------+-------+----------------------+ | id | name | sex | age | password | phone | address | +----+-----------+------+------+----------+-------+----------------------+ | 8 | 小綠 | 女 | 34 | 222222 | NULL | 01王賢達(dá)20計(jì)網(wǎng)2 | | 10 | 小影 | 女 | 30 | 444444 | NULL | 01王賢達(dá)20計(jì)網(wǎng)2 | | 11 | 大梅 | 女 | 27 | 555555 | NULL | 01王賢達(dá)20計(jì)網(wǎng)2 | | 12 | 陳光明 | 女 | 27 | 555555 | NULL | 01王賢達(dá)20計(jì)網(wǎng)2 | +----+-----------+------+------+----------+-------+----------------------+ 4 rows in set (0.00 sec) +--------+ | p_sex | +--------+ | 未知 | +--------+ 1 row in set (0.01 sec) Query OK, 0 rows affected (0.01 sec)
ps:這里注意:
可以發(fā)現(xiàn)把這個(gè)參數(shù)設(shè)置成會(huì)話用戶變量女傳進(jìn)去,并且我們?cè)诖鎯?chǔ)過(guò)程中對(duì)這個(gè)變量作了修改,里面是改成了性別:未知,但是出了begin and 局部變量,這個(gè)變量還是女,因?yàn)檫@參數(shù)設(shè)置是in型,不會(huì)返回到會(huì)話的用戶變量中。
可以查詢下:
mysql> SELECT @p_sex; +--------+ | @p_sex | +--------+ | 女 | +--------+ 1 row in set (0.00 sec)
3.out型
如果僅僅從mysql存儲(chǔ)過(guò)程返回值,那就用out類型
# 創(chuàng)建存儲(chǔ)過(guò)程 DELIMITER $$ CREATE PROCEDURE p_count ( OUT p_x INT) BEGIN SELECT p_x; SET p_x = 2; SELECT p_x; END $$ DELIMITER ; #調(diào)用 CALL p_count(2) 錯(cuò)誤代碼: 1414 OUT or INOUT argument 1 for routine 01wangxianda.p_count is not a variable or NEW pseudo-variable in BEFORE trigger #大概意思得傳參數(shù)(變量)
set @x=1; mysql> set @x=1; Query OK, 0 rows affected (0.00 sec) mysql> call p_count(@x); +------+ | p_x | +------+ | NULL | +------+ 1 row in set (0.00 sec) +------+ | p_x | +------+ | 2 | +------+ 1 row in set (0.01 sec) Query OK, 0 rows affected (0.01 sec) mysql> select @x; +------+ | @x | +------+ | 2 | +------+ 1 row in set (0.00 sec) mysql>
mysql> call p_count (@s); +------+ | p_x | +------+ | NULL | +------+ 1 row in set (0.00 sec) +------+ | p_x | +------+ | 2 | +------+ 1 row in set (0.01 sec) Query OK, 0 rows affected (0.01 sec) mysql>
ps:這個(gè)變量在局部變量里面并沒(méi)有實(shí)際意思,只是一個(gè)變量中轉(zhuǎn)站(大概這樣理解,因?yàn)榈谝粋€(gè)select始終為空,不管你設(shè)置什么變量進(jìn)去,有值變量也是一樣)
實(shí)際應(yīng)用中用的比較多的是in out 結(jié)合:
例題:用in參數(shù)empname輸入員工姓名,用Out參數(shù)empsalary輸出員工薪資
DELIMITER // -- 這兩都是形參 empanme,empsalary CREATE PROCEDURE show_someone_salary2(IN empname VARCHAR(20), OUT empsalary DECIMAL (10,2)) BEGIN SELECT salary INTO empsalary FROM employees WHERE last_name = empname; END // DELIMITER;
調(diào)用:
mysql> SET @empname = 'Abel'; -- 設(shè)置用戶變量并且賦值 Query OK, 0 rows affected (0.00 sec) mysql> mysql> CALL show_someone_salary2(@empname,@empsalary); -- 調(diào)用存儲(chǔ)過(guò)程傳入?yún)?shù) Query OK, 1 row affected (0.00 sec) mysql> mysql> SELECT @empsalary; -- 查詢輸出變量 +------------+ | @empsalary | +------------+ | 11000.00 | +------------+ 1 row in set (0.00 sec)
mysql> CALL show_someone_salary2('Weiss',@隨便什么變量); Query OK, 1 row affected (0.00 sec) mysql> mysql> SELECT @隨便什么變量 -> ; +---------------------+ | @隨便什么變量 | +---------------------+ | 8000.00 | +---------------------+ 1 row in set (0.00 sec)
ps:也可以in類型直接傳入需要字段名,不用再外面設(shè)置會(huì)話用戶變量,存儲(chǔ)過(guò)程自己會(huì)接受這值作為局部變量使用,out類型的調(diào)用時(shí)一定得傳@變量,因?yàn)檫@個(gè)存儲(chǔ)調(diào)用完,out類型變量得輸出
4.inout型
如果需要把數(shù)據(jù)傳給mysql存儲(chǔ)過(guò)程,還要經(jīng)過(guò)一些計(jì)算再回傳我們,此時(shí),要使用inout類型
#創(chuàng)建 DELIMITER $$ CREATE PROCEDURE p_inout(INOUT s_x INT) BEGIN SELECT s_x; SET s_x=3; SELECT s_x; END $$ DELIMITER ; #調(diào)用存儲(chǔ)過(guò)程 mysql> set @s_x=99; Query OK, 0 rows affected (0.00 sec) mysql> call p_inout (@s_x); +------+ | s_x | +------+ | 99 | +------+ 1 row in set (0.00 sec) +------+ | s_x | +------+ | 3 | +------+ 1 row in set (0.00 sec) Query OK, 0 rows affected (0.00 sec)
ps:注意第一個(gè)select 是99
測(cè)試:雖然你調(diào)用之前把@s_x用戶會(huì)話變量設(shè)置成了99,但是你傳入存儲(chǔ)過(guò)程之后set賦值了,并且inout型參數(shù)可以輸出,打印出來(lái)影響用戶會(huì)話變量,所以打印出依舊是3
mysql> select @s_x; +------+ | @s_x | +------+ | 3 | +------+ 1 row in set (0.00 sec) mysql>
inout 實(shí)際運(yùn)用
-- 創(chuàng)建存儲(chǔ)過(guò)程,查詢某個(gè)員工領(lǐng)導(dǎo)的姓名,并用inout類型
-- ‘empname’輸入員工姓名查詢出其領(lǐng)導(dǎo)的名字
DELIMITER $ CREATE PROCEDURE show_mgr_name(INOUT empname VARCHAR(25)) BEGIN SELECT manager_id,last_name -- 上級(jí)的id FROM employees WHERE employee_id = ( -- 過(guò)濾的條件 上級(jí)的編號(hào) == 查出來(lái)的編號(hào) SELECT manager_id FROM employees WHERE last_name = empname -- (傳入一個(gè)名字)根據(jù)上級(jí)的名字查出上級(jí)的編號(hào)編號(hào) ); END $ DELIMITER ;
調(diào)用
mysql> SET @empname := 'Abel'; -- 傳入名字變量 Query OK, 0 rows affected (0.00 sec) mysql> mysql> mysql> SELECT @empname; -- 查詢這個(gè)變量 +----------+ | @empname | +----------+ | Abel | +----------+ 1 row in set (0.00 sec) mysql> mysql> mysql> CALL show_mgr_name(@empname); -- 調(diào)用存儲(chǔ)
--測(cè)試
這里有一個(gè)問(wèn)題,INOUT類型需要接收一個(gè)變量,而不是一個(gè)具體的數(shù)字,這樣才能通過(guò)這個(gè)變量獲取存儲(chǔ)過(guò)程傳遞出來(lái)的值,所以需要提前定義一個(gè)變量,把這個(gè)變量傳到存儲(chǔ)過(guò)程中去。
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
- MySQL通過(guò)存儲(chǔ)過(guò)程來(lái)添加和刪除分區(qū)的過(guò)程(List分區(qū))
- mysql存儲(chǔ)過(guò)程游標(biāo)之loop循環(huán)解讀
- mysql存儲(chǔ)過(guò)程多層游標(biāo)循環(huán)嵌套的寫法分享
- mysql數(shù)據(jù)庫(kù)存儲(chǔ)過(guò)程之游標(biāo)(光標(biāo)cursor)詳解
- MySQL存儲(chǔ)過(guò)程中變量的定義以及應(yīng)用詳解
- 關(guān)于MySQL的存儲(chǔ)過(guò)程與存儲(chǔ)函數(shù)
- mysql如何在存儲(chǔ)過(guò)程中輸出日志信息
相關(guān)文章
淺談Mysql使用B+樹(shù)來(lái)實(shí)現(xiàn)索引的原因
這篇文章,主要來(lái)探討一下為什么Mysql使用B+樹(shù)來(lái)實(shí)現(xiàn)索引,這里討論的目標(biāo)是Mysql的InnoDB存儲(chǔ)引擎.可以想象一下,如果你是Mysql的開(kāi)發(fā)人員,你會(huì)怎么去選擇合適的數(shù)據(jù)結(jié)構(gòu)呢,感興趣的小伙伴跟著小編一起來(lái)探討吧2023-05-05MySQL日期函數(shù)與時(shí)間函數(shù)匯總(MySQL 5.X)
這篇文章主要給大家介紹了關(guān)于MySQL 5.X日期函數(shù)與時(shí)間函數(shù)的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-12-12Mysql5.7中使用group concat函數(shù)數(shù)據(jù)被截?cái)嗟膯?wèn)題完美解決方法
前幾天在項(xiàng)目中遇到一個(gè)問(wèn)題,使用 GROUP_CONCAT 函數(shù)select出來(lái)的數(shù)據(jù)被截?cái)嗔?,最長(zhǎng)長(zhǎng)度不超過(guò)1024字節(jié),開(kāi)始還以為是navicat客戶端自身對(duì)字段長(zhǎng)度做了限制的問(wèn)題。后來(lái)查找出原因,解決方法大家跟隨腳本之家小編一起看看吧2018-03-03MySQL學(xué)習(xí)筆記之?dāng)?shù)據(jù)的增、刪、改實(shí)現(xiàn)方法
這篇文章主要介紹了MySQL學(xué)習(xí)筆記之?dāng)?shù)據(jù)的增、刪、改實(shí)現(xiàn)方法,簡(jiǎn)單介紹了mysql實(shí)現(xiàn)數(shù)據(jù)的增、刪、改相關(guān)語(yǔ)法與使用技巧,需要的朋友可以參考下2016-09-09IDEA的database插件無(wú)法連接mysql的解決辦法(08001錯(cuò)誤)
用navicat鏈接數(shù)據(jù)庫(kù)正常,mysql控制臺(tái)操作正常,但是用IDEA的數(shù)據(jù)庫(kù)插件鏈接一直報(bào) 08001 錯(cuò)誤,本文就給大家介紹一下IDEA的database插件無(wú)法連接mysql報(bào)08001錯(cuò)誤的解決辦法,需要的朋友可以參考下2024-07-07