MySQLでストアドプロシージャの存在を確認するには?SHOW CREATE PROCEDUREの使い方
まず、動作確認用のサンプルとしてストアドプロシージャを作成しましょう。ここでは、指定した日付に任意の月数を加算した日付を返す「ExtenddatesWithMonthdemo」というプロシージャを作成します。
mysql> DELIMITER // mysql> CREATE PROCEDURE ExtenddatesWithMonthdemo(IN date1 datetime, IN NumberOfMonth int ) -> BEGIN -> SELECT DATE_ADD(date1,INTERVAL NumberOfMonth MONTH) AS ExtendDate; -> END; -> // Query OK, 0 rows affected (0.20 sec) mysql> DELIMITER ;
SHOW CREATE PROCEDUREで存在を確認する
ストアドプロシージャが存在するかどうかを確認するには、SHOW CREATE PROCEDUREコマンドを使用します。プロシージャが存在していればその定義内容が表示され、存在しない場合はエラーが返されます。
クエリは以下の通りです。
mysql> SHOW CREATE PROCEDURE ExtenddatesWithMonthdemo;
以下は、上記で作成したストアドプロシージャの詳細を表示した出力結果です。
+--------------------------+--------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+----------------------+----------------------+--------------------+ | Procedure | sql_mode | Create Procedure | character_set_client | collation_connection | Database Collation | +--------------------------+--------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+----------------------+----------------------+--------------------+ | ExtenddatesWithMonthdemo | STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION | CREATE DEFINER = `root`@`%` PROCEDURE `ExtenddatesWithMonthdemo`(IN date1 datetime, IN NumberOfMonth int ) BEGIN SELECT DATE_ADD(date1,INTERVAL NumberOfMonth MONTH) AS ExtendDate; END | utf8 | utf8_general_ci | utf8_general_ci | +--------------------------+--------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+----------------------+----------------------+--------------------+ 1 row in set (0.00 sec)
このように、プロシージャ名やsql_mode、実際のCREATE文(Create Procedure列)、文字セットなどの情報が一覧で確認できます。
CALL文でストアドプロシージャを実行する
続いて、CALLコマンドを使用して、作成したストアドプロシージャを呼び出します。クエリは以下の通りです。
mysql> call ExtenddatesWithMonthdemo('2019-02-13',6);
出力結果
+---------------------+ | ExtendDate | +---------------------+ | 2019-08-13 00:00:00 | +---------------------+ 1 row in set (0.10 sec) Query OK, 0 rows affected (0.12 sec)
2019年2月13日に6ヶ月を加算した「2019-08-13」が正しく返されていることがわかります。
information_schemaで存在チェックを行う方法(補足)
SHOW CREATE PROCEDUREは、対象が存在しない場合にエラーが発生します。エラーを避けて安全に存在チェックを行いたい場合は、information_schema.ROUTINESテーブルを参照する方法が便利です。
SELECT ROUTINE_NAME FROM information_schema.ROUTINES WHERE ROUTINE_TYPE = 'PROCEDURE' AND ROUTINE_SCHEMA = 'データベース名' AND ROUTINE_NAME = 'ExtenddatesWithMonthdemo';
このクエリは、該当するストアドプロシージャが存在する場合にのみ結果を返します。そのため、シェルスクリプトやアプリケーション内での条件分岐、プロシージャの再作成前のチェックなどにも幅広く活用できます。
-
MySQLストアドプロシージャにおけるDELIMITERの正しい使い方を徹底解説
DELIMITERとは?なぜ必要なのかMySQLクライアントは、デフォルトでセミコロン(;)を文の終端記号として扱います。しかし、ストアドプロシージャの本体には複数のSQL文が含まれ、それぞれがセミコロンで終わるため、そのまま定義すると途中で構文解析が中断されてしまいます。そこで、DELIMITERコマンドを使って、一時的に区切り文字を別の記号(例://)に変更する必要があります。これにより、プロシージャ全体をひとつのまとまりとして登録できるようになります。DELIMITERの正しい記述方法基本的な書き方は以下の通りです。DELIMITER //CREATE PROCEDURE yourSto
-
MySQLのバージョンを確認する方法をわかりやすく解説
この記事では、現在利用しているMySQLサーバーのバージョンを確認する方法について詳しく解説します。コンソールでクエリを実行する前に、まずクライアントがサーバーに正しく接続されていることを確認しておきましょう。接続が確立されていないと、クエリを実行しても結果を取得できません。MySQLのバージョンを確認する基本クエリ以下のクエリを実行すると、使用中のサーバーのバージョン番号と、実行時点の日付を同時に取得できます。mysql> SELECT VERSION(), CURRENT_DATE;ポイント: 関数「VERSION()」や「CURRENT_DATE」は大文字・小文字を区別しません。つ