単元概要

この単元では、ストアドプロシージャやストアドファンクションでも使用できる変数宣言・変数への代入を学びます。

重要なポイント

SQL文での変数代入方法を身に付けよう!

解説

変数宣言および代入

他のプログラム言語と同様に「変数」を宣言し、利用することができます。また、ストアドプロシージャだけでなく、ストアドファンクションでも同様に使用できます

  • 変数宣言:declare [変数名] [型] default [初期値];
  • 代入  :set [変数名] = [値];
  • select文を使った代入:
    select [カラム名] into [変数名]  from [テーブル名];
    ※抽出条件を付けて、1件だけにする必要があります。
delimiter //

drop procedure if exists [プロシージャ名];
create procedure [プロシージャ名](in/out [引数名1] [型],in/out [引数名2] [型])
begin
    declare [変数名] [型] default [初期値];
    set [変数名] = [値];
    select [カラム名] into [変数名] from [テーブル名]
     where [カラム名] = [条件];
end;
//

delimiter ;

<例題>

  • もし、プロシージャ名「pro004_test」がすでにある場合には、削除すること。
  • プロシージャ名「pro004_test」で作成すること。
  • 引数なし
  • 処理
    1. 処理1:変数名「get_test_score」(int型)初期値:0を宣言すること。
    2. 処理2:変数名「get_test_score」に「10」を代入すること。
    3. 処理3:変数名「get_test_score」を表示すること。
delimiter //

drop procedure if exists pro004_test;
create procedure pro004_test()
begin
    declare get_test_score int default 0;
    set get_test_score = 10;
    select get_test_score;
end;
//

delimiter ;

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

<例題>

  • もし、プロシージャ名「pro005_test」がすでにある場合には、削除すること。
  • プロシージャ名「pro005_test」で作成すること。
  • 引数
    • in/out:in
    • 引数名:int_std_id
    • 型:int
  • 処理
    1. 処理1:変数名「get_test_score」(int型)初期値:0を宣言すること。
    2. 処理2:
      1. 学生マスタ(students_mst)からデータを取得すること。
      2. 抽出条件
        • 学生ID(student_id)が〈[int_std_id]〉のデータ
      3. 変数名「get_test_score」にテスト点数(test_score)を代入すること。
    3. 処理3:変数名「get_test_score」を表示すること。
delimiter //

drop procedure if exists pro005_test;
create procedure pro005_test(in int_std_id int)
begin
    declare get_test_score int default 0;
    select sm.test_score into get_test_score from students_mst sm
     where sm.student_id = int_std_id;
    select get_test_score;
end;
//

delimiter ;

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

int型にtrue / falseを設定するとどうなる?

MySQLを学んでいくと変数の型に「true / false」を代入することがあります。その際に、どのようなデータが入っているのか?結果をみてみると、「1 or 0」というデータが代入されています。


-- int型にtrueを設定 --

delimiter //

drop procedure if exists pro006_1_test;
create procedure pro006_1_test()
begin
    declare get_test_score int default true;
    select get_test_score;
end;
//

delimiter ;

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


-- int型にfalseを設定 --

delimiter //

drop procedure if exists pro006_2_test;
create procedure pro006_2_test()
begin
    declare get_test_score int default false;
    select get_test_score;
end;
//

delimiter ;

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

また、boolean型の場合もどのようなデータが入っているのか?を確認してみよう。


-- boolean型にtrueを設定 --

delimiter //

drop procedure if exists pro007_1_test;
create procedure pro007_1_test()
begin
    declare get_test_score boolean default true;
    select get_test_score;
end;
//

delimiter ;

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


-- boolean型にfalseを設定 --

delimiter //

drop procedure if exists pro007_2_test;
create procedure pro007_2_test()
begin
    declare get_test_score boolean default false;
    select get_test_score;
end;
//

delimiter ;

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

結果を見てもらうと同じなのが分かります。MySQLでのtrue/falseは、int型の「1/0」を使用していると思っておくと良いかと思います。


-- trueを入れた場合
+----------------+
| get_test_score |
+----------------+
|              1 |
+----------------+

-- falseを入れた場合
+----------------+
| get_test_score |
+----------------+
|              0 |
+----------------+