## 存儲過程 - 參數
參數使存儲過程更靈活和有用。在MySQL中,參數有三種模式:
- IN – 調用程序必須將參數傳遞給存儲過程,參數的值受到保護。
- OUT – 參數值可以在存儲過程中更改,并將其新值傳遞回給調用程序。存儲過程在啟動時無法訪問參數的初始值。
- INOUT – IN和OUT參數的組合。調用程序可以傳遞參數,存儲過程可以修改參數,并將新值傳遞回給調用程序。
獲取北京總公司的所有雇員:
```
DELIMITER $$
DROP PROCEDURE IF EXISTS get_bj_employees$$
CREATE PROCEDURE get_bj_employees()
BEGIN
SELECT * FROM employee WHERE office_id = 1000;
END$$
DELIMITER ;
```
調用存儲過程:
call get_bj_employees();
獲取某地的所有雇員:
```
DELIMITER $$
DROP PROCEDURE IF EXISTS get_office_employees$$
CREATE PROCEDURE get_office_employees(IN p_office_id int)
BEGIN
SELECT * FROM employee WHERE office_id = p_office_id;
END$$
DELIMITER ;
```
調用存儲過程:
call get_office_employees(1000);
獲取某地的雇員總數:
```
DELIMITER $$
DROP PROCEDURE IF EXISTS count_office_employees$$
CREATE PROCEDURE count_office_employees(
IN p_office_id int,
OUT p_total int
)
BEGIN
SELECT count(*) INTO p_total FROM employee WHERE office_id = p_office_id;
END$$
DELIMITER ;
```
調用存儲過程:
call count_office_employees(1000, @p_total);
select @p_total;
步進計數器:
```
DELIMITER $$
DROP PROCEDURE IF EXISTS set_counter$$
CREATE PROCEDURE set_counter(INOUT count int, IN step int)
BEGIN
SET count = count + step;
END$$
DELIMITER ;
```
調用存儲過程:
set @counter = 100;
call set_counter(@counter, 100); // 結果為 200
call set_counter(@counter, 100); // 結果為 300
call set_counter(@counter, 50); // 結果為 350
select @counter; // 結果為 350