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 パラメータと、そのプロセスの現在の値に2を加算した INOUT 値があります。
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