Documentation Home
MySQL 5.6 リファレンスマニュアル
Download this Manual
EPUB - 7.5Mb
HTML Download (TGZ) - 7.2Mb
HTML Download (Zip) - 7.2Mb


MySQL 5.6 リファレンスマニュアル  /  MySQL 5.6 のよくある質問  /  MySQL 5.6 FAQ: ストアドプロシージャーおよびストアドファンクション

A.4 MySQL 5.6 FAQ: ストアドプロシージャーおよびストアドファンクション

A.4.1. MySQL 5.6 はストアドプロシージャーおよびストアドファンクションをサポートしていますか。
A.4.2. MySQL のストアドプロシージャーおよびストアドファンクションについてのドキュメントはどこにありますか。
A.4.3. MySQL のストアドプロシージャーのディスカッションフォーラムはありますか。
A.4.4. ストアドプロシージャーの ANSI SQL 2003 仕様はどこにありますか。
A.4.5. ストアドルーチンを管理するにはどうすればよいですか。
A.4.6. 特定のデータベースのすべてのストアドプロシージャーおよびストアドファンクションを表示する方法はありますか。
A.4.7. ストアドプロシージャーはどこに格納されますか。
A.4.8. ストアドプロシージャーまたはストアドファンクションをパッケージにグループ化することはできますか。
A.4.9. ストアドプロシージャーは別のストアドプロシージャーを呼び出すことができますか。
A.4.10. ストアドプロシージャーはトリガーを呼び出すことができますか。
A.4.11. ストアドプロシージャーはテーブルにアクセスできますか。
A.4.12. ストアドプロシージャーには、アプリケーションエラーを発生させるステートメントはありますか。
A.4.13. ストアドプロシージャーには例外処理はありますか。
A.4.14. MySQL 5.6 のストアドルーチンは結果セットを返すことができますか。
A.4.15. ストアドプロシージャーで WITH RECOMPILE はサポートされますか。
A.4.16. mod_plsql を Apache のゲートウェイとして使用してデータベース内のストアドプロシージャーと直接やり取りするのと同等の機能は MySQL にありますか。
A.4.17. ストアドプロシージャーに入力として配列を渡すことはできますか。
A.4.18. ストアドプロシージャーに IN パラメータとしてカーソルを渡すことはできますか。
A.4.19. ストアドプロシージャーの OUT パラメータとしてカーソルを返すことはできますか。
A.4.20. デバッグのために、ストアドルーチン内の変数の値を出力できますか。
A.4.21. ストアドプロシージャー内でトランザクションをコミットまたはロールバックできますか。
A.4.22. MySQL 5.6 のストアドプロシージャーおよびストアドファンクションはレプリケーションで動作しますか。
A.4.23. マスターサーバーで作成されたストアドプロシージャーおよびストアドファンクションはスレーブにレプリケートされますか。
A.4.24. ストアドプロシージャーおよびストアドファンクション内で実行されたアクションはどのようにレプリケートされますか。
A.4.25. レプリケーションでストアドプロシージャーおよびストアドファンクションを使用するための特別なセキュリティー要件はありますか。
A.4.26. ストアドプロシージャーおよびストアドファンクションのアクションをレプリケートする場合の制限は何ですか。
A.4.27. 前述の制限は MySQL のポイントインタイムリカバリを行う機能に影響しますか。
A.4.28. 前述の制限を修正するために何が行われていますか。

A.4.1.

MySQL 5.6 はストアドプロシージャーおよびストアドファンクションをサポートしていますか。

はい。MySQL 5.6 は 2 種類のストアドルーチン (ストアドプロシージャーおよびストアドファンクション) をサポートしています。

A.4.2.

MySQL のストアドプロシージャーおよびストアドファンクションについてのドキュメントはどこにありますか。

セクション20.2「ストアドルーチン (プロシージャーと関数) の使用」を参照してください。

A.4.3.

MySQL のストアドプロシージャーのディスカッションフォーラムはありますか。

はい。http://forums.mysql.com/list.php?98 を参照してください。

A.4.4.

ストアドプロシージャーの ANSI SQL 2003 仕様はどこにありますか。

残念ながら、正式な仕様は無料では入手できません (ANSI は有料で販売しています)。ただし、標準の包括的な概要を説明した (ストアドプロシージャーの説明を含む)、Peter Gulutzan および Trudy Pelzer 著の『SQL-99 Complete, Really』などの本があります。

A.4.5.

ストアドルーチンを管理するにはどうすればよいですか。

ストアドルーチンに明快な命名スキームを使用することはよい管理方法です。ストアドプロシージャーは、CREATE [FUNCTION|PROCEDURE]ALTER [FUNCTION|PROCEDURE]DROP [FUNCTION|PROCEDURE]、および SHOW CREATE [FUNCTION|PROCEDURE] を使用して管理できます。既存のストアドプロシージャーに関する情報を取得するには、INFORMATION_SCHEMA データベースの ROUTINES テーブル (セクション21.18「INFORMATION_SCHEMA ROUTINES テーブル」を参照してください) を使用します。

A.4.6.

特定のデータベースのすべてのストアドプロシージャーおよびストアドファンクションを表示する方法はありますか。

はい。dbname という名前のデータベースの場合、INFORMATION_SCHEMA.ROUTINES テーブルに対して次のクエリーを使用します。

SELECT ROUTINE_TYPE, ROUTINE_NAME
    FROM INFORMATION_SCHEMA.ROUTINES
    WHERE ROUTINE_SCHEMA='dbname';

詳細は、セクション21.18「INFORMATION_SCHEMA ROUTINES テーブル」を参照してください。

ストアドルーチンの本体は、SHOW CREATE FUNCTION (ストアドファンクションの場合) または SHOW CREATE PROCEDURE (ストアドプロシージャーの場合) を使用して表示できます。詳細は、セクション13.7.5.11「SHOW CREATE PROCEDURE 構文」を参照してください。

A.4.7.

ストアドプロシージャーはどこに格納されますか。

mysql システムデータベースの proc テーブルに格納されます。ただし、システムデータベースのテーブルに直接アクセスしないでください。代わりに、ストアドファンクションに関する情報を取得するには SHOW CREATE FUNCTION、およびストアドプロシージャーに関する情報を取得するには SHOW CREATE PROCEDURE を使用します。これらのステートメントについては、セクション13.7.5.11「SHOW CREATE PROCEDURE 構文」を参照してください。

INFORMATION_SCHEMA データベースの ROUTINES テーブルにクエリーすることもできます。このテーブルの情報については、セクション21.18「INFORMATION_SCHEMA ROUTINES テーブル」を参照してください。

A.4.8.

ストアドプロシージャーまたはストアドファンクションをパッケージにグループ化することはできますか。

いいえ。これは MySQL 5.6 ではサポートされません。

A.4.9.

ストアドプロシージャーは別のストアドプロシージャーを呼び出すことができますか。

はい。

A.4.10.

ストアドプロシージャーはトリガーを呼び出すことができますか。

ストアドプロシージャーでは、トリガーが実行される UPDATE などの SQL ステートメントを実行できます。

A.4.11.

ストアドプロシージャーはテーブルにアクセスできますか。

はい。ストアドプロシージャーは、必要に応じて 1 つ以上のテーブルにアクセスできます。

A.4.12.

ストアドプロシージャーには、アプリケーションエラーを発生させるステートメントはありますか。

はい。MySQL 5.6 には、SQL 標準の SIGNAL ステートメントおよび RESIGNAL ステートメントが実装されています。セクション13.6.7「条件の処理」を参照してください。

A.4.13.

ストアドプロシージャーには例外処理はありますか。

MySQL には、SQL 標準に従った HANDLER 定義が実装されています。詳細は、セクション13.6.7.2「DECLARE ... HANDLER 構文」を参照してください。

A.4.14.

MySQL 5.6 のストアドルーチンは結果セットを返すことができますか。

ストアドプロシージャーは返すことができますが、ストアドファンクションは返すことができません。ストアドプロシージャー内で通常の SELECT を実行すると、結果セットがクライアントに直接返されます。これが動作するようにするには、MySQL 4.1 (以降) のクライアント/サーバープロトコルを使用する必要があります。これは、たとえば PHP では、古い mysql 拡張ではなく mysqli 拡張を使用する必要があることを意味します。

A.4.15.

ストアドプロシージャーで WITH RECOMPILE はサポートされますか。

MySQL 5.6 にはありません。

A.4.16.

mod_plsql を Apache のゲートウェイとして使用してデータベース内のストアドプロシージャーと直接やり取りするのと同等の機能は MySQL にありますか。

MySQL 5.6 には同等の機能はありません。

A.4.17.

ストアドプロシージャーに入力として配列を渡すことはできますか。

MySQL 5.6 にはありません。

A.4.18.

ストアドプロシージャーに IN パラメータとしてカーソルを渡すことはできますか。

MySQL 5.6 では、カーソルはストアドプロシージャーの内部でのみ使用できます。

A.4.19.

ストアドプロシージャーの OUT パラメータとしてカーソルを返すことはできますか。

MySQL 5.6 では、カーソルはストアドプロシージャーの内部でのみ使用できます。ただし、SELECT でカーソルを開かない場合、結果はクライアントに直接送信されます。変数に対して SELECT INTO を発行することもできます。セクション13.2.9「SELECT 構文」を参照してください。

A.4.20.

デバッグのために、ストアドルーチン内の変数の値を出力できますか。

はい。これは、ストアドプロシージャーでは行うことができますが、ストアドファンクションでは行うことはできません。ストアドプロシージャー内で通常の SELECT を実行すると、結果セットがクライアントに直接返されます。これが動作するようにするには、MySQL 4.1 (以降) のクライアント/サーバープロトコルを使用する必要があります。これは、たとえば PHP では、古い mysql 拡張ではなく mysqli 拡張を使用する必要があることを意味します。

A.4.21.

ストアドプロシージャー内でトランザクションをコミットまたはロールバックできますか。

はい。ただし、ストアドファンクション内でトランザクション操作を実行することはできません。

A.4.22.

MySQL 5.6 のストアドプロシージャーおよびストアドファンクションはレプリケーションで動作しますか。

はい。ストアドプロシージャーおよびストアドファンクションで実行された通常のアクションは、マスター MySQL サーバーからスレーブサーバーにレプリケートされます。セクション20.7「ストアドプログラムのバイナリロギング」で詳しく説明されているいくつかの制限があります。

A.4.23.

マスターサーバーで作成されたストアドプロシージャーおよびストアドファンクションはスレーブにレプリケートされますか。

はい。マスターサーバーで通常の DDL ステートメントを使用して実行されたストアドプロシージャーおよびストアドファンクションの作成はスレーブにレプリケートされるため、オブジェクトは両方のサーバーに存在します。ストアドプロシージャーおよびストアドファンクションに対する ALTER ステートメントおよび DROP ステートメントもレプリケートされます。

A.4.24.

ストアドプロシージャーおよびストアドファンクション内で実行されたアクションはどのようにレプリケートされますか。

MySQL は、ストアドプロシージャーで行われた各 DML イベントを記録し、それらの個々のアクションをスレーブサーバーにレプリケートします。ストアドプロシージャーを実行するために行われた実際の呼び出しはレプリケートされません。

データを変更するストアドファンクションは、各ファンクション内で行われた DML イベントとしてではなく、関数呼び出しとしてログ記録されます。

A.4.25.

レプリケーションでストアドプロシージャーおよびストアドファンクションを使用するための特別なセキュリティー要件はありますか。

はい。スレーブサーバーにはマスターのバイナリログから読み取ったステートメントを実行する権限があるため、レプリケーションでストアドファンクションを使用するための特殊なセキュリティー制約が存在します。レプリケーションまたは一般のバイナリロギング (ポイントインタイムリカバリのための) がアクティブである場合、MySQL の DBA には選択できるセキュリティーオプションが 2 つあります。

  1. ストアドファンクションを作成するユーザーに、SUPER 権限を付与する必要があります。

  2. または、DBA は log_bin_trust_function_creators システム変数に 1 を設定できます。これにより、標準の CREATE ROUTINE 権限を持ったユーザーがストアドファンクションを作成できます。

A.4.26.

ストアドプロシージャーおよびストアドファンクションのアクションをレプリケートする場合の制限は何ですか。

ストアドプロシージャーに埋め込まれている決定性のない (ランダムな) アクションまたは時間ベースのアクションは、正しくレプリケートされないことがあります。その特性により、ランダムに生成された結果は予測できず、正確に再現できません。このため、スレーブにレプリケートされたランダムアクションは、マスターで実行されたアクションとは異なります。ストアドファンクションを DETERMINISTIC として宣言した場合、または log_bin_trust_function_creators システム変数に 0 を設定した場合は、ランダムに値が設定される操作を呼び出すことはできません。

また、時間ベースのアクションはスレーブで再現できません。ストアドプロシージャーのそのようなアクションのタイミングは、レプリケーションに使用されるバイナリログを介して再現できないためです。バイナリログには、DML イベントのみが記録され、タイミング制約は含まれていません。

最後に、非トランザクションテーブルで大きい DML アクション (一括挿入など) 中にエラーが発生した場合、マスターは DML アクティビティーによって部分的に更新されたがスレーブが更新されず、レプリケーションの問題が発生することがあります。回避策は、関数の DML アクションを IGNORE キーワードを指定して実行することであり、マスターでエラーが発生した更新が無視され、エラーが発生しなかった更新がスレーブにレプリケートされるようにします。

A.4.27.

前述の制限は MySQL のポイントインタイムリカバリを行う機能に影響しますか。

レプリケーションに影響する制限が、ポイントインタイムリカバリに同様に影響します。

A.4.28.

前述の制限を修正するために何が行われていますか。

ステートメントベースのレプリケーションまたは行ベースのレプリケーションのいずれかを選択できます。元のレプリケーションの実装は、ステートメントベースのバイナリロギングに基づいています。行ベースのバイナリロギングによって、前述の制限が解決されます。

複合レプリケーションも使用できます (--binlog-format=mixed を指定してサーバーを起動します)。このハイブリッドの賢い形式のレプリケーションは、ステートメントレベルのレプリケーションを安全に使用できるかどうか、または行レベルのレプリケーションが必要であるかを判断します。

追加情報については、セクション17.1.2「レプリケーション形式」を参照してください。


User Comments
Sign Up Login You must be logged in to post a comment.