MySQLクエリの影響を受けた行数をカウントするストアドプロシージャの作成方法
MySQLでは、ROW_COUNT()関数とプリペアドステートメントを組み合わせることで、任意のクエリが影響を与えた行数を返すストアドプロシージャを作成できます。以下にその手順を示します。
ストアドプロシージャの作成
まず、引数として渡されたSQLコマンドを実行し、影響を受けた行数を結果として返すプロシージャを作成します。
mysql> DELIMITER //
mysql> CREATE PROCEDURE `query`.`row_cnt` (IN command VARCHAR(60000))
-> BEGIN
-> SET @query = command;
-> PREPARE stmt FROM @query;
-> EXECUTE stmt;
-> SELECT ROW_COUNT() AS 'Affected rows';
-> END //
Query OK, 0 rows affected (0.00 sec)
mysql> DELIMITER ;
プロシージャの仕組み
- DELIMITER //:ストアドプロシージャ内のセミコロン(;)が文の終端として誤って解釈されないよう、デリミタを一時的に「//」へ変更します。
- IN command VARCHAR(60000):実行したいSQL文を文字列として受け取る入力パラメータです。
- PREPARE stmt FROM @query:受け取ったSQL文をプリペアドステートメントとして準備します。
- EXECUTE stmt:準備したステートメントを実行します。
- ROW_COUNT():直前に実行されたステートメントによって挿入・更新・削除された行数を返す関数です。
動作確認
テスト用のテーブルを作成し、プロシージャを呼び出してINSERT文の影響行数を確認してみましょう。
mysql> CREATE TABLE Testing123(First VARCHAR(20), Second VARCHAR(20));
Query OK, 0 rows affected (0.48 sec)
mysql> CALL row_cnt("INSERT INTO testing123(First,Second) VALUES('Testing First','Testing Second');");
+---------------+
| Affected rows |
+---------------+
| 1 |
+---------------+
1 row in set (0.10 sec)
Query OK, 0 rows affected (0.11 sec)
この例では、INSERT文によって1行が挿入されたため、Affected rowsとして「1」が返されています。UPDATE文やDELETE文についても同様に、実際に変更された行数を取得できます。
注意点
ROW_COUNT()は直前のステートメントの結果に依存するため、必ずクエリ実行の直後に呼び出してください。- SELECT文に対しては-1を返します。
- 動的SQLを扱う仕組みのため、外部からの入力をそのまま渡すとSQLインジェクションの危険がある点に注意が必要です。
-
MySQL Workbenchでストアドプロシージャを作成・実行する方法
MySQL Workbenchでストアドプロシージャを作成する手順 まずは、ストアドプロシージャを作成してみましょう。以下は、MySQL Workbenchを使用してストアドプロシージャを作成するためのクエリ例です。 use business; DELIMITER // DROP PROCEDURE IF EXISTS SP_GETMESSAGE; CREATE PROCEDURE SP_GETMESSAGE() BEGIN DECLARE MESSAGE VARCHAR(100); SET MESSAGE="HELLO"; SELECT CONCAT(MESSAGE, ,
-
MySQLストアドプロシージャでSHOW CREATE TABLEを実行する方法
MySQLストアドプロシージャでSHOW CREATE TABLEを実行する方法 ストアドプロシージャの中でSHOW CREATE TABLEを実行したい場合は、動的SQL(プリペアドステートメント)を利用します。SHOW系のコマンドはプロシージャ内に直接記述できないため、SQL文を文字列として組み立てて実行するのがポイントです。 まずはサンプル用のテーブルを作成しましょう。 mysql> create table DemoTable2011 -> ( -> StudentId int NOT NULL AUTO_INCREMENT, -> St