儲存程序可以是程序或函數。儲存程序是使用 CREATE PROCEDURE
和 CREATE FUNCTION
陳述式建立的 (請參閱第 15.1.17 節「CREATE PROCEDURE 和 CREATE FUNCTION 陳述式」)。程序是使用 CALL
陳述式叫用的 (請參閱第 15.2.1 節「CALL 陳述式」),並且只能使用輸出變數傳回值。函數可以像其他任何函數一樣從陳述式內部呼叫 (也就是說,藉由叫用函數的名稱),並且可以傳回純量值。儲存程序的主體可以使用複合陳述式 (請參閱第 15.6 節「複合陳述式語法」)。
可以使用 DROP PROCEDURE
和 DROP FUNCTION
陳述式 (請參閱第 15.1.29 節「DROP PROCEDURE 和 DROP FUNCTION 陳述式」) 卸除儲存程序,並使用 ALTER PROCEDURE
和 ALTER FUNCTION
陳述式 (請參閱第 15.1.7 節「ALTER PROCEDURE 陳述式」) 變更儲存程序。
儲存程序或函數會與特定的資料庫相關聯。這有幾個含義:
當叫用程序時,會執行隱式的
USE
(並在程序終止時復原)。不允許在儲存程序內使用資料庫名稱
USE
陳述式。您可以使用資料庫名稱來限定程序名稱。這可以用於參照不在目前資料庫中的程序。例如,若要叫用與
test
資料庫相關聯的儲存程序p
或函數f
,您可以說CALL test.p()
或test.f()
。當卸除資料庫時,也會卸除與其相關聯的所有儲存程序。
儲存函數無法遞迴。
允許在儲存程序中遞迴,但預設會停用。若要啟用遞迴,請將 max_sp_recursion_depth
伺服器系統變數設定為大於零的值。儲存程序遞迴會增加執行緒堆疊空間的需求。如果您增加 max_sp_recursion_depth
的值,可能需要透過在伺服器啟動時增加 thread_stack
的值來增加執行緒堆疊大小。如需更多資訊,請參閱第 7.1.8 節「伺服器系統變數」。
MySQL 支援一個非常有用的延伸功能,可讓您在儲存程序內使用一般的 SELECT
陳述式 (也就是說,不使用游標或本機變數)。這類查詢的結果集會直接傳送到用戶端。多個 SELECT
陳述式會產生多個結果集,因此用戶端必須使用支援多個結果集的 MySQL 用戶端程式庫。這表示用戶端必須使用至少與 4.1 版一樣新的 MySQL 版本中的用戶端程式庫。用戶端也應該在連線時指定 CLIENT_MULTI_RESULTS
選項。對於 C 程式,可以使用 mysql_real_connect()
C API 函數來完成。請參閱mysql_real_connect() 和 多個陳述式執行支援。
儲存程序中陳述式參照的使用者變數,其類型會在第一次叫用程序時決定,並且在每次之後叫用程序時都會保留此類型。