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文」 実行例
以下のテーブルとデータで検証してみましょう。
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文」と違うのは、複数行...
コメント