文件首頁
MySQL 8.4 參考手冊
相關文件 下載本手冊
PDF (美式信紙) - 39.9Mb
PDF (A4) - 40.0Mb
Man Pages (TGZ) - 258.5Kb
Man Pages (Zip) - 365.5Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


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

15.2.1 CALL 陳述式

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

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

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

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

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

若要使用 OUTINOUT 參數從程序取回值,請透過使用者變數傳遞參數,然後在程序返回後檢查變數的值。(如果您是從另一個預存程序或函數內呼叫程序,也可以將常式參數或局部常式變數作為 ININOUT 參數傳遞。) 對於 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 |
+----------+------------+

在搭配 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 |
+----------+------------+
| 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_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 節,「預備陳述式和預存程式的快取」