HOME > PL/SQL(実行部)編
PL/SQL(実行部)
実行部では、メインの処理を記述します。何かしらのプログラミング言語を知っている方ならおなじみのIFやFORなどを用いて処理を記述していきます。
処理
基本的な処理の記述方法です。一般的なプログラミング言語の記述方法とほとんど同じですね。
基本構成 | |
---|---|
IF文 |
【IF-THEN】 IF 条件 THEN TRUE時の処理; END IF; 【IF-THEN-ELSE】 IF 条件 THEN TRUE時の処理; ELSE FALSE時の処理; END IF; 【IF-THEN-ELSIF-ELSE】 IF 条件A THEN 条件AがTRUE時の処理; ELSIF 条件B THEN 条件BがTRUE時の処理; ELSE それ以外時の処理; END IF; ※赤字 ELSEIFでないことに注意 |
CASE文 |
【CASE】 CASE 条件 WHEN 値1 THEN 処理1; WHEN 値2 THEN 処理2; ELSE 処理3; END CASE; |
FOR文 |
【FOR】 FOR カウンタ名 IN [REVERSE] 下限値 .. 上限値 LOOP 処理; END LOOP; 【カーソルFORループ】 FOR カウンタ名 IN カーソル名 LOOP 処理(FETCHした値は、カウンタ名.カラム名で取得できる) END LOOP; ※カーソルのOPEN,CLOSEは自動でやってくれるので不要。 |
WHILE文 |
WHILE 条件 LOOP 処理 END LOOP; |
LOOP文 |
LOOP 処理; EXIT (WHEN 条件); END LOOP; |
CURSOR |
OPEN カーソル名 LOOP FETCH カーソル名 INTO <%ROWTYPE変数名> EXIT WHEN カーソル名%NOTFOUND; DBMS_OUTPUT.PUT_LINE(変数名.カラム名); END LOOP; CLOSE カーソル名 |
バルクバインド |
FORALL カウンタ変数 IN 下数..上数 DML文; |
カーソル属性
カーソルとは複数行取得できるSQLを発行した時に1行ずつ取得結果を取り出して処理したい場合に使用するものです。
カーソルの使用方法には2通りあり、明示的にカーソルをOPENしてFETCHして、CLOSEするような使い方と、宣言部でカーソルを宣言して、カーソルFORループで回す方法があります。
カーソルの状態を取得したい時は前者では明示カーソル属性を、それ以外のSQLやDML実行時では暗示カーソル属性を使用すれば状態を取得できます。
明示カーソル属性 | |
---|---|
CURSOR%FOUND | 1件以上のデータが見つかったらTRUE |
CURSOR%NOTFOUND | 1件もデータが見つからなかったらTRUE |
CURSOR%ROWCOUNT | 現在までの処理件数を返す |
CURSOR%ISOPEN | カーソルがOPENしていたらTRUE |
暗示カーソル属性 | |
---|---|
SQL%FOUND | SQL,DML文の処理対象が存在する場合はTRUE |
SQL%NOTFOUND | SQL,DML文の処理対象がない場合はTRUE |
SQL%ROWCOUNT | 処理対象行数 |
SQL%ISOPEN | 常にFALSE |
索引付表属性
索引付表とは配列のことです。→PL/SQL(宣言部編)コレクション型TABLE参照
配列なので、○番目の要素を取得したいというような場合があると思いますが、そういう場合に索引付表属性を使用します。
索引付表属性 | |
---|---|
EXISTS(n) | n番目があればTRUE |
COUNT | 要素数 |
DELETE | 全要素の削除 |
FIRST | 最初の要素の索引番号 |
LAST | 最後の要素の索引番号 |
NEXT(n) | nの1つ後ろの索引番号 |
PRIOR(n) | nの1つ前の索引番号 |
その他
こんなのもあります。
その他いろいろ | |
---|---|
ユーザ定義例外呼出1 |
RAISE 例外名; 宣言部で定義したEXCEPTIONを明示的に発生させる。 →PL/SQL(宣言部編)データ型(例外型)参照 |
ユーザ定義例外呼出2 |
RAISE_APPLICATION_ERROR(エラーコード, 'メッセージ'); エラーコードとエラーメッセージを定義したエラーを明示的に発生させる。 (※定義できるエラーコードの範囲は-20000~-20999まで) |
PL/SQL内の情報を コンソールに出力する |
set serveroutput onを実行した上で、 DBMS_OUTPUT.PUT_LINE('文字列');とやる ※Oracleのユーティリティパッケージが使える環境が必要です。 |