CALL sp_name([parameter[,...]])
CALL sp_name[()]CALL 陳述式會調用先前使用 CREATE PROCEDURE 定義的儲存程序。
不帶引數的儲存程序可以在不帶括號的情況下調用。也就是說,CALL p() 和 CALL p 是等效的。
使用宣告為 OUT 或 INOUT 參數的參數,CALL 可以將值傳回給呼叫者。當程序返回時,客戶端程式也可以取得常式中執行的最後一個陳述式所影響的列數:在 SQL 層級,呼叫 ROW_COUNT() 函數;從 C API,呼叫 mysql_affected_rows() 函數。
有關未處理的條件對程序參數的影響資訊,請參閱第 15.6.7.8 節,「條件處理和 OUT 或 INOUT 參數」。
若要使用 OUT 或 INOUT 參數從程序取回值,請透過使用者變數傳遞參數,然後在程序返回後檢查變數的值。(如果您是從另一個預存程序或函數內呼叫程序,也可以將常式參數或局部常式變數作為 IN 或 INOUT 參數傳遞。) 對於 INOUT 參數,請先初始化其值,再將其傳遞給程序。以下程序有一個 OUT 參數,該程序會將其設定為目前的伺服器版本,以及一個 INOUT 值,該程序會將其值加一。
DELIMITER //
CREATE PROCEDURE p (OUT ver_param VARCHAR(25), INOUT incr_param INT)
BEGIN
# Set value of OUT parameter
SELECT VERSION() INTO ver_param;
# Increment value of INOUT parameter
SET incr_param = incr_param + 1;
END //
DELIMITER ;在呼叫程序之前,請初始化要作為 INOUT 參數傳遞的變數。呼叫程序後,您可以看到兩個變數的值已設定或修改。
mysql> SET @increment = 10;
mysql> CALL p(@version, @increment);
mysql> SELECT @version, @increment;
+----------+------------+
| @version | @increment |
+----------+------------+
| 8.4.0 | 11 |
+----------+------------+在搭配 PREPARE 和 EXECUTE 使用的預備 CALL 陳述式中,佔位符可用於 IN 參數、OUT 和 INOUT 參數。這些參數類型可依下列方式使用:
mysql> SET @increment = 10;
mysql> PREPARE s FROM 'CALL p(?, ?)';
mysql> EXECUTE s USING @version, @increment;
mysql> SELECT @version, @increment;
+----------+------------+
| @version | @increment |
+----------+------------+
| 8.4.0 | 11 |
+----------+------------+若要編寫使用 CALL SQL 陳述式來執行產生結果集的預存程序的 C 程式,則必須啟用 CLIENT_MULTI_RESULTS 旗標。這是因為每個 CALL 除了程序內執行的陳述式可能傳回的任何結果集之外,還會傳回一個結果以指示呼叫狀態。如果 CALL 用於執行任何包含預備陳述式的預存程序,也必須啟用 CLIENT_MULTI_RESULTS。無法在載入此類程序時判斷這些陳述式是否會產生結果集,因此有必要假設它們會產生結果集。
當您呼叫 mysql_real_connect() 時,可以透過明確傳遞 CLIENT_MULTI_RESULTS 旗標本身,或透過傳遞 CLIENT_MULTI_STATEMENTS (也會啟用 CLIENT_MULTI_RESULTS) 來啟用 CLIENT_MULTI_RESULTS。CLIENT_MULTI_RESULTS 預設為啟用。
若要處理使用 mysql_query() 或 mysql_real_query() 執行的 CALL 陳述式結果,請使用迴圈呼叫 mysql_next_result() 來判斷是否有更多結果。如需範例,請參閱多個陳述式執行支援。
C 程式可以使用預備陳述式介面來執行 CALL 陳述式,並存取 OUT 和 INOUT 參數。這是透過使用迴圈呼叫 mysql_stmt_next_result() 來判斷是否有更多結果,藉此處理 CALL 陳述式的結果來完成的。如需範例,請參閱預備 CALL 陳述式支援。提供 MySQL 介面的語言可以使用預備 CALL 陳述式來直接擷取 OUT 和 INOUT 程序參數。
當下次執行程式時,會偵測到預存程式所參照物件的中繼資料變更,並導致自動重新剖析受影響的陳述式。如需詳細資訊,請參閱第 10.10.3 節,「預備陳述式和預存程式的快取」。