超詳細講解mysql存儲過程當中的in/out/inout

存儲過程

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

  • 最簡單
    delimiter //
    create PROCEDURE p1()
    begin
    select * from userinfo;
    end //
    delimiter ;
    
    call p1();
  • 傳參(in, out, inout)
    • in 表示傳入的參數, 能夠傳入數值或者變量,即便傳入變量,並不會更改變量的值,能夠內部更改,僅僅做用在函數範圍內。session

      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 表示從外部傳入的參數通過修改後能夠返回的變量,既能夠使用傳入變量的值也能夠修改變量的值(即便函數執行完)。code

      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既能夠讀又能夠更改
相關文章
相關標籤/搜索