制御構造
条件分岐(IF THEN ELSE)
DECLARE
v_score NUMBER := 85;
BEGIN
-- 条件分岐の開始
IF v_score >= 90 THEN
-- v_score が 90 以上の場合の処理
DBMS_OUTPUT.PUT_LINE('Grade: A');
ELSIF v_score >= 80 THEN
-- v_score が 80 以上 90 未満の場合の処理
DBMS_OUTPUT.PUT_LINE('Grade: B');
ELSE
-- 上記以外の場合の処理
DBMS_OUTPUT.PUT_LINE('Grade: C');
END IF; -- IF ブロックの終了
END;
ループ(LOOP, WHILE LOOP, FOR LOOP)
LOOP
LOOP文は、条件が満たされるまで繰り返し処理を行うための構造です。LOOPは明示的にEXIT文で終了条件を指定するまで実行され続けます。
-- LOOP
DECLARE
v_counter NUMBER := 1; -- ループカウンタを1に初期化
BEGIN
LOOP
-- v_counterが5を超えたらループを終了
EXIT WHEN v_counter > 5;
-- 現在のカウンタの値を出力
DBMS_OUTPUT.PUT_LINE('Counter: ' || v_counter);
-- カウンタを1増やす
v_counter := v_counter + 1;
END LOOP; -- ループの終了
END;
WHILE LOOP
WHILE LOOPは、指定された条件が真の間、繰り返し処理を行います。条件が最初に評価され、条件が満たされる限りループ内の処理が実行されます。
-- WHILE LOOP
DECLARE
v_counter NUMBER := 1; -- ループカウンタを1に初期化
BEGIN
-- v_counterが5以下である限り、ループを実行
WHILE v_counter <= 5 LOOP
-- 現在のカウンタの値を出力
DBMS_OUTPUT.PUT_LINE('Counter: ' || v_counter);
-- カウンタを1増やす
v_counter := v_counter + 1;
END LOOP; -- ループの終了
END;
FOR LOOP
FOR LOOPは、指定された範囲内の値に対して繰り返し処理を行います。カウンタ変数は自動的に初期化され、範囲内の各値に対してループが実行されます。
-- FOR LOOP
BEGIN
-- iが1から5までの値を取りながらループを実行
FOR i IN 1..5 LOOP
-- 現在のカウンタの値を出力
DBMS_OUTPUT.PUT_LINE('Counter: ' || i);
END LOOP; -- ループの終了
END;
CASE文
CASE文は、条件分岐の一種で、指定された式の値に基づいて異なる処理を行います。各条件が評価され、最初に真と評価された条件に対応する処理が実行されます。
-- CASE文
DECLARE
v_grade CHAR(1) := 'B'; -- グレードを'B'に初期化
BEGIN
-- グレードに基づいて処理を分岐
CASE v_grade
WHEN 'A' THEN
DBMS_OUTPUT.PUT_LINE('Excellent'); -- グレードが'A'の場合の処理
WHEN 'B' THEN
DBMS_OUTPUT.PUT_LINE('Good'); -- グレードが'B'の場合の処理
WHEN 'C' THEN
DBMS_OUTPUT.PUT_LINE('Average'); -- グレードが'C'の場合の処理
ELSE
DBMS_OUTPUT.PUT_LINE('Poor'); -- それ以外の場合の処理
END CASE; -- CASE文の終了
END;
ベストプラクティス
- 条件分岐やループは必要最低限に。
- 複雑な条件やループのネストを避ける。