CALL ステートメントは、以前に CREATE PROCEDURE で定義したストアドプロシージャを呼び出すために使用します。
CALL ステートメントの構文は次のとおりです:
CALL sp_name([parameter[,...]])
CALL sp_name[()]
パラメータを指定しないストアドプロシージャを呼び出す場合、括弧を省略できます。例えば、CALL proc() と CALL proc は等価です。
CALL では、宣言された OUT または INOUT パラメータを使用して値を呼び出し元に戻すことができます。ROW_COUNT() 関数を呼び出すことで、ルーチン内のすべてのステートメントの実行が完了した後に影響を受けた行数を取得することもできます。C API の場合は、mysql_affected_rows() 関数を呼び出すことで実現できます。
ユーザー変数を使用して OUT または INOUT パラメータを渡し、ストアドプロシージャから値を取得します。その後、プロシージャが返却された後に変数の値を確認します。別のストアドプロシージャや関数からこのプロシージャを呼び出す場合、ルーチンのパラメータやローカルなルーチン変数を IN または INOUT パラメータとして値を渡すこともできます。INOUT パラメータの場合、プロシージャに渡す前に値を初期化する必要があります。
以下の例では、ストアドプロシージャには OUT パラメータが1つあり、現在のサーバーバージョンに設定されています。また、INOUT パラメータが1つあり、その値はプロシージャの現在の値に2を加算して更新されます。
obclient> DELIMITER //
obclient> CREATE PROCEDURE proc (OUT ver_param VARCHAR(100), INOUT incr_param INT)
BEGIN
# OUTパラメータの値を設定
SELECT VERSION() INTO ver_param;
# INOUTパラメータの値を増分
SET incr_param = incr_param + 2;
END //
Query OK, 0 rows affected
プロシージャを呼び出す前に、INOUT パラメータとして渡す変数を初期化します。このプロシージャを呼び出した後、2つの変数の値が設定または変更されていることが確認できます。
obclient> DELIMITER ;
obclient> SET @increment = 1;
Query OK, 0 rows affected
obclient> CALL proc(@obversion, @increment);
+------------------------------+------------+
| ver_param | incr_param |
+------------------------------+------------+
| 5.7.25-OceanBase_CE-v4.0.0.0 | 3 |
+------------------------------+------------+
1 row in set
obclient> SELECT @obversion, @increment;
+------------------------------+------------+
| @obversion | @increment |
+------------------------------+------------+
| 5.7.25-OceanBase_CE-v4.0.0.0 | 3 |
+------------------------------+------------+
1 row in set