1. 程式人生 > >mysql儲存過程之引數(IN,OUT或INOUT)瞭解下

mysql儲存過程之引數(IN,OUT或INOUT)瞭解下

    在現實應用中,開發的儲存過程幾乎都需要引數,就是這些引數,使得儲存過程更加靈活和有用。 在mysql中,引數有三種模式:INOUTINOUT

  • IN - 是預設模式。在儲存過程中定義IN引數時,呼叫程式必須將引數傳遞給儲存過程。 另外,IN引數的值被保護。這意味著即使在儲存過程中更改了IN引數的值,在儲存過程結束後仍保留其原始值。換句話說,儲存過程只使用IN引數的副本。
  • OUT - 可以在儲存過程中更改OUT引數的值,並將其更改後新值傳遞迴呼叫程式。請注意,儲存過程在啟動時無法訪問OUT引數的初始值。
  • INOUT - INOUT引數是INOUT引數的組合。這意味著呼叫程式可以傳遞引數,並且儲存過程可以修改INOUT
    引數並將新值傳遞迴呼叫程式。

    我們來看下儲存過程中定義引數的語法:

MODE param_name param_type(param_size)

    詳細說明如下:

  • 根據儲存過程中引數的目的,MODE可以是INOUTINOUT
  • param_name是引數的名稱。引數的名稱必須遵循MySQL中列名的命名規則。
  • 在引數名之後是它的資料型別和大小。和變數一樣,引數的資料型別可以是任何有效的mysql資料型別。

    在上面的儲存過程中,如果儲存過程有多個引數,則每個引數由逗號(,)分隔。我們先來看in模式中,使用GetOfficeByCountry儲存過程中的IN引數來查詢選擇位於特定國家/地區的辦公室的例項:

USE `你的資料庫名稱`;
DROP procedure IF EXISTS `GetOfficeByCountry`;

DELIMITER $$
USE `資料庫名稱`$$
CREATE PROCEDURE GetOfficeByCountry(IN countryName VARCHAR(255))
 BEGIN
 SELECT * 
 FROM offices
 WHERE country = countryName;
 END$$

DELIMITER ;

    在上面的sql中,countryName是儲存過程的IN引數。在儲存過程中,我們查詢位於countryName引數指定的國家/地區的所有辦公室。假設我們想要查詢在美國(USA

)的所有辦事處,我們只需要將一個值(USA)傳遞給儲存過程,如下所示:

CALL GetOfficeByCountry('USA');

    執行上面查詢語句,得到以下結果:

    然而,如果要在法國獲得所有辦事處,我們就得將France字串傳遞給GetOfficeByCountry儲存過程,如下所示:

CALL GetOfficeByCountry('France')

    咱們完事再來看out模式中,通過訂單狀態返回訂單數量。它有兩個引數:

  • orderStatusIN引數,它是要對訂單計數的訂單狀態。
  • total:儲存指定訂單狀態的訂單數量的OUT引數。

    然後來看下CountOrderByStatus儲存過程的原始碼:

USE `你的資料庫名稱`;
DROP procedure IF EXISTS `CountOrderByStatus`;

DELIMITER $$
CREATE PROCEDURE CountOrderByStatus(
 IN orderStatus VARCHAR(25),
 OUT total INT)
BEGIN
 SELECT count(orderNumber)
 INTO total
 FROM orders
 WHERE status = orderStatus;
END$$
DELIMITER ;

    我們如果要獲取發貨訂單的數量,我們呼叫CountOrderByStatus儲存過程,並將訂單狀態傳遞為已發貨,並傳遞引數()以獲取返回值:

CALL CountOrderByStatus('Shipped',@total);
SELECT @total;

    執行上面查詢語句後,得到以下結果:

+--------+
| @total |
+--------+
|    303 |
+--------+
1 row in set

    再來看下inout模式:

DELIMITER $$
CREATE PROCEDURE set_counter(INOUT count INT(4),IN inc INT(4))
BEGIN
 SET count = count + inc;
END$$
DELIMITER ;

    上面的sql執行原理如下:

  • set_counter儲存過程接受一個INOUT引數(count)和一個IN引數(inc)。
  • 在儲存過程中,通過inc引數的值增加計數器(count)。

    我們再來看看如何呼叫set_counter儲存過程:

SET @counter = 1;
CALL set_counter(@counter,1); -- 2
CALL set_counter(@counter,1); -- 3
CALL set_counter(@counter,5); -- 8
SELECT @counter; -- 8
    好啦,本次分享就到這裡了。如果感覺不錯的話,請多多點贊支援哦。。。