Documentation Home
MySQL 5.6 リファレンスマニュアル
Download this Manual
PDF (US Ltr) - 27.1Mb
PDF (A4) - 27.2Mb
HTML Download (TGZ) - 7.2Mb
HTML Download (Zip) - 7.2Mb


MySQL 5.6 リファレンスマニュアル  /  ストアドプログラムおよびビュー  /  ストアドルーチン (プロシージャーと関数) の使用

20.2 ストアドルーチン (プロシージャーと関数) の使用

ストアドルーチン (プロシージャーおよび関数) は MySQL 5.6 でサポートされています。ストアドルーチンとは、サーバーに格納できる一連の SQL ステートメントです。これが行われていると、クライアントは個々のステートメントを繰り返し発行し続ける必要はなく、代わりにストアドルーチンを参照できます。

ストアドルーチンには、mysql データベース内の proc テーブルが必要です。このテーブルは、MySQL 5.6 インストール手順中に作成されます。以前のバージョンから MySQL 5.6 にアップグレードしている場合、必ず付与テーブルを更新して、proc テーブルの存在を確認してください。セクション4.4.7「mysql_upgrade — MySQL テーブルのチェックとアップグレード」を参照してください。

ストアドルーチンは特に、次のような特定の状況で役立ちます。

  • クライアントアプリケーションが異なる言語で作成されているか、異なるプラットフォームで動作しているが、同じデータベース操作を実行する必要がある場合。

  • セキュリティーが最重要である場合。たとえば、銀行では、すべての一般的な操作に対してストアドプロシージャーおよびストアドファンクションを使用します。これにより一貫したセキュアな環境が得られ、ルーチンによってそれぞれの操作が正しく記録されるようになります。このようなセットアップでは、アプリケーションおよびユーザーはデータベーステーブルに直接アクセスできませんが、特定のストアドルーチンだけを実行できます。

ストアドルーチンは、サーバーとクライアント間で送信する必要のある情報が少なくなるので、パフォーマンスを改善できます。そのトレードオフでは、これによりサーバー側で行われる作業が増え、クライアント (アプリケーション) 側で行われる作業が少なくなるので、データベースサーバーでのロードが増大します。1 台または少数のデータベースサーバーだけで多数のクライアントマシン (Web サーバーなど) にサービスを提供している場合にはこれを検討してください。

ストアドルーチンを使用すれば、データベースサーバーで関数のライブラリを保持することもできます。これは、内部的に (たとえばクラスを使用して) このような設計を可能にする、現代のアプリケーション言語で共有されている機能です。これらのクライアントアプリケーションの言語機能を使用すると、データベース使用のスコープ外でもプログラマにとって利点があります。

MySQL はストアドルーチンについて SQL:2003 構文に従っており、これは IBM の DB2 でも使用されています。ここで説明するすべての構文はサポートされており、すべての制限と拡張が適宜ドキュメント化されています。

追加のリソース


User Comments
  Posted by ALEXANDER SKAKUNOV on March 26, 2013
Debugging your functions. It's not as simple as in usual programming languages. If you want to log messages from a function or a stored procedure, you can go use these ways of debugging.

1. You can include simple SELECT, so if you run the SQL file from command line in verbose mode, you will see it:

[code]
# my-function.sql file with function definition
SELECT 'started a big job', NOW();
#your function contents goes here
[/code]

> mysql -uroot -v database < my-function.sql

2. Another way to go is to use a separate table to collect logs (the one that we use it for http://zillion.com.ua/ ) is to use a special debug stored procedure.
To simplify it, you can use a function like that:

[code]
DELIMITER //

DROP PROCEDURE IF EXISTS Debug; //
CREATE PROCEDURE Debug(Message TEXT)
BEGIN
CREATE TABLE IF NOT EXISTS _debug (
`id` int(10) unsigned NOT NULL auto_increment,
`msg` TEXT DEFAULT NULL,
`created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`id`)
);
INSERT INTO _debug(`msg`) VALUES(Message);
END; //

DROP PROCEDURE IF EXISTS ClearDebugMessages; //
CREATE PROCEDURE ClearDebugMessages()
BEGIN
TRUNCATE TABLE _debug;
END; //
[/code]

Use this to log a message: CALL Debug('My message');
And this to clear all messages logged: CALL ClearDebugMessages;

All your messages are going to be in `_debug` table with timestamp of message automatically set.
Sign Up Login You must be logged in to post a comment.