mysql中的存储过程传参问题
1.无参数 call 存储过程名()
DELIMITER $ CREATE PROCEDURE select_all_data() BEGIN SELECT * FROM dog; END $ DELIMITER ; -- 2.存储过程的调用 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类型
#创建存储过程 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="女"; -- 把这个参数设置成女,传入到存储过程 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计网2 | | 10 | 小影 | 女 | 30 | 444444 | NULL | 01王贤达20计网2 | | 11 | 大梅 | 女 | 27 | 555555 | NULL | 01王贤达20计网2 | | 12 | 陈光明 | 女 | 27 | 555555 | NULL | 01王贤达20计网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:这里注意:
可以发现把这个参数设置成会话用户变量女传进去,并且我们在存储过程中对这个变量作了修改,里面是改成了性别:未知,但是出了begin and 局部变量,这个变量还是女,因为这参数设置是in型,不会返回到会话的用户变量中。
可以查询下:
mysql> SELECT @p_sex; +--------+ | @p_sex | +--------+ | 女 | +--------+ 1 row in set (0.00 sec)
3.out型
如果仅仅从mysql存储过程返回值,那就用out类型
# 创建存储过程 DELIMITER $$ CREATE PROCEDURE p_count ( OUT p_x INT) BEGIN SELECT p_x; SET p_x = 2; SELECT p_x; END $$ DELIMITER ; #调用 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 #大概意思得传参数(变量)
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:这个变量在局部变量里面并没有实际意思,只是一个变量中转站(大概这样理解,因为第一个select始终为空,不管你设置什么变量进去,有值变量也是一样)
实际应用中用的比较多的是in out 结合:
例题:用in参数empname输入员工姓名,用Out参数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;
调用:
mysql> SET @empname = 'Abel'; -- 设置用户变量并且赋值 Query OK, 0 rows affected (0.00 sec) mysql> mysql> CALL show_someone_salary2(@empname,@empsalary); -- 调用存储过程传入参数 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类型直接传入需要字段名,不用再外面设置会话用户变量,存储过程自己会接受这值作为局部变量使用,out类型的调用时一定得传@变量,因为这个存储调用完,out类型变量得输出
4.inout型
如果需要把数据传给mysql存储过程,还要经过一些计算再回传我们,此时,要使用inout类型
#创建 DELIMITER $$ CREATE PROCEDURE p_inout(INOUT s_x INT) BEGIN SELECT s_x; SET s_x=3; SELECT s_x; END $$ DELIMITER ; #调用存储过程 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
测试:虽然你调用之前把@s_x用户会话变量设置成了99,但是你传入存储过程之后set赋值了,并且inout型参数可以输出,打印出来影响用户会话变量,所以打印出依旧是3
mysql> select @s_x; +------+ | @s_x | +------+ | 3 | +------+ 1 row in set (0.00 sec) mysql>
inout 实际运用
-- 创建存储过程,查询某个员工领导的姓名,并用inout类型
-- ‘empname’输入员工姓名查询出其领导的名字
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 -- (传入一个名字)根据上级的名字查出上级的编号编号 ); END $ DELIMITER ;
调用
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); -- 调用存储
--测试
这里有一个问题,INOUT类型需要接收一个变量,而不是一个具体的数字,这样才能通过这个变量获取存储过程传递出来的值,所以需要提前定义一个变量,把这个变量传到存储过程中去。
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。
最新评论