天天看點

超詳細mysql存儲過程in/out/inout差別講解

存儲過程

大概定義:用一個别名來描述多個sql語句的執行過程。

  • 最簡單
    delimiter //
    create PROCEDURE p1()
    begin
    select * from userinfo;
    end //
    delimiter ;
    
    call p1();
    
               
  • 傳參(in, out, inout)
    • in 表示傳入的參數, 可以傳入數值或者變量,即使傳入變量,并不會更改變量的值,可以内部更改,僅僅作用在函數範圍内。
      delimiter //
      create procedure p2(
          in v1 int
          )
          begin
          set v1 = 2 * v1;
          select v1;
          end //
      
      delimiter ;
      
      call p2(19);
      
      ----------------
      delimiter //
      create procedure p6(
          in v int
          )
          begin 
          set v = 10;
          select v;
          end //
      delimiter ;
      
      call p6(10);
      
      set @v4 = 0;
      call p6(@v4);
      select @v4;  -- 此時@v4依然為0
                 
    • out 表示存儲執行存儲過程的傳回結果,且參數隻能是一個變量,且隻能對其指派(函數執行完以後也生效),不能在函數内擷取其值。
      delimiter //
      create procedure p3(
          out v int
          )
          begin
          set v = 10;
          end //
      delimiter ;
      
      set @v1 = 0; # @varible_name 類似于定義一個局部變量,跟session一樣
      call p3(@v1); 
      select @v1;
      
      -----------------------------
      delimiter //
      create procedure p4(
          out v int
          )
          begin 
          set v = v + 5;  -- 這兒有問題,不能這樣,隻能直接指派
          select v;
          end //
      delimiter ;
      -- 這段代碼是有問題的。
      delimiter //
      create procedure p5(
          out v int
          )
          begin 
          set v = 5; -- 對的
          select v;
          end //
      delimiter ;
      
      set @v3 = 0;
      call p5(@v3);
                 
    • inout 表示從外部傳入的參數經過修改後可以傳回的變量,既可以使用傳入變量的值也可以修改變量的值(即使函數執行完)。
      delimiter //
      create procedure p7(
          inout v int
          )
          begin
          set v = 9999;
          select v;
          end //
      delimiter ;
      
      call p7(10);
      
      set @v5 = 0;
      call p7(@v5);
      select @v5;
      
      ------------------------------------
      
      delimiter //
      create procedure p8(
          inout v int
          )
          begin
          set v = v + 9999;
          select v;
          end //
      delimiter ;
      
      set @v6 = 1;
      call p8(@v6);
      select @v6;
                 

綜上

  • in隻可以讀取值/變量,不能更改
  • out不能讀,可以更改
  • inout既可以讀又可以更改

繼續閱讀