最後に紹介する処理は、カーソル処理ではありません。しかし、カーソルと同じように、表から取り出した行データを変数に代入して処理したい場合に使用できる機能です。
SELECT INTO文は、取り出すデータが1行だけの場合に使用できます。検索データが複数行、または1行も検索されない場合は例外が発生します(例外とはエラーのことです。この後の連載で詳しく解説します)。
SELECT INTO文はカーソル処理と比べてシンプルに記述できるという利点があります。それでは書式を見ていきましょう。
SELECT 列名 [ ,列名 ] INTO 変数名 [ ,変数名 ] FROM 表名 ;
SELECT句の後に表から取り出す列を指定します。INTO句には取り出した列データを代入する変数を指定します。このとき、以下の図1のように列と変数は位置で対応している点に注意してください。さらに、対応する列と変数のデータ型が同じでなければなりません。
では、SELECT INTO文を使用したサンプルプログラムを見てみましょう。
SQL> DECLARE 2 e_name emp.ename%TYPE; 3 e_deptno emp.deptno%TYPE; 4 BEGIN 5 SELECT ename,deptno INTO e_name,e_deptno FROM emp 6 WHERE empno = 7788; 7 DBMS_OUTPUT.PUT_LINE(e_name||':'||e_deptno); 8 END; 9 / SCOTT:20
このプログラムでは、EMP表のENAME列とDEPTNO列を取り出して変数に代入し、変数に代入されている値をDBMS_OUTPUT.PUT_LINEで表示します。
まず宣言部で、取り出す列に対応する変数を%TYPE属性で指定しています。その後、実行部でSELECT INTO文によって値を代入しています。SELECT句で取り出すENAME列とDEPTNO列を指定し、INTO句で代入先の変数をSELECT句の順番に合わせて指定しています。
SELECT INTO文は1行のみの検索でなければならないため、WHERE句による行の絞り込みを行っています(EMPNO列は主キーとします)。
サンプルプログラムを見ても分かる通り、SELECT INTO文は非常にシンプルな指定で使用できます。しかし、忘れてならないのは、表から検索するデータは1行でないといけないという点です。そのため、使用できるケースは主に以下のような場合に限られます。
このように、記述がシンプルな反面、表から取り出すデータが1行でなければなりません。そのため、検索するデータが何行なのか分からない場合はカーソルを使用します。
以上、前回と今回の2回にわたって表から取り出したデータを扱う方法を紹介しました。特にカーソルに関しては、多くのシーンで使用する可能性が高い機能です。指定がやや複雑であるという側面はありますが、この機会にしっかりと習得しておきましょう。
株式会社アシスト データベース技術本部所属。普段はOracle、PostgreSQL、JP1などの分野で研修講師を担当。また、書籍「SQL逆引き大全363の極意」(株式会社秀和システム)をはじめ、「これならわかるOracle超入門教室」(株式会社翔泳社)、「プロとしてのPL/SQL入門」(SBクリエイティブ株式会社)の共著も担当。
Copyright © ITmedia, Inc. All Rights Reserved.