文件首頁
MySQL 9.0 參考手冊
相關文件 下載本手冊
PDF (美式信紙尺寸) - 40.0Mb
PDF (A4) - 40.1Mb
Man Pages (TGZ) - 258.2Kb
Man Pages (Zip) - 365.3Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


MySQL 9.0 參考手冊  /  ...  /  CALL 陳述式

15.2.1 CALL 陳述式

CALL sp_name([parameter[,...]])
CALL sp_name[()]

CALL 陳述式會調用先前使用 CREATE PROCEDURE 定義的預存程序。

不帶引數的預存程序可以在沒有括號的情況下調用。也就是說,CALL p()CALL p 是等效的。

CALL 可以使用宣告為 OUTINOUT 參數的參數將值傳回給調用者。當程序返回時,客戶端程式還可以取得在例行程序中執行的最後一個陳述式所影響的行數:在 SQL 層級,調用 ROW_COUNT() 函數;從 C API,調用 mysql_affected_rows() 函數。

有關未處理的條件對程序參數的影響的資訊,請參閱第 15.6.7.8 節,「條件處理和 OUT 或 INOUT 參數」

要使用 OUTINOUT 參數從程序取回值,請透過使用者變數傳遞參數,然後在程序返回後檢查變數的值。(如果您是從另一個預存程序或函數中調用程序,您也可以將例行程序參數或本地例行程序變數作為 ININOUT 參數傳遞。)對於 INOUT 參數,請在將其傳遞給程序之前初始化其值。以下程序有一個 OUT 參數,程序會將其設定為當前伺服器版本,還有一個 INOUT 值,程序會將其從當前值遞增 1

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 |
+----------+------------+
| 9.0.0   |         11 |
+----------+------------+

在使用 PREPAREEXECUTE 的預備 CALL 陳述式中,可以使用佔位符來表示 IN 參數、OUTINOUT 參數。這些參數類型可以使用如下方式

mysql> SET @increment = 10;
mysql> PREPARE s FROM 'CALL p(?, ?)';
mysql> EXECUTE s USING @version, @increment;
mysql> SELECT @version, @increment;
+----------+------------+
| @version | @increment |
+----------+------------+
| 9.0.0   |         11 |
+----------+------------+

若要編寫 C 程式以使用 CALL SQL 陳述式來執行產生結果集的預存程序,則必須啟用 CLIENT_MULTI_RESULTS 旗標。這是因為每個 CALL 除了可能由程序內執行的陳述式傳回的任何結果集之外,還會傳回一個結果來指示調用狀態。如果 CALL 用於執行任何包含預備陳述式的預存程序,也必須啟用 CLIENT_MULTI_RESULTS。無法判斷何時載入此類程序時,這些陳述式是否產生結果集,因此有必要假設它們確實會產生結果集。

當您呼叫 mysql_real_connect() 時,可以明確地傳遞 CLIENT_MULTI_RESULTS 旗標本身,或隱含地傳遞 CLIENT_MULTI_STATEMENTS(也會啟用 CLIENT_MULTI_RESULTS)來啟用 CLIENT_MULTI_RESULTSCLIENT_MULTI_RESULTS 預設為啟用。

若要處理使用 mysql_query()mysql_real_query() 執行的 CALL 陳述式之結果,請使用一個迴圈呼叫 mysql_next_result() 來判斷是否有更多結果。如需範例,請參閱多個陳述式執行支援

C 程式可以使用預備陳述式介面來執行 CALL 陳述式並存取 OUTINOUT 參數。這可以透過使用一個迴圈呼叫 mysql_stmt_next_result() 來判斷是否有更多結果,來處理 CALL 陳述式的結果。如需範例,請參閱預備 CALL 陳述式支援。提供 MySQL 介面的語言可以使用預備 CALL 陳述式來直接擷取 OUTINOUT 程序參數。

當下次執行程式時,將會偵測到預存程式參考之物件的中繼資料變更,並導致自動重新剖析受影響的陳述式。如需更多資訊,請參閱第 10.10.3 節,「預備陳述式和預存程式的快取」