儲存常式是程序或函式。儲存常式是使用 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
(並在常式終止時復原)。不允許在儲存常式中使用db_name
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() 和 多個陳述式執行支援。
儲存程序中的陳述式所參考的使用者變數,其類型是在第一次叫用程序時決定的,並且在之後每次叫用程序時都保留此類型。