読者です 読者をやめる 読者になる 読者になる

ただの技術者ぶろぐ

大阪に住んでる技術者が書く覚書ぶろぐ。

MySQLのストアドとファンクションで遊ぶ その1

技術話 MySQL ストアドプロシージャ

(2017/01/23記事)

あまりMySQL技術本とかでも紹介されないストアドプロシージャやファンクションですが、使えるようになると凄く便利です。

もっと使う人が増えて欲しいのでブログ記事にしてみます。

まず簡単なやつから

DELIMITER $$
CREATE  PROCEDURE `demo_procedure`()
BEGIN
   ~処理~
END$$
DELIMITER ;

これがストアドプロシージャの基本的な構文です。 この構文のBEGIN~ENDの処理の中を書くことで、機能を実装します。

プログラム上下に記述されている DELIMITER $$、DELIMITER ;は 区切り文字(ここでストアドは終わりという記号)を切り替えています。

ストアドのデフォルトの区切り文字は、「;」です。 BEGIN~ENDのなかに

BEGIN
   select 'hogehoge' as display_text ;
END;

といった風に処理を加えると、 BEGIN句から始まった処理がdisplay_text ;で終わってしまったと 解釈されてしまいます。構文エラーの発生です。

それを防ぐ為に、 DELIMITER $$で「ストアドプロシージャの区切り文字を$$に変更する」とし、 最後にDELIMITER ;を定義することで「元に戻す」としてるわけです。

ちなみに$$は別の文字でも構いません。「||」とか「\\」とかでも。 ただ、ストアド内で使う可能性のある文字を使うと後で困りますし、 MySQLWorkbenchというMySQL純正の管理ツールでは$$となってるので、 それに沿わせるのが無難だと思います。

先ほどBEGIN~ENDのなかに~と説明を入れましたが、 MySQLでこのBEGIN~ENDの中のことを「ブロック」と呼びます。 このブロックがBEGINから始まり、ENDで終わっている事を判断して 一連の処理とMySQLが解釈しています。

(例) 呼び出すとカラム名「display_text」の[hogehoge]というテキスト結果を返すストアドプロシージャ

DELIMITER $$
CREATE  PROCEDURE `demo_procedure`()
BEGIN
   select 'hogehoge' as display_text;
END$$
DELIMITER ;

プログラムの実行

f:id:rock-3:20170123115736j:plain

終わりです。

次は変数の利用と処理の実行辺りを書きます。