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 節,「預備陳述式和預存程式的快取」。