<form id="hz9zz"></form>
  • <form id="hz9zz"></form>

      <nobr id="hz9zz"></nobr>

      <form id="hz9zz"></form>

    1. 明輝手游網中心:是一個免費提供流行視頻軟件教程、在線學習分享的學習平臺!

      怎么理解MySQL中的IN,OUT,INOUT分類

      [摘要][sql] viewplain copyMySQL存儲過程中有IN,OUT,INOUT類型 ----------------------------------- ## IN IN參數只用來...

      [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類型參數。

      以上就是如何理解MySQL中的IN,OUT,INOUT類型的詳細內容,更多請關注php中文網其它相關文章!


      學習教程快速掌握從入門到精通的SQL知識。




      日韩精品一区二区三区高清