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))
BEGINSELECT *  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)BEGINSELECT  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  empsalaryFROM  employeesWHERE  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    -- 上级的idFROM  employeesWHERE employee_id = (    -- 过滤的条件   上级的编号 ==    查出来的编号SELECT manager_id FROM employeesWHERE 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存储过程传参问题相关推荐

  1. MySQL 存储过程传参之in, out, inout 参数用法

    存储过程传参:存储过程的括号里,可以声明参数. 语法是 create procedure p([in/out/inout] 参数名  参数类型 ..) in :给参数传入值,定义的参数就得到了值 ou ...

  2. DM8 jdbc调用存储过程传参list<实体类>

    DM8 jdbc调用存储过程传参list<实体类> 一.前提 jdbc的连接串参数prepareOptimize,表示是否对预编译SQL做优化,取值true/false,默认false不开 ...

  3. mysql存储过程出参和入参_数据库mysql存储中的入参出参理解

    在使用语句的时候,不可避免的要考虑参数的问题,而参数又是用来辅助变量的.有些小伙伴看到我们标题中的入参形参不知道是什么意思,其实也不难理解.我们把出参和入参看成输入和输出的意思就可以了.想必这样说大家 ...

  4. Flask mysql 模版传参_Flask渲染Jinja2模板和传参

    ### Flask渲染Jinja2模板和传参: 1. 如何渲染模板: * 模板放在`templates`文件夹下 * 从`flask`中导入`render_template`函数. * 在视图函数中, ...

  5. mysql 批处理文件传参_如何实现批处理文件传参数给SQLPLUS

    第一:批处理文件drop_table.bat 说明: 批处理中 %~dp0  表示批处理文件所处的当前目录 '%p_owner%' '%p_path%' 是批处理传给SQLPLUS的参数 @echo ...

  6. mysql动态传参实例

    SET @salesman_name ='陈奕迅'; -- SELECT * FROM `ls_customer` WHERE relename =@salesman_name; -- SELECT ...

  7. mysql 存储过程执行慢_MySQL存储过程因为字符集不同导致执行慢

    业务反馈线上一个存储过程执行很慢,导致业务超时较多,而存储过程比较简单,就是一个简单的判断逻辑然后delete一条记录,而且delete语句是有索引的. 表结构如下: CREATE TABLE `ta ...

  8. MySQL 6:MySQL存储过程、存储函数

    MySQL 5.0 版本开始支持存储过程.存储过程是一组SQL语句,功能强大,可以实现一些复杂的逻辑功能,类似于JAVA语言中的方法:存储是数据库SQL语言层面的代码封装和复用. 存储过程有输入输出参 ...

  9. MySQL存储过程的使用

    存储过程和函数是数据库中的一段SQL语句的集合. studentinfo表数据: 存储过程的创建与调用 语法: # 创建存储过程 DELIMITER $ # 修改分隔符 CREATE PROCEDUR ...

最新文章

  1. 简单快速修改大量重复代码(Intellij IDEA)
  2. Academic English Reading Notes
  3. android游戏开发框架libgdx的使用(完)—杂谈Libgdx
  4. android 时间差 秒_Android进阶之使用时间戳计算时间差
  5. 数据结构实验之栈七:出栈序列判定
  6. JAVA分布式篇3——Dubbo
  7. [Python] L1-028. 判断素数-PAT团体程序设计天梯赛GPLT
  8. 80. 删除排序数组中的重复项 II
  9. 公司年会要求搞一个抽奖程序,及时安排一波
  10. C#+access做注册、登陆界面 【实测成功】
  11. mw150r 虚拟服务器,水星MW150R V1.3路由器刷DD-WRT使用WIWIZ或wifiap做web认证登录
  12. 工商数据返回:“企业不存在或企业信息未更新”,法定代表人验证失败的解决方法
  13. 【lc3】汇编实现I/O中断
  14. python图形分析_使用Python图形化分析大Log文件
  15. 老A:什么是抖音弹幕互动游戏,玩法以及如何参与
  16. cv2.putText()函数中各个参数含义
  17. MTL文件的参数含义
  18. 深度解析:大数据面前,统计学的价值在哪里?
  19. Android 虹软人脸识别获取数据的方法
  20. 最大计算机互联网络是,目前世界上最大的计算机互联网络是什么?

热门文章

  1. FEC计算机,符号网络聚类算法FEC的改进
  2. 2022安全员-C证操作证考试题库及在线模拟考试
  3. Django 前后端分离(REST Framework)
  4. 转载_linux DDR驱动知识
  5. CreateFile() 打开与创建文件
  6. 【BLE】蓝牙技术的应用
  7. 物联网芯片的协议之Zigbee及其调制
  8. Java 将HTML文件转换成PDF(Windows和linux)
  9. CNN卷积中卷积层,卷积核,通道概念及卷积过程详解
  10. SAS:大数据价值化是渐进的 虽有挑战但要乐观