mysql中的存储过程传参问题

 更新时间:2023年10月12日 08:57:37   作者:IT_CODE.  
这篇文章主要介绍了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类型需要接收一个变量,而不是一个具体的数字,这样才能通过这个变量获取存储过程传递出来的值,所以需要提前定义一个变量,把这个变量传到存储过程中去。

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • MySQL连接中断问题分析与解决方案

    MySQL连接中断问题分析与解决方案

    在开发和维护Web应用时,数据库连接问题是一个常见的挑战,本文基于一个真实的错误案例(pymysql.err.OperationalError: (2013, 'Lost connection to MySQL server during query')),分析其根本原因,并提供多种解决方案,帮助开发者优化MySQL连接稳定性
    2025-05-05
  • 浅析MySQL如何实现百万级数据的高效查询

    浅析MySQL如何实现百万级数据的高效查询

    在当下的数据库技术背景下,处理 MySQL 百万级数据的查询需要综合考虑数据库设计、查询优化、硬件配置和高级技术,下面我们就来看看具体的实现方案吧
    2025-07-07
  • MySQL 快速删除大量数据(千万级别)的几种实践方案详解

    MySQL 快速删除大量数据(千万级别)的几种实践方案详解

    这篇文章主要介绍了MySQL 快速删除大量数据(千万级别)的几种实践方案详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-07-07
  • Mysql varchar大小长度问题介绍

    Mysql varchar大小长度问题介绍

    如果被 varchar 超过上述的 b 规则,被强转成 text 类型,则每个字段占用定义长度为 11 字节,当然这已经不是 varchar 了
    2011-10-10
  • mysql在update,非主键索引更新引起死锁问题

    mysql在update,非主键索引更新引起死锁问题

    这篇文章主要介绍了mysql在update,非主键索引更新引起死锁问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-08-08
  • MySQL创建数据库和创建数据表的操作过程

    MySQL创建数据库和创建数据表的操作过程

    MySQL 是最常用的数据库,在数据库操作中,基本都是增删改查操作,简称CRUD,这篇文章主要介绍了MySQL创建数据库和创建数据表的操作过程,需要的朋友可以参考下
    2022-11-11
  • 一文彻底吃透MySQL DDL操作之数据库、数据表、字段全解析

    一文彻底吃透MySQL DDL操作之数据库、数据表、字段全解析

    DDL是SQL中的一个重要部分,主要用于定义和管理数据库的结构、表、索引和其他数据库对象,这篇文章主要介绍了MySQL DDL操作之数据库、数据表、字段的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2026-05-05
  • MySQL8.4设置密码规则为mysql_native_password问题

    MySQL8.4设置密码规则为mysql_native_password问题

    这篇文章主要介绍了MySQL8.4设置密码规则为mysql_native_password问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-08-08
  • 自学MySql内置函数知识点总结

    自学MySql内置函数知识点总结

    在本篇文章里小编给大家整理的是关于MySql内置函数的知识点总结内容,需要的朋友们可以学习参考下。
    2020-01-01
  • MySQL数据库的高可用方案总结

    MySQL数据库的高可用方案总结

    这篇文章主要针对MySQL数据库的高可用方案进行详细总结,高可用架构对于互联网服务基本是标,本文是对各种方案的总结,感兴趣的小伙伴们可以参考一下
    2016-05-05

最新评论