単元概要

この単元では、ストアドプロシージャの記述の仕方とSQL文をプログラム言語のように使うための基本を学びます。

重要なポイント

ストアドプロシージャでプログラミングのような構文が記述できる!

解説

基本構文

MySQLで記述する場合には「delimiter(デリミタ)」を記述します。

ストアドプロシージャを作成する場合、引数を設定することができます。

  • in/out
    • inは、ストアドプロシージャへ「引数(渡す値)」であることを示します。
    • outは、ストアドプロシージャからの「戻り値」であることを示します。
  • 引数名
    • ストアドプロシージャ内で利用できる値となります。
    • 引数の型を設定できます。(例:int,varcharなど)
delimiter //

create procedure [プロシージャ名](in/out [引数名1] [型],in/out [引数名2] [型])
begin
    [処理1]
    [処理2]
end;
//

delimiter ;
/* ストアドプロシージャを呼び出す */
call [ストアドプロシージャ名]([引数]);

<例題>

  • プロシージャ名「pro001_test」で作成すること。
  • 引数
    • in/out:in
    • 引数名:int_std_id
    • 型:int
  • 処理
    1. 処理1
      1. 学生マスタ(students_mst)からデータを取得すること。
      2. 抽出条件
        • 学生ID(student_id)が〈[int_std_id]〉のデータ
      3. カラム:すべてのカラムを抽出すること。
delimiter //

create procedure pro002_test(in int_std_id int)
begin
    select * from students_mst sm
     where sm.student_id = int_std_id;
end;
//

delimiter ;
call pro002_test(1);

削除/作成を一覧の流れにする

ストアドプロシージャを削除する場合には、「drop procedure [プロシージャ名];」で行うことができます。ただ、削除して作成するという流れは、何度も繰り返すため、「if exists」を加え、もし対象となる「プロシージャ名」があれば削除するという記述にすると今後、開発が楽になります。

delimiter //

drop procedure if exists [プロシージャ名];
create procedure [プロシージャ名](in/out [引数名1] [型],in/out [引数名2] [型])
begin
    [処理1]
    [処理2]
end;
//

delimiter ;

<例題>

  • もし、プロシージャ名「pro003_test」がすでにある場合には、削除すること。
  • プロシージャ名「pro003_test」で作成すること。
  • 引数
    • in/out:in
    • 引数名:int_std_id
    • 型:int
  • 処理
    1. 処理1
      1. 学生マスタ(students_mst)からデータを取得すること。
      2. 抽出条件
        • 学生ID(student_id)が〈[int_std_id]〉のデータ
      3. カラム:すべてのカラムを抽出すること。
delimiter //

drop procedure if exists pro003_test;  #追加
create procedure pro003_test(in int_std_id int)
begin
    select * from students_mst sm
     where sm.student_id = int_std_id;
end;
//

delimiter ;

/* ストアドプロシージャを呼び出す */
call pro003_test(1);