存儲過程和存儲函數都是存儲在服務器端的 SQL 語句集合。要想使用這些已經定義好的存儲過程和存儲函數就必須要通過調用的方式來實現。
存儲過程通過 CALL 語句來調用,存儲函數的使用方法與 MySQL 內部函數的使用方法相同。執行存儲過程和存儲函數需要擁有 EXECUTE 權限(EXECUTE 權限的信息存儲在 information_schema 數據庫下的 USER_PRIVILEGES 表中)。
這里主要講解如何調用存儲過程和存儲函數。
調用存儲過程
MySQL 中使用 CALL 語句來調用存儲過程。調用存儲過程后,數據庫系統將執行存儲過程中的 SQL 語句,然后將結果返回給輸出值。
CALL 語句接收存儲過程的名字以及需要傳遞給它的任意參數,基本語法形式如下:
CALL sp_name([parameter[...]]);
其中,sp_name 表示存儲過程的名稱,parameter 表示存儲過程的參數。
例 1
下面調用之前創建的存儲過程GetAgeByStu,SQL 語句和執行過程如下:
mysql> call GetAgeByStu('Dany'); +------+ | age | +------+ | 25 | +------+ 1 row in set (0.00 sec) Query OK, 0 rows affected (0.01 sec)
mysql> call GetAgeByStu('Tom'); +------+ | age | +------+ | 23 | +------+ 1 row in set (0.00 sec) Query OK, 0 rows affected (0.01 sec)
上面的兩次調用同一個存儲過程, 只是傳遞的參數不同而已.
因為存儲過程實際上也是一種函數,所以存儲過程名后需要有( )
符號,即使不傳遞參數也需要。
調用存儲函數
在 MySQL 中,存儲函數的使用方法與 MySQL 內部函數的使用方法是一樣的。換言之,用戶自己定義的存儲函數與 MySQL 內部函數是一個性質的。區別在於,存儲函數是用戶自己定義的,而內部函數是 MySQL 開發者定義的。
例 2
下面調用之前章節中創建的存儲函數func_get_name,SQL 語句和執行過程如下:
mysql> select func_get_name(1); // 參數是1 +------------------+ | func_get_name(1) | +------------------+ | Dany | +------------------+ 1 row in set, 1 warning (0.06 sec) mysql> select func_get_name(2); // 參數是2 +------------------+ | func_get_name(2) | +------------------+ | Green | +------------------+ 1 row in set (0.00 sec)
通過例 1 和例 2 的比較,可以看出雖然存儲函數和存儲過程的定義稍有不同,但它們都可以實現相同的功能,我們應該在實際應用中靈活選擇。