MySQL 存储过程参数:in、out、inout

一、MySQL 存储过程参数(in)
MySQL 存储过程 "in" 参数:跟 C 语言的函数参数的值传递类似, MySQL 存储过程内部可能会修改此参数,但对 in 类型参数的修改,对调用者(caller)来说是不可见的(not visible)。

Java代码  

  1. drop procedure if exists pr_param_in;  
  2. create procedure pr_param_in(  
  3.     in id int -- in 类型的 MySQL 存储过程参数  
  4. )  
  5. begin  
  6. if (id is not null) then  
  7.     set id = id + 1;  
  8. end if;  
  9.     select id as id_inner;  
  10. end;  

 

Java代码  

  1. set @id = 10;  
  2. call pr_param_in(@id);  
  3. select @id as id_out;  
  4.   
  5. mysql> call pr_param_in(@id);  
  6. +----------+  
  7. | id_inner |  
  8. +----------+  
  9. |       11 |  
  10. +----------+  
  11. mysql> select @id as id_out;  
  12. +--------+  
  13. | id_out |  
  14. +--------+  
  15. | 10     |  
  16. +--------+  

可以看到:用户变量 @id 传入值为 10,执行存储过程后,在过程内部值为:11(id_inner),但外部变量值依旧为:10(id_out)。

 

二、MySQL 存储过程参数(out)
MySQL 存储过程 "out" 参数:从存储过程内部传值给调用者。在存储过程内部,该参数初始值为 null,无论调用者是否给存储过程参数设置值。

Java代码  

  1. drop procedure if exists pr_param_out;  
  2. create procedure pr_param_out(  
  3.     out id int  
  4. )  
  5. begin  
  6. select id as id_inner_1;  -- id 初始值为 null  
  7. if (id is not null) then  
  8.     set id = id + 1;  
  9.     select id as id_inner_2;  
  10. else  
  11.     select 1 into id;  
  12. end if;  
  13.     select id as id_inner_3;  
  14. end;  

Java代码  

  1. set @id = 10;  
  2. call pr_param_out(@id);  
  3. select @id as id_out;  
  4.   
  5. mysql> set @id = 10;  
  6. mysql>  
  7. mysql> call pr_param_out(@id);  
  8. +------------+  
  9. | id_inner_1 |  
  10. +------------+  
  11. |       NULL |  
  12. +------------+  
  13. +------------+  
  14. | id_inner_3 |  
  15. +------------+  
  16. |          1 |  
  17. +------------+  
  18. mysql> select @id as id_out;  
  19. +--------+  
  20. | id_out |  
  21. +--------+  
  22. | 1      |  
  23. +--------+  

可以看出,虽然我们设置了用户定义变量 @id 为 10,传递 @id 给存储过程后,在存储过程内部,id 的初始值总是 null(id_inner_1)。最后 id 值(id_out = 1)传回给调用者。

 

三、MySQL 存储过程参数(inout)
MySQL 存储过程 inout 参数跟 out 类似,都可以从存储过程内部传值给调用者。不同的是:调用者还可以通过 inout 参数传递值给存储过程。

Java代码  

  1. drop procedure if exists pr_param_inout;  
  2. create procedure pr_param_inout(  
  3.     inout id int  
  4. )  
  5. begin  
  6. select id as id_inner_1;  -- id 值为调用者传进来的值  
  7. if (id is not null) then  
  8.     set id = id + 1;  
  9.     select id as id_inner_2;  
  10. else  
  11.     select 1 into id;  
  12. end if;  
  13.     select id as id_inner_3;  
  14. end;   

Java代码  

  1. set @id = 10;  
  2. call pr_param_inout(@id);  
  3. select @id as id_out;  
  4.   
  5. mysql> set @id = 10;  
  6. mysql>  
  7. mysql> call pr_param_inout(@id);  
  8. +------------+  
  9. | id_inner_1 |  
  10. +------------+  
  11. |         10 |  
  12. +------------+  
  13. +------------+  
  14. | id_inner_2 |  
  15. +------------+  
  16. |         11 |  
  17. +------------+  
  18. +------------+  
  19. | id_inner_3 |  
  20. +------------+  
  21. |         11 |  
  22. +------------+  
  23. mysql>  
  24. mysql> select @id as id_out;  
  25. +--------+  
  26. | id_out |  
  27. +--------+  
  28. | 11     |  
  29. +--------+  

从结果可以看出:我们把 @id(10),传给存储过程后,存储过程最后又把计算结果值 11(id_inner_3)传回给调用者。 MySQL 存储过程 inout 参数的行为跟 C 语言函数中的引用传值类似。
通过以上例子:如果仅仅想把数据传给 MySQL 存储过程,那就使用"in" 类型参数;如果仅仅从 MySQL 存储过程返回值,那就使用"out" 类型参数;如果需要把数据传给 MySQL 存储过程,还要经过一些计算后再传回给我们,此时,要使用"inout" 类型参数。

参数的默认值,存储过程的参数可以设置默认值

Java代码  

  1. create or replace procedure procdefault(p1 varchar2,p2 varchar2 default 'mark')  

 

 

时间: 2024-08-30 12:41:05

MySQL 存储过程参数:in、out、inout的相关文章

详解MySQL存储过程参数有三种类型(in、out、inout)_Mysql

一.MySQL 存储过程参数(in) MySQL 存储过程 "in" 参数:跟 C 语言的函数参数的值传递类似, MySQL 存储过程内部可能会修改此参数,但对 in 类型参数的修改,对调用者(caller)来说是不可见的(not visible). 复制代码 代码如下: drop procedure if exists pr_param_in; create procedure pr_param_in ( in id int -- in 类型的 MySQL 存储过程参数 ) begi

MySql存储过程 带参数处理方式

下文介绍的MySql存储过程是带参数的存储过程(动态执行SQL语句),该MySql存储过程是根据用户输入的条件和排序方式查询用户的信息,排序条件可以没有调用方式: call GetUsersDynamic('age<=30',''); /********动态查询用户的信息********/     CREATE PROCEDURE GetUsersDynamic(WhereCondition varchar(500),OrderByExpress varchar(100))     begin 

mysql 存储过程输入输出参数示例_Mysql

drop PROCEDURE if exists my_procedure; create PROCEDURE my_procedure(in my_id int,out my_name char) BEGIN select list_name into my_name from aa_list where list_id=my_id; end; call my_procedure(24,@a); select @a; 以上是小编为您精心准备的的内容,在的博客.问答.公众号.人物.课程等栏目也有

MySQL 存储过程的函数与基本用法

基本用法 MySQL 存储过程是从 MySQL 5.0 开始逐渐增加新的功能.存储过程在实际应用中也是优点大于缺点.不过最主要的还是执行效率和SQL 代码封装.特别是 SQL 代码封装功能,如果没有存储过程. 在外部程序访问数据库时(例如 PHP),要组织很多 SQL 语句. 特别是业务逻辑复杂的时候,一大堆的 SQL 和条件夹杂在 PHP 代码中,让人不寒而栗.现在有了 MySQL 存储过程,业务逻辑可以封装存储过程中,这样不仅容易维护,而且执行效率也高. 一.MySQL 创建存储过程 "pr

字符集-mysql 存储过程输出参数中文返回乱码

问题描述 mysql 存储过程输出参数中文返回乱码 我用C++ 通过ODBC访问mysql 数据库,mysql 数据库版本是5.6.12 odbc驱动版本5.2.5 数据库的字符集全部设置为utf8 驱动的字符集也设置为utf8. 程序中通过select直接从表中查出,中文不会乱码, 但通过存储过程的输出参数返回就是乱码. 求大神们帮忙.谢谢 解决方案 在存储过程里查询的时候,指定查询字符集

存储过程 带参数-java调用mysql存储过程输出参数

问题描述 java调用mysql存储过程输出参数 CREATE PROCEDURE T_WEATHER_PRO (IN tmdn VARCHAR(12),OUT tmsg VARCHAR(12)) BEGIN DECLARE states,beginTime,endTime VARCHAR(2) ; SELECT T_STATES,T_BEGINTIME,T_ENDTIME INTO states,beginTime,endTime FROM T_USER_WEATHER WHERE T_USE

php PDO 调用带有out参数的mysql存储过程实例

最近使用PHP数据库访问最新的一种技术 POD,不封装,代码也写得很少. 下面我将贴出我的代码. 代码部分: <?php  $dsn = "mysql:host=localhost;dbname=mysqldatabasedemo";  $db = new PDO($dsn,'root','123456@#',array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET    NAMES'GBK';"));   $someInPa

.net调用mysql存储过程中输出参数的问题,求救~~

问题描述 环境.net2.0+mysql5.0.37+Connector/Net5.2问题:在ASP.NET中调用mysql存储过程(输出参数名于存储过程输出参数名不同时),提示输出参数不存在:Parameter'@param1'notfoundinthecollection.当ASP.NET中修改输出参数名于存储过程中输出参数名相同的时候,提示一个新的参数未定义:Parameter'@1118079786param1'mustbedefined.而这个参数变量是自动生成的,在存储过程中我并没有

当PHP遇到MySQL存储过程

1.MySQL存储过程 我们常用的操作数据库语言SQL语句在执行的时候需要要先编译,然后执行,而存储过程(Stored Procedure)是一组为了完成特定功能的SQL语句集,经编译后存储在数据库中,用户通过指定存储过程的名字并给定参数(如果该存储过程带有参数)来调用执行它. 一个存储过程是一个可编程的函数,它在数据库中创建并保存.它可以有SQL语句和一些特殊的控制结构组成.当希望在不同的应用程序或平台上执行相同的函数,或者封装特定功能时,存储过程是非常有用的.数据库中的存储过程可以看做是对编