Home  >  Article  >  Database  >  How to understand the IN, OUT, INOUT types in MySQL

How to understand the IN, OUT, INOUT types in MySQL

一个新手
一个新手Original
2017-09-09 14:29:511887browse

[sql] view plain copy


  1. MySQL存储过程中有IN,OUT,INOUT类型  
    -----------------------------------  
    ## IN   IN参数只用来向过程传递信息,为默认值。  
    ## MySQL存储过程"in"参数:跟C语言的函数参数的值传递类似,MySQL存储过程内部可能会修改此参数,  
    ## 但in类型参数的修改对调用者(caller)来说是不可见的(not visible)  
    mysql>use test;  
    mysql> drop procedure if exists pr_param_in;  
    Query OK, 0 rows affected, 1 warning (0.01 sec)  
    mysql> delimiter //  
    mysql> create procedure pr_param_in(in id int)  
        -> begin  
        -> if (id is not null) then  
        ->     set id=id+1;  
        -> end if;  
        -> select id as id_inner;  
        -> end;  
        -> //  
    Query OK, 0 rows affected (0.03 sec)  
    mysql> delimiter ;  
    mysql> set @id=10;  
    Query OK, 0 rows affected (0.00 sec)  
    mysql> call pr_param_in(@id);  
    +----------+  
    | id_inner |  
    +----------+  
    |       11 |  
    +----------+  
    1 row in set (0.00 sec)  
    Query OK, 0 rows affected (0.00 sec)  
    mysql> select @id as id_out;  
    +--------+  
    | id_out |  
    +--------+  
    |     10 |  
    +--------+  
    1 row in set (0.00 sec)  
    ##  可以看到用户变量@id传入值为10,执行存储过程后,在过程内部值为:11(id_inner),  
    ##  但外部变量值依旧为:10(id_out)

[sql] view plain copy


  1. <pre name="code" class="sql">==================================================================================  
    ## OUT   OUT参数只用来从过程传回信息。  
    ## MySQL存储过程"out"参数:从存储过程内部传值给调用者。  
    ## 在存储过程内部,该参数初始值为 null,无论调用者是否给存储过程参数设置值。  
    mysql> drop procedure if exists pr_param_out;  
    Query OK, 0 rows affected, 1 warning (0.01 sec)  
    mysql> delimiter //  
    mysql> create procedure pr_param_out(out id int)  
        -> begin  
        -> select id as id_inner_1;  
        -> if (id is not null) then  
        ->     set id=id+1;  
        ->     select id as id_inner_2;  
        -> else  
        ->     select 1 into id;  
        -> end if;  
        -> select id as id_inner_3;  
        -> end;  
        -> //  
    Query OK, 0 rows affected (0.01 sec)  
    mysql> delimiter ;  
    mysql> set @id=10;  
    Query OK, 0 rows affected (0.00 sec)  
    mysql> call pr_param_out(@id);  
    +------------+  
    | id_inner_1 |  
    +------------+  
    |       NULL |  
    +------------+  
    1 row in set (0.01 sec)  
    +------------+  
    | id_inner_3 |  
    +------------+  
    |          1 |  
    +------------+  
    1 row in set (0.01 sec)  
    Query OK, 0 rows affected (0.01 sec)  
    mysql> select @id as id_out;  
    +--------+  
    | id_out |  
    +--------+  
    |      1 |  
    +--------+  
    1 row in set (0.00 sec)  
    ## 可以看出,虽然我们设置了用户定义变量@id为10,传递@id给存储过程后,在存储过程内部,  
    ## id的初始值总是 null(id_inner_1)。最后id值(id_out=1)传回给调用者。  
    ===================================================================================  
    ## INOUT INOUT参数可以向过程传递信息,如果值改变,则可再从过程外调用。  
    ## MySQL存储过程"inout"参数跟out类似,都可以从存储过程内部传值给调用者。  
    ## 不同的是:调用者还可以通过inout参数传递至给存储过程。  
    mysql> drop procedure if exists pr_param_inout;  
    Query OK, 0 rows affected, 1 warning (0.01 sec)  
    mysql> delimiter //  
    mysql> create procedure pr_param_inout(inout id int)  
        -> begin  
        -> select id as id_inner_1;  
        -> if (id is not null) then  
        ->     set id=id+1;  
        ->     select id as id_inner_2;  
        -> else  
        ->     select 1 into id;  
        -> end if;  
        -> select id as id_inner_3;  
        -> end;  
        -> //  
    Query OK, 0 rows affected (0.01 sec)  
    mysql> delimiter ;  
    mysql> set @id=10;  
    Query OK, 0 rows affected (0.00 sec)  
    mysql> call pr_param_inout(@id);  
    +------------+  
    | id_inner_1 |  
    +------------+  
    |         10 |  
    +------------+  
    1 row in set (0.00 sec)  
    +------------+  
    | id_inner_2 |  
    +------------+  
    |         11 |  
    +------------+  
    1 row in set (0.00 sec)  
    +------------+  
    | id_inner_3 |  
    +------------+  
    |         11 |  
    +------------+  
    1 row in set (0.01 sec)  
    Query OK, 0 rows affected (0.01 sec)  
    mysql> select @id as id_out;  
    +--------+  
    | id_out |  
    +--------+  
    |     11 |  
    +--------+  
    1 row in set (0.00 sec)  
    ## 从结果可以看出:我们把 @id(10)传给存储过程后,存储过程最后又把计算结果值11(id_inner_3)  
    ## 传回给调用者。MySQL存储过程inout参数的行为跟C语言函数中的引用传值类似。  
    =========================================================================================  
    通过以上例子:  
    1)  如果仅仅想把数据传给MySQL存储过程,那就用in类型参数;  
    2)  如果仅仅从MySQL存储过程返回值,那就用out类型参数;  
    3)  如果需要把数据传给MySQL存储过程经过计算再传回给我们,那就用inout类型参数。

The above is the detailed content of How to understand the IN, OUT, INOUT types in MySQL. For more information, please follow other related articles on the PHP Chinese website!

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn