mysql中的存儲過程傳參問題
1.無參數(shù) call 存儲過程名()
DELIMITER $ CREATE PROCEDURE select_all_data() BEGIN SELECT * FROM dog; END $ DELIMITER ; -- 2.存儲過程的調(diào)用 CALL select_all_data(); /* mysql> CALL select_all_data(); +------+--------------+------+ | id | name | age | +------+--------------+------+ | 2 | 旺財小七 | 19 | +------+--------------+------+ 1 row in set (0.00 sec)
2.in類型
PS:如果僅僅想傳給mysql存儲過程,那就用in類型
#創(chuàng)建存儲過程 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="女"; -- 把這個參數(shù)設(shè)置成女,傳入到存儲過程 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王賢達20計網(wǎng)2 | | 10 | 小影 | 女 | 30 | 444444 | NULL | 01王賢達20計網(wǎng)2 | | 11 | 大梅 | 女 | 27 | 555555 | NULL | 01王賢達20計網(wǎng)2 | | 12 | 陳光明 | 女 | 27 | 555555 | NULL | 01王賢達20計網(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)把這個參數(shù)設(shè)置成會話用戶變量女傳進去,并且我們在存儲過程中對這個變量作了修改,里面是改成了性別:未知,但是出了begin and 局部變量,這個變量還是女,因為這參數(shù)設(shè)置是in型,不會返回到會話的用戶變量中。
可以查詢下:
mysql> SELECT @p_sex; +--------+ | @p_sex | +--------+ | 女 | +--------+ 1 row in set (0.00 sec)
3.out型
如果僅僅從mysql存儲過程返回值,那就用out類型
# 創(chuàng)建存儲過程 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) 錯誤代碼: 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:這個變量在局部變量里面并沒有實際意思,只是一個變量中轉(zhuǎn)站(大概這樣理解,因為第一個select始終為空,不管你設(shè)置什么變量進去,有值變量也是一樣)
實際應用中用的比較多的是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)用存儲過程傳入?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è)置會話用戶變量,存儲過程自己會接受這值作為局部變量使用,out類型的調(diào)用時一定得傳@變量,因為這個存儲調(diào)用完,out類型變量得輸出
4.inout型
如果需要把數(shù)據(jù)傳給mysql存儲過程,還要經(jīng)過一些計算再回傳我們,此時,要使用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)用存儲過程 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:注意第一個select 是99
測試:雖然你調(diào)用之前把@s_x用戶會話變量設(shè)置成了99,但是你傳入存儲過程之后set賦值了,并且inout型參數(shù)可以輸出,打印出來影響用戶會話變量,所以打印出依舊是3
mysql> select @s_x; +------+ | @s_x | +------+ | 3 | +------+ 1 row in set (0.00 sec) mysql>
inout 實際運用
-- 創(chuàng)建存儲過程,查詢某個員工領(lǐng)導的姓名,并用inout類型
-- ‘empname’輸入員工姓名查詢出其領(lǐng)導的名字
DELIMITER $ CREATE PROCEDURE show_mgr_name(INOUT empname VARCHAR(25)) BEGIN SELECT manager_id,last_name -- 上級的id FROM employees WHERE employee_id = ( -- 過濾的條件 上級的編號 == 查出來的編號 SELECT manager_id FROM employees WHERE last_name = empname -- (傳入一個名字)根據(jù)上級的名字查出上級的編號編號 ); END $ DELIMITER ;
調(diào)用
mysql> SET @empname := 'Abel'; -- 傳入名字變量 Query OK, 0 rows affected (0.00 sec) mysql> mysql> mysql> SELECT @empname; -- 查詢這個變量 +----------+ | @empname | +----------+ | Abel | +----------+ 1 row in set (0.00 sec) mysql> mysql> mysql> CALL show_mgr_name(@empname); -- 調(diào)用存儲
--測試
這里有一個問題,INOUT類型需要接收一個變量,而不是一個具體的數(shù)字,這樣才能通過這個變量獲取存儲過程傳遞出來的值,所以需要提前定義一個變量,把這個變量傳到存儲過程中去。
總結(jié)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
MySQL日期函數(shù)與時間函數(shù)匯總(MySQL 5.X)
這篇文章主要給大家介紹了關(guān)于MySQL 5.X日期函數(shù)與時間函數(shù)的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2020-12-12Mysql5.7中使用group concat函數(shù)數(shù)據(jù)被截斷的問題完美解決方法
前幾天在項目中遇到一個問題,使用 GROUP_CONCAT 函數(shù)select出來的數(shù)據(jù)被截斷了,最長長度不超過1024字節(jié),開始還以為是navicat客戶端自身對字段長度做了限制的問題。后來查找出原因,解決方法大家跟隨腳本之家小編一起看看吧2018-03-03MySQL學習筆記之數(shù)據(jù)的增、刪、改實現(xiàn)方法
這篇文章主要介紹了MySQL學習筆記之數(shù)據(jù)的增、刪、改實現(xiàn)方法,簡單介紹了mysql實現(xiàn)數(shù)據(jù)的增、刪、改相關(guān)語法與使用技巧,需要的朋友可以參考下2016-09-09IDEA的database插件無法連接mysql的解決辦法(08001錯誤)
用navicat鏈接數(shù)據(jù)庫正常,mysql控制臺操作正常,但是用IDEA的數(shù)據(jù)庫插件鏈接一直報 08001 錯誤,本文就給大家介紹一下IDEA的database插件無法連接mysql報08001錯誤的解決辦法,需要的朋友可以參考下2024-07-07