MySQL 儲存過程引數IN OUT INOUT對比

神諭丶發表於2015-08-12
mysql> use test

IN 引數:


  1. -- 建立測試儲存過程

  2. delimiter //
  3. create procedure p_in ( IN num int )
  4. begin
  5.     select num;
  6.     set num=100;
  7.     select num;
  8. end;
  9. //
  10. delimiter ;

我設定使用者變數@num為1,將@num傳入p_in過程之中:

mysql> set @num=1;

Query OK, 0 rows affected (0.00 sec)

mysql> call p_in(@num);

+------+

| num  |

+------+

|    1   |

+------+

1 row in set (0.00 sec)

+------+

| num  |

+------+

|  100  |

+------+

1 row in set (0.00 sec)

Query OK, 0 rows affected (0.00 sec)

此時再次查詢@num發現@num仍為1:
mysql> select @num;

+------+

| @num |

+------+

|    1   |

+------+

1 row in set (0.00 sec)

所以 IN 引數只是將變數在儲存過程內部做了修改,並沒有影響到外部,@num仍為1。




OUT 引數:


  1. -- 建立測試儲存過程

  2. delimiter //
  3. create procedure p_out ( OUT num int )
  4. begin
  5.     select num;
  6.     set num=100;
  7.     select num;
  8. end;
  9. //

  10. delimiter ;

我設定@num為1,並呼叫p_out:

mysql> set @num=1;

Query OK, 0 rows affected (0.00 sec)

mysql> call p_out(@num);

+------+

| num  |

+------+

| NULL |

+------+

1 row in set (0.00 sec)

+------+

| num  |

+------+

|  100 |

+------+

1 row in set (0.00 sec)

Query OK, 0 rows affected (0.00 sec)

此時發現,過程的第一個select num為NULL,意味著@num無論是否有傳入的外部值,其初始值在過程內都為NULL。

再次檢視@num值,發現之前即使我已經set @num=1,但是在儲存過程的呼叫下,仍然被修改為100,說明OUT引數將引數值傳回給呼叫者。

mysql> select @num;

+------+

| @num |

+------+

|  100 |

+------+

1 row in set (0.00 sec)




INOUT 引數:

  1. -- 建立測試儲存過程

  2. delimiter //
  3. create procedure p_inout ( INOUT num int )
  4. begin
  5.     select num;
  6.     set num=100;
  7.     select num;
  8. end;
  9. //

  10. delimiter ;

同樣的,我首先將@num置為1,並呼叫p_inout:

mysql> set @num=1;

Query OK, 0 rows affected (0.00 sec)

mysql> call p_inout(@num);

+------+

| num  |

+------+

|    1   |

+------+

1 row in set (0.00 sec)

+------+

| num  |

+------+

|  100 |

+------+

1 row in set (0.00 sec)

Query OK, 0 rows affected (0.00 sec)
發現返回結果與p_in一致,說明@num為1的值,已經傳入儲存過程。

再次查詢呼叫過程後的@num,發現@num為100,此時又與p_out一致,同樣,說明OUT引數將引數值傳回給呼叫者。

mysql> select @num;

+------+

| @num |

+------+

|  100 |

+------+

1 row in set (0.00 sec)


然後

mysql> drop procedure p_in ;

Query OK, 0 rows affected (0.00 sec)

mysql> drop procedure p_inout ;

Query OK, 0 rows affected (0.00 sec)

mysql> drop procedure p_out ;

Query OK, 0 rows affected (0.00 sec)



那麼總結如下:
IN引數:
僅需要將資料傳入儲存過程,並不需要返回計算後的該值。
OUT引數:
不接受外部傳入的資料,僅返回計算之後的值。
INOUT引數:
需要資料傳入儲存過程經過呼叫計算後,再傳出返回值。


作者公眾號(持續更新)

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29773961/viewspace-1769098/,如需轉載,請註明出處,否則將追究法律責任。

相關文章