PL/SQLの勉強4 分岐について(IF文とか)

2022-10-20

今回はプログラムの基本的な構造について
お話ししていきます。

どのプログラミング言語も一緒で
以下の3つが分かっていれば
大抵のことが出来るとされています。

  • 順次
  • 分岐
  • 反復

「順次」とは、上から順に…という意味。
上から順に、書かれている通りに、1行ずつやっていくよ〜
ということです。

そして今回は「分岐」について
お話しできれば、と思っています。

分岐とは…

分岐…もっと言ってしまうと「条件分岐」です。

この時はこう!
あの時はこう!
みたいな感じです。

例えば以下のような動作をしたい時…

「値が1か?」と書いている部分が分岐です。
yesとnoで出力する結果が違ってますね。

これをPL/SQLで書けるようになるのが
今日の目標です。

IF文

「もし◯◯だったら…」
と考えればいいです。

「もし」って、英語で言うと「IF」ですよね!
簡単!w

IF文の超基本

以下のように書きますよ。

declare
  v_num  NUMBER;
begin
  -- 変数に1を代入
  v_num := 1;
  
  -- 分岐してみる
  if v_num = 1 then
    dbms_output.put_line('この時!');
  else
    dbms_output.put_line('あの時!');
  end if;
  
end;

if <何かの条件> then
って書きます。

そして最後は
end if;
で終わります。

v_numが1の時は9行目に入りますが
その他だったら、つまり「else」の場合は
11行目に入ります。

…ので、結果は以下のようになりますね!

結果が「この時!」って出てる!
そして「あの時!」は出ていない!
こんな動作をします。

じゃあv_numの値を
適当に変えてみたらどうなるでしょうか…?

今度は「この時!」は出ていない!
そして「あの時!」って出てる!

「v_numに入っている10」と「1」はイコールではないので
elseの方に行くんですね。

IF文の条件が複数

例えば以下のように
「1の時はこう!」
「2の時はこう!」
「それ以外はこう!」
と複数の条件を指定したいときがあります。

この場合はどうするか…
「elsif」というものを使います。

意味的には「else if」なんですが
なぜかPL/SQLはそこを略して
「elsif」ってやるんですよね。。。

ということで、以下のように書きます。

declare
  v_num  NUMBER;
begin
  -- 変数に1を代入
  v_num := 2;
  
  -- 分岐してみる
  if v_num = 1 then
    dbms_output.put_line('この時!');
  elsif v_num = 2 then
    dbms_output.put_line('その時!');
  else
    dbms_output.put_line('あの時!');
  end if;
  
end;

さっそく実行してみましょう。

v_numに2が入っているので
結果は「その時!」になってますね。

IF文の条件が複数あるときの注意点

例えば以下のIF文を見てみてください。
問題です…結果は何が表示されますか?

declare
  v_hoge  VARCHAR2(30);
  v_num   NUMBER;
begin
  -- v_hogeに値を代入
  v_hoge := 'お腹すいた';
  -- v_numに値を代入
  v_num := 1;
  
  -- 分岐してみる
  if v_hoge = 'お腹すいた' then
    dbms_output.put_line('焼肉行こう!');
  elsif v_num = 1 then
    dbms_output.put_line('寿司食べよう!');
  else
    dbms_output.put_line('断食しよう!');
  end if;
  
end;

11行目の「if v_hoge = 'お腹すいた’ then」も
13行目の「elsif v_num = 1 then」も
条件的には合っています。

つまり、両方の条件に合致しているので
両方の結果が表示される…?

正解は以下の通りです。

「焼肉行こう!」だけ。

つまり、両方の条件に合致している場合
上の方に書いてある方が優先されます。

優先順位を意識してプログラムを書く必要がありますね!

CASE文

PL/SQLの分岐はIF分だけではありません。
CASE文というものを使う方法もあります。

とは言いつつも
僕はCASE文でプログラムを書いたことがありません。
存在を知っているだけです。

何でCASE文で書かないかと言うと
他のプログラム言語でも「分岐」と言ったら「IF」だから。

覚えることは少ない方が嬉しいじゃん?
で、IFもCASEも同じ動作なんだったら
CASEでやる必要なんてどこにもないじゃん!

…って感じに思ってるからです。

CASE文についてはサラッと、
こんな感じに書くよ〜ってだけで。。。

declare
  v_num   NUMBER;
begin
  -- v_numに値を代入
  v_num := 1;
  
  -- 分岐してみる
  case
    when v_num = 1 then
      dbms_output.put_line('この時!');
    when v_num = 2 then
      dbms_output.put_line('その時!');
    else
      dbms_output.put_line('あの時!');
  end case;
  
end;

結果は「この時!」が出力されます。
雰囲気で分かってくれたら嬉しいなってw

特に検証する変数が1つだけの時は
以下のようにも書けます。

declare
  v_num   NUMBER;
begin
  -- v_numに値を代入
  v_num := 1;
  
  -- 分岐してみる
  case v_num
    when 1 then
      dbms_output.put_line('この時!');
    when 2 then
      dbms_output.put_line('その時!');
    else
      dbms_output.put_line('あの時!');
  end case;
  
end;

こちらも結果は一緒で
「この時!」が出力されます。

以上ですw

どうでしたか?
何だか今まで以上に
プログラミングっぽくなってきましたw

今回は順次・分岐・繰り返しの
「分岐」を中心にお話ししていきました。

次回は「反復」のお話ができればと思っています。

PL/SQL

Posted by kiri