今日はなにの日。

気になったこと勉強になったことのメモ。

今日は、ストアドプロシージャについて知識編の日。

とある日

MySQLで開発を行っていて、今まではプログラムでSQLを作成してDBへ問い合わせる方式を行っていたが、勉強のためストアドプロシージャとやらを使ってみようと思った。

なので、その過程を記録する。

まずは、情報収集を行う。

※日本語のドキュメントのバージョンが5.6しかないので今回記述する内容はMySQL5.6のものとなります。

ストアドプロシージャとは

現段階で自分が知っているストアドプロシージャの知識

  • サーバ間の通信量を削減できる

  • DBMSによって形式が異なるので互換性がない

現状のストアドプロシージャに対する知識はあまりない。

調べてみた

  • 戻り値がない

  • テーブルに対してロックを掛ける

  • ストアドファンクションというにてるものが存在する

ドキュメント1を見てたら下記の記述を見つけた。

そのプロシージャーを別のストアドプロシージャーまたはストアドファンクション内から呼び出している場合は、IN または INOUT パラメータとしてルーチンパラメータまたはローカルルーチン変数を渡すこともできます。

ストアドプロシージャから別のストアドプロシージャを呼ぶとかあるんだと初めて知った。

ってことは、ストアドプロシージャからいろんなストアドプロシージャを呼び出して複雑なストアドプロシージャが構成されてるやつとかありそうだなと思った。

似て非なるものストアドファンクション

調べてて出てきたストアドファンクションとやらにも少し知見を増やす。

基本的には、ストアドプロシージャと同じ。

  • 戻り値がある

  • ストアドプロシージャに比べて速度が遅い

ここで疑問

調べてて、ストアドプロシージャとストアドファンクションの違いは様々なサイトで戻り値があるって記述があり、ストアドプロシージャもSELECTの結果返るよなと思ってでも、クエリの結果は戻り値とは言わないのかなと真相をドキュメントで探してみた。

それっぽいの2を見つけた。

プロシージャーは CALL ステートメントを使用して呼び出され (セクション13.2.1「CALL 構文」を参照してください)、出力変数の使用でのみ値を戻すことができます。関数は、ほかの関数とまったく同様に (つまり、関数の名前を呼び出すことによって) ステートメント内部から呼び出すことができ、スカラー値を戻すことができます。

出力変数ってのがストアドプロシージャで使用できるOUT または INOUT パラメータだと思われる。

ドキュメントを見る限りどっちも値戻すみたいですな。

CALLした結果は、戻り値とは言わないみたいですね。

ひょっとしたら、CALLが値を返してるからストアドプロシージャ単体では値が返らないのかも。

この謎は、また別の機会に・・・。

両者の非なる所

機能の非

様々記事やドキュメントを見て、自分が見つけたおもしろい違いが一つあったのでそれを記述する。

f:id:Updraft:20200704162148p:plain

トランザクションを処理したい時は、ストアドプロシージャを使用するしかないようですね。

まぁ、ストアドプロシージャ内でトランザクション処理なんてするのか想像できないですけど。

用途の非

ストアドプロシージャ

  • ストアドプロシージャ単体として使用される。

delimiter //
CREATE PROCEDURE simpleproc ()
    BEGIN
        SELECT COUNT() FROM members m ;
    END//
delimiter ;
mysql>  call test.simpleproc();
+----------+
| COUNT() |
+----------+
|    10000 |
+----------+
1 row in set (0.07 sec)
Query OK, 0 rows affected (0.07 sec)

ストアドファンクション

  • SQLの中で特定の値が欲しいときに使用される。

mysql> CREATE FUNCTION hello (s CHAR(20))
    -> RETURNS CHAR(50) DETERMINISTIC
    ->     RETURN CONCAT('Hello, ',s,'!');
Query OK, 0 rows affected (0.13 sec)
mysql> select hello('world');
+----------------+
| hello('world') |
+----------------+
| Hello, world!  |
+----------------+
1 row in set (0.00 sec)

まとめ

かなり、勉強となった。

もちろん、ストアドプロシージャもストアドファンクションも奥が深いのでまだ知らないことも多い。

調べてて謎も出てきたりしたので今後調べてみたい。

次は、実際にストアドプロシージャを作成してみる。