PL/SQL SELECTした結果を変数にセットする
PL/SQLでSELECTした結果を変数にセットする方法を紹介します。
サンプルのSQLはPL/SQL IF文で条件を指定して条件分岐するで扱ったものに対して修正しています。
以下のテーブルがあるとします。
| id | val |
|---|---|
| 1 | 3 |
SELECT句のあとにINTO 変数名でSELECTした値を変数にセットできます。
CREATE OR REPLACE PROCEDURE FOOBAR(IN_PARAM1 IN CHAR, IN_PARAM2 IN NUMBER, OUT_PARAM1 OUT CHAR) AS
/*変数を宣言*/
MON NUMBER;
NEW_DATE CHAR(8);
BEGIN
SELECT
val
INTO
MON
FROM
control
WHERE
id = 1
;
IF IN_PARAM2 = 1 THEN
NEW_DATE := TO_CHAR(ADD_MONTHS(TO_DATE(IN_PARAM1), MON), 'YYYYMMDD');
ELSIF IN_PARAM2 = 2 THEN
NEW_DATE := TO_CHAR(ADD_MONTHS(TO_DATE(IN_PARAM1), -MON), 'YYYYMMDD');
ELSE
NEW_DATE := NULL;
END IF;
OUT_PARAM1 := NEW_DATE;
END;
/複数行を取得した場合
設定データが複数件あり、SELECT結果が複数行ある場合はエラーが発生します。
| id | val |
|---|---|
| 1 | 3 |
| 1 | 4 |
ORA-01422: 完全フェッチがリクエストよりも多くの行を戻しました必ずキー項目を条件に指定したり、取得結果が1件になる保証がある条件を指定する必要があります。
複数取得されるかどうかは実際にSQLを実行してみないとわからないので、テスト環境のデータでは再現しなかったが、本番のデータでエラーになってしまうということがないように注意が必要です。
複数行を取得する方法はPL/SQL カーソルを使用してSELECT結果のループ処理を行うで紹介しています。
SELECT結果が0件の場合
また、SELECT結果が0件の場合もエラーが発生します。
| id | val |
|---|---|
| null | null |
ORA-01403: データが見つかりません。複数列をSELECTする場合
複数のカラムを取得する場合は、カンマ(,)区切りで取得します。
| id | val1 | val2 | val3 |
|---|---|---|---|
| 1 | 3 | 5 | 6 |
SELECT
val1,
val2,
val3
INTO
VAL1,
VAL2,
VAL3
FROM
control
WHERE
id = 1取得したい列の数だけ変数を定義するのは大変なので、そのテーブルのカラムと同じ型の変数を使用します。
ROWTYPE型の変数を使用する
テーブル名%ROWTYPEの形式で対象のテーブルと同じ型の変数を定義できます。
/*controlテーブル型の変数を宣言*/
L_CONTROL control%ROWTYPE;SELECT句は*を指定して、INTOで先ほど定義した変数を指定します。
SELECT
*
INTO
L_CONTROL
FROM
control
WHERE
id = 1ROWTYPE型の変数の参照方法
変数名.カラム名の形式でアクセスするできます。
MON1 := L_CONTROL.val1;
MON2 := L_CONTROL.val2;
MON3 := L_CONTROL.val3;