PL/SQLの勉強4 分岐について(IF文とか)
今回はプログラムの基本的な構造について
お話ししていきます。
どのプログラミング言語も一緒で
以下の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
今回は順次・分岐・繰り返しの
「分岐」を中心にお話ししていきました。
次回は「反復」のお話ができればと思っています。
Discussion
New Comments
No comments yet. Be the first one!