Oracle PL/SQL 「SELECT INTO文」 SELECTした結果を変数に代入する

スポンサーリンク
スポンサーリンク

SELECTした結果を変数に代入する方法 「SELECT INTO文」

PL/SQLでSELECTした結果を変数に代入してデータ処理を行うときは「SELECT INTO文」を使用します。

「SELECT INTO文」 基本構文

「SELECT INTO文」の基本構文は、以下のとおりです。
複数の列を指定する場合は、1番目の列名が1番目の変数、2番目の列名が2番目の変数というように位置(順番)対応しています。

SELECT <列名1>   [ ,<列名2>・・・]
  INTO <変数名1> [ ,<変数名2>・・・]
  FROM <テーブル名>;

「SELECT INTO文」 実行例

以下のテーブルとデータで検証してみましょう。

ANIMAL1テーブル
id name address
001 いるか
set serveroutput on
DECLARE
 c_name    animal1.name%TYPE;
 c_address animal1.address%TYPE;
BEGIN
 SELECT name ,address
   INTO c_name ,c_address
   FROM animal1
  WHERE id = '001';

 DBMS_OUTPUT.PUT_LINE( 'c_name:' || c_name );
 DBMS_OUTPUT.PUT_LINE( 'c_address:' || c_address );
END;
/
SQL> set serveroutput on
SQL> DECLARE
  2   c_name    animal1.name%TYPE;
  3   c_address animal1.address%TYPE;
  4  BEGIN
  5   SELECT name ,address
  6     INTO c_name ,c_address
  7     FROM animal1
  8    WHERE id = '001';
  9
 10   DBMS_OUTPUT.PUT_LINE( 'c_name:' || c_name );
 11   DBMS_OUTPUT.PUT_LINE( 'c_address:' || c_address );
 12  END;
 13  /
c_name:いるか
c_address:海

PL/SQLプロシージャが正常に完了しました。

SELECTした結果を使用することができていますね\(^o^)/

「SELECT INTO文」の注意点

「SELECT INTO文」には、大きな制約があります。それは問い合わせの結果が必ず1行ではないといけないということです。
問い合わせ結果が1行もない場合は、以下のように「NO_DATA_FOUND」例外が発生します。

SQL> DECLARE
  2   c_name    animal1.name%TYPE;
  3   c_address animal1.address%TYPE;
  4  BEGIN
  5   SELECT name ,address
  6     INTO c_name ,c_address
  7     FROM animal1
  8    WHERE id = '002';
  9
 10   DBMS_OUTPUT.PUT_LINE( 'c_name:' || c_name );
 11   DBMS_OUTPUT.PUT_LINE( 'c_address:' || c_address );
 12  END;
 13  /
DECLARE
*
行1でエラーが発生しました。:
ORA-01403: データが見つかりません。
ORA-06512: 行5

問い合わせ結果が複数行の場合、以下のように「TOO_MANY_ROWS」例外が発生します。
問い合わせ結果が複数行になるようにデータを挿入して検証してみましょう。

SQL> INSERT INTO animal1 ( id, name, address ) VALUES ('001', 'いるか', '海');

1行が作成されました。

SQL> DECLARE
  2   c_name    animal1.name%TYPE;
  3   c_address animal1.address%TYPE;
  4  BEGIN
  5   SELECT name ,address
  6     INTO c_name ,c_address
  7     FROM animal1
  8    WHERE id = '001';
  9
 10   DBMS_OUTPUT.PUT_LINE( 'c_name:' || c_name );
 11   DBMS_OUTPUT.PUT_LINE( 'c_address:' || c_address );
 12  END;
 13  /
DECLARE
*
行1でエラーが発生しました。:
ORA-01422: 完全フェッチがリクエストよりも多くの行を戻しました
ORA-06512: 行5

例外については、以下の記事を参照してください\(^o^)/
内部例外について

複数行のSELECT結果や検索結果が0件でも処理するには「カーソルFORループ」を使用します。気になる方は、以下の記事を参考にしてみて下さい。

Oracle PL/SQL カーソルFORループ SELECT結果を変数に格納
SELECTした結果を変数に代入する方法 「カーソルFORループ」 PL/SQLでSELECTした結果を変数に代入してデータ処理を行うときは「カーソルFORループ」を使用します。 以前に紹介した「SELECT INTO文」と違うのは、複数行...

コメント

タイトルとURLをコピーしました