プライマリ・コンテンツに移動
Pro*C/C++プログラマーズ・ガイド
12c リリース1(12.1)
B71397-03
目次へ移動
目次
索引へ移動
索引

前
次

基本的なSQL文

実行SQL文を使用すると、Oracleデータの問合せ、操作および制御ができます。さらに、表、ビューおよび索引などのOracleオブジェクトの作成、定義およびメンテナンスができます。この章では、データの問合せおよび操作を行う文を重点的に説明しています。

INSERT、UPDATEまたはDELETEなどのデータ操作文を実行するときは、入力ホスト変数の値の設定以外に、文が成功するか失敗するかのみを考えます。これは、SQLCAを調べればわかります。(SQL文を実行すると、SQLCA変数が設定されます。)次の2つの方法でチェックできます。

ただし、SELECT文(問合せ)を実行している場合は、戻されたデータ行の処理もする必要があります。問合せは次のように分類されます。

複数の行を戻す問合せの場合は、カーソルを明示的に宣言するか、ホスト配列(配列として宣言されたホスト変数)を使用する必要があります。

注意:

ホスト配列によって、行の一括処理が可能です。

関連項目:

ホスト配列

この章ではスカラー・ホスト変数の使用を想定しています。

Oracleデータの問合せおよび操作は、次の埋込みSQL文で行います。

埋込みSQL文 説明

SELECT

1つ以上の表から行を戻します。

INSERT

表に新しい行を追加します。

UPDATE

表内の行を変更します。

DELETE

表から不要な行を削除します。

明示カーソルの定義および操作は、次の埋込みSQL文で行います。

埋込みSQL文 説明

DECLARE

カーソルに名前を付け、問合せに関連付けます。

OPEN

問合せを実行してアクティブ・セットを決定します。

FETCH

カーソルを移動して、アクティブ・セット内の各行を1つずつ取り出します。

CLOSE

カーソルを使用禁止にします(アクティブ・セットは未定義)。

以降の項では、最初にINSERT、UPDATE、DELETEおよび単一行のSELECT文を記述する方法を説明します。次に、複数行のSELECT文の使用方法を説明します。

関連項目:

SELECT文

データベースへの問合せは日常的な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の場合は、複数行が戻されるとエラーが発生します。

使用可能な句

SELECT文では、次の標準SQL句をすべて

使用できます。

  • INTO

  • FROM

  • WHERE

  • CONNECT BY

  • START WITH

  • GROUP BY

  • HAVING

  • ORDER BY

  • FOR UPDATE OF

INTO句を除いて、埋込みSELECT文は、SQL*Plusを使用して対話形式で実行およびテストすることが可能です。SQL*Plusでは、入力ホスト変数のかわりに置換変数または定数を使用します。

INSERT文

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文

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)も参照してください。

DELETE文

DELETE文を使用すると、表またはビューから行を削除できます。次の例では、EMP表から指定した部内の全従業員を削除します。

EXEC SQL DELETE FROM emp 
WHERE deptno = :dept_number ; 

オプションのWHERE句を使用して、行を削除する条件を指定しています。

RETURNING句オプションはDELETE文でも使用できます。オプションのWHERE条件の後に指定できます。前述の例では、削除する各従業員のフィールド値を事前に記録することをお薦めします。

WHERE句

WHERE句を使用すると、表またはビュー内で検索条件を満たす行のみをSELECT、UPDATEまたはDELETEできます。WHERE句の検索条件はブール式であり、スカラー・ホスト変数、ホスト配列(SELECT文内を除く)、副問合せおよびユーザー定義のストアド・ファンクションを含めることができます。

WHERE句を省略した場合は、表またはビュー内のすべての行が処理されます。UPDATEまたはDELETE文でWHERE句を省略すると、OracleはSQLCAのsqlwarn[4]を「W」に設定して、すべての列が処理されたことを示します。