【PL/SQL】Oracle PL/SQL入門【第7回 処理分岐してみよう】
PL/SQL入門 処理分岐を書いてみよう
前回で、「実行部」/「例外処理部」のコーディングをしました。
今回は、「宣言部」のコーディングをすると共に、処理分岐をしてみましょう。
と言う内容の第7回目です。
STEP1. ループそして処理分岐
さっそく、テキストエディタでPL/SQLをコーディングしてみます。
下記の内容をエディタで記述しテキストとして保存して下さい。
ここでは、「7.sql」ファイルとして保存しました。
ソースをコンパイル ⇒ 実行してみましょう。
CREATE OR REPLACE PROCEDURE TEST7 IS
I NUMBER := 11;
VTNK NUMBER;
BEGIN
WHILE I <= 15
LOOP
IF I = 11 THEN
VTNK := 10;
ELSIF I = 12 THEN
VTNK := 100;
ELSIF I = 13 THEN
VTNK := 1000;
ELSE
IF I = 14 THEN
VTNK := 10000;
ELSE
VTNK := 1;
END IF;
END IF;
INSERT INTO TBL_TEST VALUES(I, 'TEST' || TO_CHAR(I), I * VTNK);
I := I + 1;
END LOOP;
COMMIT;
EXCEPTION
WHEN OTHERS THEN
ROLLBACK;
RAISE;
END;
/
show errors
STEP2. 実行結果を見てみよう
上記の実行結果を、「Oracle SQL Developer」で確認してみましょう。
「ID」項目の値が、1~15の行を見て下さい。
設定されている「TNK」項目の値が、ループ変数の100倍ではなくなっています。
処理分岐で何倍にするかを変更した為です。
STEP3. ソースの説明
CREATE OR REPLACE PROCEDURE TEST7 IS
I NUMBER := 11;
VTNK NUMBER;
BEGIN
WHILE I <= 15
LOOP
IF I = 11 THEN
VTNK := 10;
ELSIF I = 12 THEN
VTNK := 100;
ELSIF I = 13 THEN
VTNK := 1000;
ELSE
IF I = 14 THEN
VTNK := 10000;
ELSE
VTNK := 1;
END IF;
END IF;
INSERT INTO TBL_TEST VALUES(I, 'TEST' || TO_CHAR(I), I * VTNK);
I := I + 1;
END LOOP;
COMMIT;
EXCEPTION
WHEN OTHERS THEN
ROLLBACK;
RAISE;
END;
/
show errors
■2行目: I NUMBER := 11;
初の宣言部の記述です。
「I」と言う変数名で、変数の型はNUMBER型、初期値として「11」を設定しています。
■3行目: VTNK NUMBER;
「VTNK」と言う変数名で、変数の型はNUMBER型で変数を宣言しています。
■5、6、22行目
WHILE I <= 15
LOOP
END LOOP;
「FOR」文とは違うループ方法です。「FOR」文と違いループ変数の宣言、変更を自前で行います。
今回は、「I」変数の値が15以下の間、ループします。
■7行目: IF I = 11 THEN
初の「IF」文です。
「I」変数の値が11の場合に、8行目の「VTNK := 10;」
変数「VTNK」に10を代入する処理を実行します。
■9行目:ELSIF I = 12 THEN
ELSE と IF が合体すると「ELSIF」となります。「E」が省略されます。
7行目の処理と繋げて考えると、
「I」が11以外の場合に9行目の判定を行うと言う意味になります。
■11~19行目 省略です
■20行目: INSERT INTO TBL_TEST VALUES(I, 'TEST’ || TO_CHAR(I), I * VTNK);
テーブルの「TNK」項目に設定する値を、「I * VTNK」としています。
変数「VTNK」は上記のIF分岐で設定した値です。
■21行目: I := I + 1;
ループカウンタ変数を自前でインクリメントします。この行が無いと無限ループします。
あとがき
変数宣言、WHILE文、IF文、どうだったでしょうか?
今までの回と違い、多少盛沢山だった思います。
次回はSQLの基本、「SELECT」文を見て行こうと思います。
※PL/SQLだと「INSERT」より「SELECT」の方が難しいです