MySQL
 Computer >> コンピューター >  >> プログラミング >> MySQL

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インジェクションの危険がある点に注意が必要です。
  1. 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, ,

  2. 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