重要なポイント

ストアドプロシージャとストアドファンクションの2つを覚えよう!

解説

ストアドルーチンとは、CやJAVAなどのプログラム言語では、「関数」のようなものになります。一連の処理を事前に定義しておき、いつでも呼び出し使用できる状態にしたものです。

今までのようなシンプルなSQL文だけでなく、IF文や条件分岐、ループ文、変数定義などができるため、幅広い処理を記述することが可能となります。

また、ストアドルーチンは、事前にコンパイルされているため、普通のSQL文を実行するよりも処理速度が速くなります。但し、DBサーバの処理が増えるため負荷が増大する点は注意していきましょう。

ストアドルーチンの種類

 

ストアドルーチンには、2つの種類があります。大きな違いをあげると「プロシージャには戻り値がないが、ファンクションには戻り値がある」という点です。

  • ストアドプロシージャ
    呼び出しに「call」を利用します。returnのような戻り値は設定できませんが、引数を利用して戻すことは可能です。
  • ストアドファンクション(別名:ユーザ定義関数)
    SQL文でいう「max」や「sum」のような使い方ができるのが特徴です。

DELIMITER(デリミタ)を切り替える

「delimiter(デリミタ)」とは、「区切り」や「範囲の始まりと終わり」を表す記号となります。MySQLの場合は「;(セミコロン)」を利用して区切りを表しています。MySQLでストアドルーチン(ストアドプロシージャ/ストアドファンクション)を登録するには、「delimiter(デリミタ)」を変更する必要があります。※変更しないとエラーが発生します。

  • 1行目の「delimiter //」では、区切り文字を「;(セミコロン)」から「//(スラッシュ2つ)」に変更します。
  • 15行目の「delimiter ;」では、区切り文字を「//(スラッシュ2つ)」から「;(セミコロン)」に戻します。※戻し忘れしないように注意しましょう!
delimiter //

drop procedure if exists pro001_test;
create procedure pro001_test(in std_no int)
begin
    declare get_test_su int;
    select sm.test_su into get_test_su from student_mst sm
    where sm.student_no = std_no;

    if get_test_su > 90 then
        select 'OK' as status;
    else
        select 'NG' as status;
    end if;
end;
//

delimiter ;