実行SQL文を使用すると、Oracleデータの問合せ、操作および制御ができます。さらに、表、ビューおよび索引などのOracleオブジェクトの作成、定義およびメンテナンスができます。この章では、データの問合せおよび操作を行う文を重点的に説明しています。
INSERT、UPDATEまたはDELETEなどのデータ操作文を実行するときは、入力ホスト変数の値の設定以外に、文が成功するか失敗するかのみを考えます。これは、SQLCAを調べればわかります。(SQL文を実行すると、SQLCA変数が設定されます。)次の2つの方法でチェックできます。
WHENEVER文による暗黙的なチェック
SQLCA変数の明示的なチェック
関連項目:
SQLCAとWHENEVER文の詳細は、ランタイム・エラーの処理を参照してください。
ただし、SELECT文(問合せ)を実行している場合は、戻されたデータ行の処理もする必要があります。問合せは次のように分類されます。
行を戻さない問合せ(有無のみを調べる)
1行のみを戻す問合せ
複数の行を戻す問合せ
複数の行を戻す問合せの場合は、カーソルを明示的に宣言するか、ホスト配列(配列として宣言されたホスト変数)を使用する必要があります。
注意:
ホスト配列によって、行の一括処理が可能です。
関連項目:
この章ではスカラー・ホスト変数の使用を想定しています。
Oracleデータの問合せおよび操作は、次の埋込みSQL文で行います。
埋込みSQL文 | 説明 |
---|---|
SELECT |
1つ以上の表から行を戻します。 |
INSERT |
表に新しい行を追加します。 |
UPDATE |
表内の行を変更します。 |
DELETE |
表から不要な行を削除します。 |
明示カーソルの定義および操作は、次の埋込みSQL文で行います。
埋込みSQL文 | 説明 |
---|---|
DECLARE |
カーソルに名前を付け、問合せに関連付けます。 |
OPEN |
問合せを実行してアクティブ・セットを決定します。 |
FETCH |
カーソルを移動して、アクティブ・セット内の各行を1つずつ取り出します。 |
CLOSE |
カーソルを使用禁止にします(アクティブ・セットは未定義)。 |
以降の項では、最初にINSERT、UPDATE、DELETEおよび単一行のSELECT文を記述する方法を説明します。次に、複数行のSELECT文の使用方法を説明します。
関連項目:
それぞれの文と句の詳細は、埋込みSQLおよびディレクティブを参照してください。
『Oracle Database SQL言語リファレンス』
データベースへの問合せは日常的なSQL処理です。問合せを発行するには、SELECT文を使用します。次の例では、EMP表を問い合せています。
EXEC SQL SELECT ename, job, sal + 2000 INTO :emp_name, :job_title, :salary FROM emp WHERE empno = :emp_number;
キーワードSELECTの後の列名と式により、選択リストが作成されます。例の選択リストには、3つの項目が含まれています。WHERE句(および存在する場合はそれに続く句)で指定された条件のもと、OracleではINTO句のホスト変数に列値を戻します。
選択リスト内の項目数は、INTO句内のホスト変数と同数であり、すべての戻り値を格納する場所があります。
最も簡単な例として、問合せで1行のみ戻される場合の形式は前述の例のようになります。ただし、1つの問合せで複数の行を戻す場合は、カーソルを使用してそれらの行をFETCHするか、それらの行をSELECTしてホスト変数の配列に入れる必要があります。カーソルとFETCH文はこの章で後述します。配列処理の詳細は、ホスト配列を参照してください。
1行のみを戻すように作成した問合せが実際には複数行を戻す場合、SELECTの結果は予測不能です。これがエラーの原因かどうかは、SELECT_ERRORオプションの指定方法によって異なります。デフォルト値であるYESの場合は、複数行が戻されるとエラーが発生します。
INSERT文を使用すると、表またはビューに行を追加できます。次の例では、EMP表に1行追加します。
EXEC SQL INSERT INTO emp (empno, ename, sal, deptno) VALUES (:emp_number, :emp_name, :salary, :dept_number);
列リスト内に指定する各列は、INTO句で指定した表に含まれている必要があります。VALUES句には、挿入する行の値を指定します。これらの値は、定数、ホスト変数、SQL式、SQL関数(USER、SYSDATEなど)またはユーザー定義のPL/SQL関数のうち、どの値であってもかまいません。
VALUES句内の値の数は、列リスト内の名前の数と等しくする必要があります。ただし、表に定義されている順序で、VALUES句に表内の各列に対する値がすべて指定されている場合は、この列リストを省略できます。
関連項目:
副問合せはネストされたSELECT文です。副問合せを使用すれば、マルチパート検索を実行できます。副問合せは、次の処理に使用できます。
SELECT、UPDATEおよびDELETE文のWHERE、HAVINGおよびSTART WITH句内の比較のための値を指定します。
CREATE TABLEまたはINSERT文によって挿入する行の集合を定義します。
UPDATE文のSET句に対して値を定義します。
次の例では、INSERT文で副問合せを使用して、1つの表から別の表に行をコピーします。
EXEC SQL INSERT INTO emp2 (empno, ename, sal, deptno) SELECT empno, ename, sal, deptno FROM emp WHERE job= :job_title ;
このINSERT文では、中間結果を得るために副問合せを使用しています。
UPDATE文を使用すると、表またはビュー内の指定した列の値を変更できます。次の例では、EMP
表のSAL
列とCOMM
列を更新します。
EXEC SQL UPDATE emp SET sal = :salary, comm = :commission WHERE empno = :emp_number;
オプションのWHERE句を使用して、行を更新する条件を指定できます。WHERE句も参照してください。
SET句には、値を指定する必要のある1つ以上の列の名前の並びを指定します。副問合せを使用すれば、次の例のように値を指定できます。
EXEC SQL UPDATE emp SET sal = (SELECT AVG(sal)*1.1 FROM emp WHERE deptno = 20) WHERE empno = :emp_number;
INSERTおよびDELETE文と同様に、UPDATE文ではオプションでRETURNING
句を指定できます。オプションのWHERE条件の後にのみ指定できます。
詳細は、UPDATE(実行可能埋込みSQL)も参照してください。