ヘッダーをスキップ
Oracle® Database Oracleプリコンパイラのためのプログラマーズ・ガイド
11g リリース2(11.2)
B61344-01
  目次
目次
索引へ
索引

前へ
前へ
 
次へ
次へ
 

E 埋込みSQLコマンドおよびディレクティブ

この付録の項目は次のとおりです。

この付録では、SQL92の埋込みSQLコマンドとディレクティブ、およびOracleの埋込みSQL拡張機能について説明します。これらのコマンドおよびディレクティブをソース・コードで使用するときは、キーワードのEXEC SQLを前に付けます。SQL構文をすべて暗記しようとせずに、次のものを含め、この付録を参照してください。

プリコンパイラのディレクティブと埋込みSQLコマンドの要約

埋込みSQLコマンドは、DDL、DMLおよびトランザクション制御文を、手続き型言語プログラムに挿入します。Oracleプリコンパイラでは、埋込みSQLをサポートしています。表E-1では、埋込みSQLコマンドおよびディレクティブの機能の概要を示しています。

表E-1の「タイプ」列は、ソース/タイプの形式で表記され、ソースはSQL92標準SQL(S)またはOracle拡張機能(O)のいずれか、タイプは実行可能(E)文またはディレクティブ(D)のいずれかです。

表E-1 埋込みSQLコマンドとディレクティブの概要

EXEC SQL文 タイプ 用途

ALLOCATE

O/E

カーソル変数にメモリーを割り当てます。

CLOSE

S/E

カーソルを無効にし、保持されているリソースを解放します。

COMMIT

S/E

データベースへの変更をすべて確定して、現行のトランザクションを終了します(オプションでリソースを解放し、データベースとの接続を切断します)。

CONNECT

O/E

Oracleインスタンスに接続します。

DECLARE CURSOR

S/D

問合せに関連付けてカーソルを宣言します。

DECLARE DATABASE

O/D

後続の埋込みSQL文でアクセスされる非デフォルト・データベースの識別子を宣言します。

DECLARE STATEMENT

S/D

SQL変数名をSQL文に割り当てます。

DECLARE TABLE

O/D

Oracleプリコンパイラによる埋込みSQL文のセマンティック・チェックに使用される表構造を宣言します。

DELETE

S/E

表またはビューの実表から行を削除します。

DESCRIBE

S/E

記述子(ホスト変数の説明を保持する構造体)を初期化します。

EXECUTE...END-EXEC

O/E

無名PL/SQLブロックを実行します。

EXECUTE

S/E

準備済の動的SQL文を実行します。

EXECUTE IMMEDIATE

S/E

ホスト変数のないSQL文を準備して実行します。

FETCH

S/E

問合せで選択された行を取得します。

INSERT

S/E

表またはビューの実表に行を追加します。

OPEN

S/E

カーソルに関連付けられた問合せを実行します。

PREPARE

S/E

動的SQL文を解析します。

ROLLBACK

S/E

現行のトランザクションを終了し、現行のトランザクションで加えられた変更をすべて破棄し、ロックをすべて解除します(オプションでリソースを解放し、データベースとの接続を切断します)。

SAVEPOINT

S/E

後でロールバックできる位置をトランザクション内に指定します。

SELECT

S/E

ホスト変数に選択した値を割り当て、1つ以上の表、ビューまたはスナップショットからデータを取得します。

UPDATE

S/E

表またはビューの実表の既存の値を変更します。

VAR

O/D

デフォルトのデータ型をオーバーライドし、特定のOracleデータ型をホスト変数に割り当てます。

WHENEVER

S/D

エラー状態または警告状態の処理を指定します。


コマンドの説明について

ディレクティブ、コマンドおよび句がアルファベット順に並んでいます。それぞれの説明には、次の項目があります。

見出し 意味
用途 コマンドの基本的な用途を説明します。
前提条件 必要な権限と、コマンドを使用する前に実行する必要のある手順を示します。特記されていないかぎり、ほとんどのコマンドではインスタンスでデータベースがオープンされている必要があります。
構文 コマンドのキーワードとパラメータを示します。
キーワードおよびパラメータ 各キーワードとパラメータの用途を説明します。
使用上の注意 コマンドの使用方法と使用条件を説明します。
コマンドの例文を示します。
関連項目 関連するコマンド、句およびこのマニュアルの関連項目を示します。

構文図の読み方

埋込みSQLの構文の説明には、わかりやすい構文図を使用しています。これらは、正しい構文を示す線と矢印の図です。使用した経験がなくても、心配しないでください。この項では必要な知識を説明します。

構文図の論理的な流れを理解すれば、役に立つガイドになります。構文図をたどれば、どんな埋込みSQL文も検証または作成できます。

構文図は、線と矢印を使用して、文を作成するためのコマンド、パラメータおよびその他の言語要素の並べ方を示します。各図を左から右に矢印が指す方向にたどってください。次の記号が使用されています。

構文図の記号
図の説明

コマンドおよびその他のキーワードは、大文字で表記されています。パラメータは小文字で表記されています。演算子、デリミタおよび終了記号は普通に表記されています。「はじめに」で定義されている表記規則に従い、セミコロンで文を終了します。

構文図に複数のパスがある場合、任意のパスを選択できます。

キーワード、演算子またはパスの選択肢が複数ある場合は、選択肢を縦に並べて示します。次の例では、縦線を目的の選択肢まで下方向にたどり、次に横線に沿って進みます。

構文図の例
図の説明

この図によると、次の文はすべて有効です。

EXEC SQL WHENEVER NOT FOUND ...
EXEC SQL WHENEVER SQLERROR ...
EXEC SQL WHENEVER SQLWARNING ...

必須のキーワードおよびパラメータ

必須のキーワードとパラメータは単独で、または選択肢の縦のリスト内に表記されます。単独の必須キーワードおよびパラメータはメイン・パス、つまり現在たどっている横線上に現れます。次の例では、cursorが必須パラメータです。

構文図: キーワードおよびパラメータ
図の説明

emp_cursorという名前のカーソルがある場合、この構文図によると、次の文は有効です。

EXEC SQL CLOSE emp_cursor;

複数のキーワードまたはパラメータがメイン・パス上に縦に並んでいる場合、その中のいずれかが必須です。つまり、キーワードまたはパラメータの1つを選択する必要がありますが、それは必ずしもメイン・パス上にあるものとはかぎりません。次の例では、4つのアクションのうち1つを選択する必要があります。

構文図の例: アクション
図の説明

オプションのキーワードおよびパラメータ

キーワードおよびパラメータがメイン・パスの下に並べられている場合は、オプションです。つまり、それらの1つを選択する必要はありません。次の例では、縦の線を下方向にたどらず、メイン・パスに沿ってそのまま進むことができます。

構文図: オプションのキーワードおよびパラメータ
図の説明

oracle2という名前のデータベースがある場合、この図によれば、次の文はすべて有効です。

EXEC SQL ROLLBACK; 
EXEC SQL ROLLBACK WORK; 
EXEC SQL AT oracle2 ROLLBACK;

構文ループ

ループを使用すれば、その中の構文を何回でも繰り返せます。次の例では、column_nameがループの中にあります。したがって、列名を1つ選択した後、繰り返し戻って別の列名を選択できます。

構文図: ループ
図の説明

DEBITCREDITおよびBALANCEが列名の場合、この図によれば、次の文はすべて有効です。

EXEC SQL SELECT DEBIT INTO ...
EXEC SQL SELECT CREDIT, BALANCE INTO ...
EXEC SQL SELECT DEBIT, CREDIT, BALANCE INTO ...

マルチパート図

マルチパート図は、すべてのメイン・パスの端と端がつながっているものと考えます。次の例は、2つのパートからなる図です。

構文図: マルチパート
図の説明

この図によると、次の文は有効です。

EXEC SQL PREPARE sql_statement FROM :sql_string;

データベース・オブジェクト

表や列などのOracleオブジェクトの名前の長さは、30文字以内にする必要があります。先頭文字は必ず英文字を使用します、残りは英文字、数字、ドル記号($)、ポンド記号(#)およびアンダースコア(_)の任意の組合せを使用できます。

ただし、Oracleオブジェクトの識別名を二重引用符(")で囲むと、有効な文字を任意に組み合せて使用できます。この場合空白は有効ですが、引用符は無効です。

Oracle識別名は、引用符で囲まれている場合を除き、大文字と小文字の区別がありません。

ALLOCATE(実行可能埋込みSQL拡張機能)

用途

カーソル変数がPL/QLブロックで参照されるように割り当てます。

前提条件

カーソル変数にメモリーを割り当てる前に、SQL_CURSOR型のカーソル変数を宣言する必要があります。

構文

構文図: ALLOCATE
図の説明

キーワードおよびパラメータ

:cursor_variable

割り当てるカーソル変数。

使用上の注意

カーソルが静的であるのに対し、カーソル変数は特定の問合せに関連付けられていないため動的です。カーソル変数は型の互換性のある任意の問合せに対してオープンできます。

この部分的な例では、Pro*C/C++の埋込みSQLプログラムでのALLOCATEコマンドの使用方法を示しています。

EXEC SQL BEGIN DECLARE SECTION;
 SQL_CURSOR emp_cv;
 struct{ ... } emp_rec;
EXEC SQL END DECLARE SECTION;
EXEC SQL ALLOCATE emp_cv;
EXEC SQL EXECUTE
 BEGIN
 OPEN :emp_cv FOR SELECT * FROM emp;
 END;
END-EXEC;
for (;;)
{ EXEC SQL FETCH :emp_cv INTO :emp_rec; 
}

CLOSE(実行可能埋込みSQL)

用途

カーソルを無効にして、オープン時に取得してリソースを解放し、解析ロックを解除します。

前提条件

カーソルまたはカーソル変数がオープンの状態で、MODE=ANSIであることが必要です。

構文

構文図: CLOSE
図の説明

キーワードおよびパラメータ

cursor

クローズするカーソル。

cursor_variable

クローズするカーソル変数。

使用上の注意

クローズしたカーソルからは行をフェッチできません。カーソルは、再オープンするためにクローズする必要はありません。HOLD_CURSORおよびRELEASE_CURSORのプリコンパイラ・オプションによって、CLOSEコマンドの効果が変わります。これらのオプションの詳細は、第6章「Oracleプリコンパイラの実行」を参照してください。

この例では、CLOSEコマンドの使用方法を示しています。

EXEC SQL CLOSE emp_cursor;

COMMIT(実行可能埋込みSQL)

用途

データベースへの変更をすべて確定し、オプションですべてのリソースを解放して、Oracleデータベースとの接続を切断し、現行のトランザクションを終了します。

前提条件

現行のトランザクションをコミットするために必要な権限はありません。

自分でコミットしたインダウトの分散トランザクションを手動でコミットするには、FORCE TRANSACTIONシステム権限が必要です。他のユーザーがコミットしたインダウトの分散トランザクションを手動でコミットするには、FORCE ANY TRANSACTIONシステム権限が必要です。

DBMS MACモードでOracleを使用しているとき、インダウト・トランザクションをコミットできるのは、DBMSラベルがトランザクションのラベル、およびこのトランザクションをコミットしたユーザーの作成ラベルと一致するか、次の条件のいずれかを満たしている場合のみです。

  • トランザクションのラベルまたはユーザーの作成ラベルが、BMSラベルより上位である場合は、READUPおよびWRITEUPシステム権限が必要です。

  • トランザクションのラベルまたはユーザーの作成ラベルがDBMSラベルより下位の場合は、WRITEDOWNシステム権限が必要です。

  • トランザクションのラベルまたはユーザーの作成ラベルがDBMSラベルと同等でない場合は、READUPWRITEUPおよびWRITEDOWNシステム権限が必要です。

構文

構文図: COMMIT
図の説明

キーワードおよびパラメータ

AT

COMMIT文の発行先のデータベースを指定します。データベースは次のいずれかのパラメータを使用して指定します。

  • db_nameは、事前にDECLARE DATABASE文で宣言したデータベース識別子。

  • :host_variableは、値が事前に宣言したdb_nameであるホスト変数。

この句を省略した場合、Oracleではデフォルトのデータベースに文が発行されます。

WORK

標準SQLに準拠している場合にのみサポートされます。COMMIT文とCOMMIT WORK文は同等です。

COMMENT

現行のトランザクションに関連付けるコメントを指定します。'text'は、50文字以内の引用符付きリテラルで、トランザクションがインダウトになると、OracleではトランザクションIDとともにデータ・ディクショナリ・ビューDBA_2PC_PENDINGに格納されます。

RELEASE

リソースをすべて解放し、アプリケーションのOracleデータベースとの接続を切断します。

FORCE

インダウトの分散トランザクションを手動でコミットします。トランザクションは、ローカルまたはグローバル・トランザクションIDを含む'text'によって識別されます。このようなトランザクションのIDを検索するには、データ・ディクショナリ・ビューDBA_2PC_PENDINGに問い合せます。また、オプションの整数を使用して、トランザクションにシステム変更番号(SCN)を明示的に割り当てることもできます。整数を省略すると、トランザクションは現行のSCNを使用してコミットされます。

使用上の注意

プログラムの最後のトランザクションは、COMMITまたはROLLBACKコマンドとRELEASEオプションを使用して、必ず明示的にコミットまたはロールバックしてください。プログラムが異常終了すると、Oracleによって変更は自動的にロールバックされます。

COMMITコマンドは、ホスト変数またはプログラムの制御の流れには影響を与えません。このコマンドの詳細は、第7章「トランザクションの定義および制御」を参照してください。

この例では、埋込みSQL COMMITコマンドの使用方法を示しています。

EXEC SQL AT sales_db COMMIT RELEASE;

CONNECT(実行可能埋込みSQL拡張機能)

用途

Oracleデータベースに接続します。

前提条件

指定するデータベースでのCREATE SESSIONシステム権限が必要です。

DBMS MACモードでOracleを使用している場合、オペレーティング・システム・ラベルが、作成ラベルおよびCREATE SESSIONシステム権限を付与されたラベルのどちらよりも上位である必要があります。また、オペレーティング・システム・ラベルは、オペレーティング・システムの同等ラベルDBHIGHDBLOWの間に位置することも必要です。

Oracleをオペレーティング・システムMACモードで使用している場合、オペレーティング・システムのラベルは接続先のデータベースのラベルと一致する必要があります。

構文

構文図: CONNECT
図の説明

キーワードおよびパラメータ

:user :password

ユーザー名とパスワードを個別に指定します。

:user :password

スラッシュ(/)で区切られたOracleのユーザー名とパスワードを含む1つのホスト変数。

Oracleで使用しているオペレーティング・システムを介した接続を検証するには、:user_password値として「/」を指定します。

AT

接続先のデータベースを指定します。データベースは次のいずれかのパラメータを使用して指定します。

db_nameは、事前にDECLARE DATABASE文で宣言したデータベース識別子。

:host_variableは、値が事前に宣言したdb_nameであるホスト変数。

USING

デフォルト以外のデータベースへの接続に使用するSQL*Netデータベース指定文字列を指定します。この句を省略した場合、デフォルトのデータベースに接続されます。

使用上の注意

1つのプログラムでは複数の接続が可能ですが、デフォルトのデータベースには1回しか接続できません。このコマンドの詳細は、第3章「プログラム要件への対応」を参照してください。

次の例では、CONNECTの使用方法を説明しています。

EXEC SQL CONNECT :username
 IDENTIFIED BY :password

この文は、:useridの値に、'SCOTT/TIGER'のように、:usernameと:passwordをスラッシュ(/)で区切った値を指定して使用することもできます。

EXEC SQL CONNECT :userid

DECLARE CURSOR(埋込みSQLディレクティブ)

用途

カーソルに名前を付け、SQL文またはPL/SQLブロックに関連付けて宣言します。

前提条件

SQL文またはPL/SQLブロックの識別子にカーソルを関連付ける場合、DECLARE STATEMENT文でこの識別子を事前に宣言しておく必要があります。

構文

構文図: DECLARE
図の説明

キーワードおよびパラメータ

AT

カーソルを宣言するデータベースを指定します。データベースは次のいずれかのパラメータを使用して指定します。

db_nameは、事前にDECLARE DATABASE文で宣言したデータベース識別子。

:host_variableは、値が事前に宣言したdb_nameであるホスト変数。

この句を省略した場合、Oracleではデフォルトのデータベースでカーソルを宣言します。

cursor

宣言するカーソルの名前。

SELECTコマンド

カーソルに関連付けるSELECT文。直後の文にはINTO句を含めないでください。

statement_name block_name

カーソルと関連付けるSQL文またはPL/SQLブロックを指定します。statement_nameまたはblock_nameは、DECLARE STATEMENT文で事前に宣言する必要があります。

使用上の注意

カーソルは、他の埋込みSQL文で参照する前に宣言する必要があります。カーソル宣言の有効範囲はプリコンパイル・ユニット内全体に及ぶため、各カーソルの名前は有効範囲内で一意であることが必要です。1つのプリコンパイル・ユニット内で同じ名前のカーソルを2つ宣言することはできません。

カーソルは、UPDATE文またはDELETE文のWHERE句でCURRENT OF構文を使用して参照できます。このとき、カーソルはOPEN文によってオープンされ、FETCH文によってある行に位置付けられています。このコマンドの詳細は、第3章「プログラム要件への対応」を参照してください。

この例では、DECLARE CURSOR文の使用方法を示しています。

EXEC SQL DECLARE emp_cursor CURSOR 
 FOR SELECT ename, empno, job, sal 
 FROM emp 
 WHERE deptno = :deptno 
 FOR UPDATE OF sal

DECLARE DATABASE(Oracle埋込みSQLディレクティブ)

用途

後続の埋込みSQL文でアクセスするデフォルト以外のデータベースの識別子を宣言します。

前提条件

デフォルト以外のデータベースのユーザー名にアクセスできる必要があります。

構文

構文図: DECLARE DATABASE
図の説明

キーワードおよびパラメータ

db_name

デフォルト以外のデータベースに対して設定する識別子。

使用上の注意

デフォルト以外のデータベースに対してdb_nameを宣言するのは、他の埋込みSQL文でAT句を使用してそのデータベースを参照できるようにするためです。AT句を指定してCONNECT文を発行する前に、DECLARE DATABASE文でデフォルト以外のデータベースに対してdb_nameを宣言する必要があります。

このコマンドの詳細は、第3章「プログラム要件への対応」を参照してください。

この例では、DECLARE DATABASEディレクティブの使用方法を示しています。

EXEC SQL DECLARE oracle3 DATABASE

DECLARE STATEMENT(埋込みSQLディレクティブ)

用途

他の埋込みSQL文で使用するSQL文またはPL/SQLブロックの識別子を宣言します。

前提条件

なし。

構文

構文図: DECLARE STATEMENT
図の説明

キーワードおよびパラメータ

AT

SQL文またはPL/SQLブロックが宣言されるデータベースを指定します。データベースは次のいずれかのパラメータを使用して指定します。

db_nameは、DECLARE DATABASE文で事前に宣言したデータベース識別子。

:host_variableは、値が事前に宣言したdb_nameであるホスト変数。

この句を省略した場合、Oracleではデフォルトのデータベースに対してSQL文またはPL/SQLブロックを宣言します。

statement_name block_name

文に対して宣言する識別子。

使用上の注意

DECLARE STATEMENT文を使用してSQL文またはPL/SQLブロックの識別子を宣言する必要があるのは、その識別子を参照するDECLARE CURSOR文が、埋込みSQLプログラム内で、その文またはブロックを解析して識別子と関連付けるPREPARE文よりも物理的に(論理的にではなく)前にある場合のみです。

文の宣言の有効範囲は、カーソルの宣言と同様に、プリコンパイル・ユニット内全体に及びます。このコマンドの詳細は、第3章「プログラム要件への対応」および第10章「動的SQLの使用方法」を参照してください。

例I

この例では、DECLARE STATEMENT文の使用方法を示しています。

EXEC SQL AT remote_db 
 DECLARE my_statement STATEMENT 
EXEC SQL PREPARE my_statement FROM :my_string 
EXEC SQL EXECUTE my_statement

例II

Pro*C/C++埋込みSQLプログラムからのこの例では、DECLARE CURSOR文がPREPARE文の前にあるため、DECLARE STATEMENT文が必要です。

EXEC SQL DECLARE my_statement STATEMENT; 
EXEC SQL DECLARE emp_cursor CURSOR FOR my_statement; 
EXEC SQL PREPARE my_statement FROM :my_string; 
...

DECLARE TABLE(Oracle埋込みSQLディレクティブ)

用途

各列のデータ型、デフォルト値、Oracleプリコンパイラによるセマンティック・チェックのためのNULLまたはNOT NULLの指定など、表またはビューの構造を定義します。

前提条件

なし。

構文

構文図: DECLARE TABLE
図の説明

キーワードおよびパラメータ

table

宣言した表の名前。

column

tableの列。

datatype

columnのデータ型。

DEFAULT

columnのデフォルト値を指定します。

NULL

columnにNULLを含めてよいことを指定します。

NOT NULL制約

columnにはNULLを含められないことを指定します。

WITH DEFAULT

IBM DB2データベースとの互換性のためにサポートされています。

使用上の注意

このコマンドの使用方法の詳細は、第3章「プログラム要件への対応」を参照してください。

次の文により、PARTNOBINQTY列のあるPARTS表を宣言します。

EXEC SQL DECLARE parts TABLE 
 (partno NUMBER NOT NULL, 
 bin NUMBER, 
 qty NUMBER)

関連項目

なし。

DELETE(実行可能埋込みSQL)

用途

表またはビューの実表から行を削除します。

前提条件

表から行を削除するには、表が自分のスキーマにあるか、または表に対するDELETE権限が必要です。

ビューの実表から行を削除するには、ビューが属するスキーマの所有者に、実表に対するDELETE権限が必要です。また、ビューが自分以外のスキーマにある場合は、そのビューに対するDELETE権限が必要です。

DELETE ANY TABLEシステム権限があれば、どの表またはビューの実表からでも行を削除できます。

OracleをDBMS MACモードで使用している場合は、DBMSラベルが表またはビューの作成ラベルより上位にあるか、次の条件の1つを満たしている必要があります。

  • 表またはビューの作成ラベルがDBMSラベルより上位にある場合は、READUPおよびWRITEUPシステム権限が必要です。

  • 表またはビューの作成ラベルがDBMSラベルと同等でない場合は、READUPWRITEUPおよびWRITEDOWNシステム権限が必要です。

さらに、各表を削除するには、DBMSラベルがその行のラベルと一致するか、次の条件の1つを満たす必要があります。

  • 行のラベルがDBMSラベルより上位にある場合は、READUPおよびWRITEUPシステム権限が必要です。

  • 行ラベルがDBMSラベルより下位にある場合は、WRITEDOWNシステム権限が必要です。

  • 行ラベルがDBMSラベルと同等でない場合は、READUPWRITEUPおよびWRITEDOWNシステム権限が必要です。

構文

構文図: DELETE
図の説明

キーワードおよびパラメータ

AT

DELETE文の発行先のデータベースを指定します。データベースは次のいずれかのパラメータで指定できます。

db_nameは、DECLARE DATABASE文で事前に宣言したデータベース識別子。

:host_variableは、値が事前に宣言したdb_nameであるホスト変数。

この句を省略した場合、DELETE文はデフォルトのデータベースに対して発行されます。

FOR :host_integer

WHERE句に配列ホスト変数が含まれる場合に、文を実行する回数を制限します。この句を省略した場合、Oracleでは最小の配列のコンポーネントごとに文が1回ずつ実行されます。

schema

表またはビューを含むスキーマ。schemaを省略した場合、Oracleでは表またはビューが自分のスキーマにあるとみなされます。

table view

行を削除する表の名前。viewを指定すると、Oracleではそのビューの実表から行が削除されます。

dblink

表またはビューがあるリモート・データベースへのデータベース・リンクの完全または部分的な名前。Oracleを分散オプションで使用している場合にのみ、リモートの表またはビューから行を削除できます。

dblinkを省略した場合、Oracleでは表またはビューがローカル・データベースにあるとみなされます。

alias

表に割り当てられた別名。別名は一般に、相関問合せのあるDELETE文で使用されます。

WHERE

削除する行を指定します。

conditionは、条件を満たす行のみを削除します。この条件には、ホスト変数およびオプションのインジケータ変数を含めることができます。

CURRENT OFは、cursorによって最後にフェッチされた行のみを削除します。cursorは、FOR UPDATE句により具体的に1つの表のみがロックされていないかぎり、結合を実行するSELECT文に関連付けることはできません。

この句を完全に省略した場合、Oracleでは表またはビューからすべての行が削除されます。

使用上の注意

WHERE句のホスト変数は、すべてがスカラーか、あるいはすべてが配列であることが必要です。変数がスカラーの場合、OracleではDELETE文が1回しか実行されません。変数が配列の場合は、配列のコンポーネントのセットごとに文が1回実行されます。1回の実行で削除される行は、0行の場合もあれば、1行または複数行の場合もあります。

WHERE句の配列ホスト変数は、サイズが異なっていてもかまいません。この場合、Oracleでの文の実行回数は、次のうち小さい方の値により決まります。

  • 最小の配列のサイズ

  • オプションのFOR句の:host_integerの値

この条件を満たす行がない場合、行は削除されず、SQLCODENOT_FOUND条件を戻します。

削除された行の累計数はSQLCAを介して戻されます。WHERE句に配列ホスト変数が指定されていると、DELETE文によって処理された配列のすべてのコンポーネントについて削除された行の合計数がこの値に反映されます。

条件を満たす行がない場合、OracleからはSQLCAのSQLCODEを介してエラーが戻されます。WHERE句を省略した場合、OracleによりSQLCAのSQLWARNの第5コンポーネントに警告フラグが設定されます。このコマンドおよびSQLCAの詳細は、第8章「エラーの処理および診断」を参照してください。

DELETE文ではコメントを使用して、指示、すなわちヒントをOracleオプティマイザに渡すことができます。オプティマイザでは、このヒントを使用して文の実行計画が選択されます。

この例では、Pro*C/C++埋込みSQLプログラム内でのDELETE文の使用方法を示しています。

EXEC SQL DELETE FROM emp 
 WHERE deptno = :deptno 
 AND job = :job; ... 
EXEC SQL DECLARE emp_cursor CURSOR 
 FOR SELECT empno, comm 
 FROM emp; 
EXEC SQL OPEN emp_cursor; 
EXEC SQL FETCH c1 
 INTO :emp_number, :commission; 
EXEC SQL DELETE FROM emp 
 WHERE CURRENT OF emp_cursor;

DESCRIBE(実行可能埋込みSQL)

目的

動的SQL文またはPL/SQLブロックのホスト変数の説明を保持する記述子を初期化します。

前提条件

埋込みSQL PREPARE文を使用して、SQL文またはPL/SQLブロックを事前に準備しておく必要があります。

構文

構文図: DESCRIBE
図の説明

キーワードおよびパラメータ

BIND VARIABLES

SQL文またはPL/SQLブロックの入力変数に関する情報を保持する記述子を初期化します。

SELECT LIST

SELECT文の選択リストに関する情報を保持する記述子を初期化します。

デフォルトはSELECT LIST FORです。

statement_name block_name

PREPARE文で事前に準備したSQL文またはPL/SQLブロックを指定します。

descriptor

初期化する記述子の名前。

使用上の注意

埋込みSQLプログラム内のバインド記述子または選択記述子を操作するには、その前にDESCRIBE文を発行する必要があります。

入力変数と出力変数の両方の情報を同じ記述子に記述することはできません。

DESCRIBE文によって検出される変数の数は、準備されたSQL文またはPL/SQLブロック内のプレースホルダの合計数です。一意に名前が付けられたプレースホルダの合計数ではありません。このコマンドの詳細は、第10章「動的SQLの使用方法」を参照してください。

この例では、Pro*C埋込みSQLプログラムでのDESCRIBE文の使用方法を示しています。

EXEC SQL PREPARE my_statement FROM :my_string; 
EXEC SQL DECLARE emp_cursor 
 FOR SELECT empno, ename, sal, comm 
 FROM emp 
 WHERE deptno = :dept_number 
EXEC SQL DESCRIBE BIND VARIABLES FOR my_statement 
 INTO bind_descriptor; 
EXEC SQL OPEN emp_cursor 
 USING bind_descriptor; 
EXEC SQL DESCRIBE SELECT LIST FOR my_statement 
 INTO select_descriptor; 
EXEC SQL FETCH emp_cursor 
 INTO select_descriptor;

EXECUTE ... END-EXEC(実行可能埋込みSQL拡張子)

用途

Oracleプリコンパイラ・プログラムに無名PL/SQLブロックを埋め込みます。

前提条件

なし。

構文

構文図: EXECUTE ... END-EXEC
図の説明

キーワードおよびパラメータ

AT

PL/SQLブロックが実行されるデータベースを指定します。データベースは次のいずれかのパラメータを使用して指定します。

db_nameは、DECLARE DATABASE文で事前に宣言したデータベース識別子。

:host_variableは、値が事前に宣言したdb_nameであるホスト変数。

この句を省略した場合、PL/SQLブロックはデフォルトのデータベースで実行されます。

pl/sql_block

END-EXEC

Oracleプリコンパイラ・プログラムで使用されるプログラミング言語に関係なく、埋込みPL/SQLブロックの後に指定する必要があります。もちろん、END-EXECキーワードの後にはその言語の埋込みSQL文終了記号を入れる必要があります。

使用上の注意

Oracleプリコンパイラでは、埋込みPL/SQLブロックは1つの埋込みSQL文のように扱われるため、PL/SQLブロックは、Oracleプリコンパイラ・プログラムでSQL文を埋め込める場所であればどこにでも埋め込めます。Oracleプリコンパイラ・プログラムへのPL/SQLブロックの埋込みの詳細は、第5章「埋込みPL/SQLの使用方法」を参照してください。

Oracleプリコンパイラ・プログラムにこのEXECUTE文を挿入すると、プログラムにPL/SQLブロックが埋め込まれます。

EXEC SQL EXECUTE 
 BEGIN 
 SELECT ename, job, sal 
 INTO :emp_name:ind_name, :job_title, :salary 
 FROM emp 
 WHERE empno = :emp_number; 
 IF :emp_name:ind_name IS NULL 
 THEN RAISE name_missing; 
 END IF; 
 END; 
END-EXEC

EXECUTE(実行可能埋込みSQL)

用途

埋込みSQL PREPARE文を使用して事前に準備されたDELETE文、INSERT文またはUPDATE文、あるいはPL/SQLブロックを実行します。

前提条件

SQL PREPARE文を使用して、まずSQL文またはPL/SQLブロックを準備する必要があります。

構文

構文図: EXECUTE
図の説明

キーワードおよびパラメータ

FOR :host_integer

USING句に配列ホスト変数が含まれる場合に、文を実行する回数を制限します。この句を省略した場合、Oracleでは最小の配列のコンポーネントごとに文が1回ずつ実行されます。

statement_id

実行するSQL文またはPL/SQLブロックに関連付けられるプリコンパイラ識別子。プリコンパイラ識別子を文またはPL/SQLブロックに関連付けるには、埋込みSQL PREPAREコマンドを使用します。

USING

オプションのインジケータ変数を使用して、Oracleで実行する文に入力変数として代入するホスト変数のリストを指定します。ホスト変数およびインジケータ変数は、すべてがスカラーであるか、あるいはすべてが配列であることが必要です。

使用上の注意

このコマンドの詳細は、第10章「動的SQLの使用方法」を参照してください。

この例では、Pro*C/C++埋込みSQLプログラムでのEXECUTE文の使用方法を示しています。

EXEC SQL PREPARE my_statement 
 FROM :my_string; 
EXEC SQL EXECUTE my_statement
 USING :my_var;

EXECUTE IMMEDIATE(実行可能埋込みSQL)

用途

ホスト変数を含まないDELETE文、INSERT文またはUPDATE文またはPL/SQLブロックを準備し、実行します。

前提条件

なし。

構文

構文図: EXECUTE IMMEDIATE
図の説明

キーワードおよびパラメータ

AT

SQL文またはPL/SQLブロックが実行されるデータベースを指定します。データベースは次のいずれかのパラメータを使用して指定します。

db_nameは、DECLARE DATABASE文で事前に宣言したデータベース識別子。

:host_variableは、値が事前に宣言したdb_nameであるホスト変数。

この句を省略した場合、文またはブロックはデフォルトのデータベースで実行されます。

:host_string

実行するSQL文またはPL/SQLブロックが値であるホスト変数。

text

実行するSQL文またはPL/SQLブロックを含む引用符付きのテキスト・リテラル。

SQL文は、DELETE文、INSERT文またはUPDATE文のいずれかです。

使用上の注意

EXECUTE IMMEDIATE文を発行すると、Oracleでは指定したSQL文またはPL/SQLブロックを解析してエラーをチェックし、実行します。見つかったエラーは、SQLCAのSQLCODEコンポーネントに戻されます。

このコマンドの詳細は、第10章「動的SQLの使用方法」を参照してください。

この例では、EXECUTE IMMEDIATE文の使用方法を示しています。

EXEC SQL EXECUTE IMMEDIATE 'DELETE FROM emp WHERE empno = 9460'

FETCH(実行可能埋込みSQL)

用途

選択リストの値を変数に割り当てて、問合せによって戻された1行以上の行を取得します。

前提条件

OPEN文を使用して、まずカーソルをオープンする必要があります。

構文

構文図: FETCH
図の説明

キーワードおよびパラメータ

FOR :host_integer

配列ホスト変数を使用している場合、フェッチする行数を制限します。この句を省略した場合、Oracleでは最小の配列を満たすのに十分な数の行がフェッチされます。

cursor

DECLARE CURSOR文を使用して宣言したカーソル。FETCH文は、カーソルに関連付けられた問合せにより選択された行のうち1行を戻します。

:cursor_variable

ALLOCATE文を使用して割り当てたカーソル変数。FETCH文は、カーソル変数に関連付けられた問合せにより選択された行のうちの1行を戻します。

INTO

フェッチしたデータを格納するホスト変数およびオプションのインジケータ変数のリストを指定します。これらのホスト変数およびインジケータ変数は、プログラム内で宣言しておく必要があります。

USING

DESCRIBE文で事前に参照している記述子を指定します。この句は、動的埋込みSQL方法4以外では使用しないでください。また、カーソル変数を使用しているときも、USING句は適用されません。

使用上の注意

FETCH文は、アクティブ・セットの行を読み取り、結果が含まれる出力変数の名前を付けます。関連付けられたホスト変数がNULLの場合、インジケータ変数は-1に設定されます。最初のカーソルのFETCH文は、必要に応じて、アクティブ・セットの行のソートも行います。

フェッチする行数は、出力ホスト変数のサイズおよびFOR句で指定した値で指定します。データを取得するホスト変数は、すべてがスカラーか、あるいはすべてが配列であることが必要です。スカラーの場合、Oracleは1行しかフェッチしません。配列の場合、配列を満たすのに十分な数の行をフェッチします。

配列ホスト変数は、サイズが異なってもかまいません。この場合、Oracleでフェッチする行数は、次のうち小さい方の値により決まります。

  • 最小の配列のサイズ

  • オプションのFOR句の:host_integerの値

フェッチする行数は、実際に問合せを満たす行数によってさらに限定できます。

FETCH文が、問合せで戻された行すべてを取得しなかった場合、カーソルは戻された次の行に配置されます。問合せで戻された最後の行を取得すると、次のFETCH文を実行すると、SQLCAのSQLCODE要素にエラー・コードが戻されることになります。

FETCHコマンドにはAT句がないので注意してください。カーソルでアクセスするデータベースは、DECLARE CURSOR文で指定する必要があります。

FETCH文では、アクティブ・セット内で進めるのは前方向のみです。すでにフェッチした行に戻る場合は、カーソルを再オープンして、各行を順番にフェッチする必要があります。アクティブ・セットを変更するには、新しい値をカーソルの問合せの入力ホスト変数に割り当て、カーソルを再オープンします。

この例では、擬似コード埋込みSQLプログラムでのFETCHコマンドの使用方法を示しています。

EXEC SQL DECLARE emp_cursor CURSOR FOR 
 SELECT job, sal FROM emp WHERE deptno = 30; 
... 
EXEC SQL WHENEVER NOT FOUND GOTO ... 
LOOP 
 EXEC SQL FETCH emp_cursor INTO :job_title1, :salary1; 
 EXEC SQL FETCH emp_cursor INTO :job_title2, :salary2; 
... 
END LOOP; 
...

INSERT(実行可能埋込みSQL)

用途

表またはビューの実表に行を追加します。

前提条件

表に行を挿入するには、表が自分のスキーマにあるか、または表に対するINSERT権限が必要です。

ビューの実表に行を挿入するには、ビューが属するスキーマの所有者に、実表に対するINSERT権限が必要です。また、ビューが自分以外のスキーマにある場合は、そのビューに対するINSERT権限が必要です。

INSERT ANY TABLEシステム権限があれば、どの表またはビューの実表にも行を挿入できます。

OracleをDBMS MACモードで使用している場合は、DBMSラベルが表またはビューの作成ラベルと一致する必要があります。

  • 表またはビューの作成ラベルがDBMSラベルより上位にある場合は、WRITEUPシステム権限が必要です。

  • 表またはビューの作成ラベルがDBMSラベルより下位にある場合は、WRITEDOWNシステム権限が必要です。

  • 表またはビューの作成ラベルがDBMSラベルと同等でない場合は、WRITEUPおよびWRITEDOWNシステム権限が必要です。

構文

構文図: INSERT
図の説明

キーワードおよびパラメータ

AT

INSERT文を実行するデータベースを指定します。データベースは次のいずれかのパラメータを使用して指定します。

db_nameは、DECLARE DATABASE文で事前に宣言したデータベース識別子。

:host_variableは、値が事前に宣言したdb_nameであるホスト変数。

この句を省略した場合、INSERT文はデフォルトのデータベースで実行されます。

FOR :host_integer

VALUES句に配列ホスト変数が含まれる場合に、文を実行する回数を制限します。この句を省略した場合、Oracleでは最小の配列のコンポーネントごとに文が1回ずつ実行されます。

schema

表またはビューを含むスキーマ。schemaを省略した場合、Oracleでは表またはビューが自分のスキーマにあるとみなされます。

table view

行を挿入する表の名前。viewを指定すると、Oracleではそのビューの実表に行が挿入されます。

dblink

表またはビューがあるリモート・データベースへのデータベース・リンクの完全または部分的な名前。Oracleを分散オプションで使用している場合にのみ、リモートの表またはビューに行を挿入できます。

dblinkを省略した場合、Oracleでは表またはビューがローカル・データベースにあるとみなされます。

column

表またはビューの列。挿入した行では、このリストの各列にVALUES句または問合せから値が割り当てられます。

このリストから表の列の1つを省略すると、挿入された行の列値は、表の作成時に指定した列のデフォルト値になります。列のリストを完全に省略した場合は、VALUES句または問合せで表のすべての列に値を指定する必要があります。

VALUES

表またはビューに挿入する値の表を指定します。ホスト変数には、オプションのインジケータ変数と合せて式も使用できます。VALUES句では、列リストの列ごとに式を指定する必要があります。

subquery

表に挿入される行を戻す副問合せ。この副問合せの選択リストの列数は、INSERT文の列リストの列数と同じであることが必要です。

使用上の注意

WHERE句のホスト変数は、すべてがスカラーか、あるいはすべてが配列であることが必要です。変数がスカラーの場合、OracleではINSERT文が1回しか実行されません。変数が配列の場合は、配列のコンポーネントのセットごとにINSERT文が1回実行され、1行ずつ挿入されます。

WHERE句の配列ホスト変数は、サイズが異なっていてもかまいません。この場合、Oracleでの文の実行回数は、次のうち小さい方の値により決まります。

  • 最小の配列のサイズ

  • オプションのFOR句の:host_integerの値。

このコマンドの詳細は、第4章「埋込みSQLの使用方法」を参照してください。

例I

この例では、埋込みSQL INSERTコマンドの使用方法を示しています。

EXEC SQL 
 INSERT INTO emp (ename, empno, sal) 
 VALUES (:ename, :empno, :sal);

例II

この例では、副問合せを使用した埋込みSQL INSERTコマンドを示しています。

EXEC SQL 
 INSERT INTO new_emp (ename, empno, sal) 
 SELECT ename, empno, sal FROM emp
 WHERE deptno = :deptno;

OPEN(実行可能埋込みSQL)

用途

カーソルをオープンし、関連付けられた問合せを評価して、USING句で指定したホスト変数名を問合せのWHERE句に代入します。

前提条件

カーソルは、オープンする前に埋込みSQLのDECLARE CURSOR文を使用して宣言する必要があります。

構文

構文図: OPEN
図の説明

キーワードおよびパラメータ

cursor

オープンするカーソル。

USING

関連付けられた問合せのWHERE句に代入するホスト変数を指定します。

:host_variableは、カーソルに関連付けられた文に代入する、オプションのインジケータ変数を持つホスト変数を指定します。

DESCRIPTOR

関連付けられた問合せのWHERE句に代入するホスト変数を説明する記述子を指定します。記述子は、DESCRIBE文で事前に初期化しておく必要があります。

代入は、位置に基づいて行われます。この文で指定するホスト変数名は、関連付けられた問合せの変数名と異なってもかまいません。

使用上の注意

OPENコマンドは、行のアクティブ・セットを定義し、アクティブ・セットの最初の行の直前でカーソルを初期化します。OPEN時のホスト変数の値が文に代入されます。このコマンドは、実際には行を取得しません。行はFETCHコマンドによって取得します。

カーソルと一度オープンすると、その入力変数はカーソルを再オープンするまで再検査されません。入力ホスト変数を変更し、その結果アクティブ・セットを変更するには、カーソルを再オープンする必要があります。

プログラム内のすべてのカーソルは、プログラムを開始するとき、またはCLOSEコマンドを使用して明示的にクローズした後はクローズ状態です。

カーソルは、事前にクローズしなくても、再オープンできます。このコマンドの詳細は、第4章「埋込みSQLの使用方法」を参照してください。

この例では、Pro*C/C++の埋込みSQLプログラムでのOPENコマンドの使用方法を示しています。

EXEC SQL DECLARE emp_cursor CURSOR FOR 
 SELECT ename, empno, job, sal 
 FROM emp 
 WHERE deptno = :deptno; 
EXEC SQL OPEN emp_cursor;

PREPARE(実行可能埋込みSQL)

用途

ホスト変数で指定したSQL文またはPL/SQLブロックを解析し、識別子に関連付けます。

前提条件

なし。

構文

構文図: PREPARE
図の説明

キーワードおよびパラメータ

statement_id

準備済のSQL文またはPL/SQLブロックに関連付ける識別子。この識別子がすでに別の文またはブロックに割り当てられている場合、前の割当ては置き換えられます。

:host_string

準備するSQL文またはPL/SQLブロックのテキストが値であるホスト変数。

text

準備するSQL文またはPL/SQLブロックを含む文字列リテラル。

使用上の注意

:host_stringまたはtextの変数はすべてプレースホルダです。実際のホスト変数名は、OPENコマンドのUSING句(入力ホスト変数)またはFETCHコマンドのINTO句(出力ホスト変数)に割り当てます。

SQL文は一度準備すると、何回でも実行できます。

この例では、Pro*C/C++埋込みSQLプログラムでのPREPARE文の使用方法を示しています。

EXEC SQL PREPARE my_statement FROM :my_string;
EXEC SQL EXECUTE my_statement;

ROLLBACK(実行可能埋込みSQL)

用途

現行のトランザクションで実行した作業を取り消します。

このコマンドは、インダウトの分散トランザクションで実行された作業を手動で取り消すときにも使用できます。

前提条件

現行のトランザクションをロールバックするには、権限は必要ありません。

自分でコミットしたインダウトの分散トランザクションを手動でロールバックするには、FORCE TRANSACTIONシステム権限が必要です。他のユーザーがコミットしたインダウトの分散トランザクションを手動でロールバックするには、FORCE ANY TRANSACTIONシステム権限が必要です。

構文

構文図: ROLLBACK
図の説明

キーワードおよびパラメータ

WORK

オプションで、ANSIとの互換性のために用意されています。

TO

指定したセーブポイントまで現行のトランザクションをロールバックします。この句を省略した場合、ROLLBACK文はトランザクション全体をロールバックします。

FORCE

インダウトの分散トランザクションを手動でロールバックします。トランザクションは、ローカルまたはグローバル・トランザクションIDを含むテキストで指定します。このようなトランザクションのIDを検索するには、データ・ディクショナリ・ビューDBA_2PC_PENDINGに問い合せます。

ROLLBACK文でのFORCE句の使用は、PL/SQLではサポートされていません。

RELEASE

すべてのリソースを解放し、アプリケーションのOracleサーバーとの接続を切断します。RELEASE句は、SAVEPOINT句およびFORCE句とは併用できません。

使用上の注意

トランザクション(論理的な作業単位)は、Oracleで1つの単位として扱われる一連のSQL文です。トランザクションは、COMMITROLLBACKまたはデータベースへの接続の後の最初の実行SQL文から始まります。トランザクションは、COMMIT文、ROLLBACK文またはデータベースとの接続を切断(意図的または不用意な切断)により終了します。Oracleでは、データ定義言語文の処理前および処理後に暗黒的COMMIT文が発行されます。

TO SAVEPOINT句を指定せずにROLLBACKコマンドを使用すると、次の処理が実行されます。

  • トランザクションを終了します。

  • 現行のトランザクションでの変更をすべて取り消します。

  • トランザクション内のセーブポイントをすべて消去します。

  • トランザクションのロックを解除します。

TO SAVEPOINT句を指定してROLLBACKコマンドを使用すると、次の処理が実行されます。

  • トランザクションのセーブポイント後の部分のみをロールバックします。

  • 指定したセーブポイントの後に作成したセーブポイントをすべて消去します。指定したセーブポイントは保持されるため、そのセーブポイントまで複数回ロールバックできます。それより前のセーブポイントも保持されます。

  • 指定したセーブポイント後に取得した表および行ロックをすべて解除します。セーブポイント後にロックされた行へのアクセスを要求した他のトランザクションは、そのトランザクションがコミットまたはロールバックされるまで待機する必要があります。まだ行を要求していない他のトランザクションは、行を要求すればだたちにアクセスできます。

アプリケーション・プログラムでは、COMMITまたはROLLBACK文のいずれかを使用してトランザクションを明示的に終了することをお薦めします。トランザクションを明示的にコミットせずにプログラムが異常終了した場合、Oracleではコミットされていない最後のトランザクションがロールバックされます。

例I

次の文は、現行のトランザクション全体をロールバックします。

EXEC SQL ROLLBACK;

例II

次の文は、現行のトランザクションをセーブポイントSP5までロールバックします。

EXEC SQL ROLLBACK TO SAVEPOINT sp5;

分散トランザクション

Oracleで分散オプションを使用すると、分散トランザクション、または複数のデータベースでデータを変更するトランザクションを実行できます。分散トランザクションをコミットまたはロールバックするには、他のトランザクションの場合と同様に、COMMIT文またはROLLBACK文を発行すれば済みます。

分散トランザクションのコミット処理中に、ネットワーク障害が発生すると、トランザクションの状態が不明またはインダウトになる可能性があります。そのトランザクションに関係する他のデータベースの管理者と相談してから、自分のローカル・データベースでそのトランザクションを手動でコミットするか、ロールバックするかを決めます。ローカル・データベースのトランザクションは、FORCE句を指定したROLLBACK文を発行すれば、手動でロールバックできます。

インダウトのトランザクションは、手動でセーブポイントまでロールバックすることはできません。

FORCE句を指定したROLLBACK文でロールバックできるのは、指定したトランザクションのみです。このような文は、現行のトランザクションには影響がありません。

例III

次の文は、インダウトの分散トランザクションを手動でロールバックします。

EXEC SQL
 ROLLBACK WORK
 FORCE '25.32.87';

SAVEPOINT(実行可能埋込みSQL)

用途

後でロールバックできる位置をトランザクション内に指定します。

前提条件

なし。

構文

構文図: SAVEPOINT
図の説明

キーワードおよびパラメータ

AT

セーブポイントを宣言するデータベースを指定します。データベースは次のいずれかのパラメータを使用して指定します。

db_nameは、DECLARE DATABASE文で事前に宣言したデータベース識別子。

:host_variableは、値が事前に宣言したdb_nameであるホスト変数。

この句を省略した場合、セーブポイントはデフォルトのデータベースで作成されます。

savepoint

作成するセーブポイントの名前。

使用上の注意

このコマンドの詳細は、第7章「トランザクションの定義および制御」を参照してください。

この例では、埋込みSQL SAVEPOINTコマンドの使用方法を示しています。

EXEC SQL SAVEPOINT save3;

SELECT(実行可能埋込みSQL)

用途

ホスト変数に選択した値を割り当て、1つ以上の表、ビューまたはスナップショットからデータを取得します。

前提条件

表またはスナップショットからデータを選択するには、表またはスナップショットが自分のスキーマにあるか、またはその表あるいはスナップショットに対するSELECT権限が必要です。

ビューの実表から行を選択するには、ビューが属するスキーマの所有者に、実表に対するSELECT権限が必要です。また、ビューが自分以外のスキーマにある場合は、そのビューに対するSELECT権限が必要です。

SELECT ANY TABLEシステム権限を使用すると、すべての表、スナップショットまたはビューの実表からデータを選択できます。

OracleをDBMS MACモードで使用している場合は、DBMSラベルが問合せ先の各表、ビューまたはスナップショットの作成ラベルより上位にあるか、READUPシステム権限が必要です。

構文

構文図: SELECT
図の説明

キーワードおよびパラメータ

AT

SELECT文の発行先のデータベースを指定します。データベースは次のいずれかのパラメータで指定できます。

db_nameは、DECLARE DATABASE文で事前に宣言したデータベース識別子。

:host_variableは、値が事前に宣言したdb_nameであるホスト変数。

この句を省略した場合、SELECT文はデフォルトのデータベースに対して発行されます。

select_list

非埋込みSELECTコマンドと同じですが、リテラルのかわりにホスト変数を使用できます。

INTO

SELECT文で戻されるデータを受け取る出力ホスト変数およびオプションのインジケータ変数を指定します。これらの変数は、すべてがスカラーか、すべてが配列であることが必要です。ただし、配列は同じサイズでなくてもかまいません。

WHERE

戻される行を、条件がTRUEの行のみに制限します。conditionには、ホスト変数を使用できますが、インジケータ変数は使用できません。これらのホスト変数はスカラーまたは配列のいずれでもかまいません。

その他のキーワードおよびパラメータはすべて、非埋込みSQL SELECTコマンドと同じです。

使用上の注意

WHERE句の条件を満たす行がない場合、行は取得されず、OracleからはSQLCAのSQLCODEコンポーネントを使用してエラー・コードが戻されます。

SELECT文ではコメントを使用して指示、すなわちヒントをOracleオプティマイザに渡すことができます。オプティマイザではヒントを使用して文の実行計画を選択します。ヒントの詳細は、『Oracle Databaseパフォーマンス・チューニング・ガイド』を参照してください。

この例では、埋込みSQL SELECTコマンドの使用方法を示しています。

EXEC SQL SELECT ename, sal + 100, job 
 INTO :ename, :sal, :job 
 FROM emp 
 WHERE empno = :empno

UPDATE(実行可能埋込みSQL)

用途

表またはビューの実表で既存の値を変更します。

前提条件

表またはスナップショットの値を更新するには、表が自分のスキーマにあるか、または表に対するUPDATE権限が必要です。

ビューの実表の値を更新するには、ビューが属するスキーマの所有者に、実表に対するUPDATE権限が必要です。また、ビューが自分以外のスキーマにある場合は、そのビューに対するUPDATE権限が必要です。

UPDATE ANY TABLEシステム権限があれば、どの表またはビューの実表でも値を更新できます。

OracleをDBMS MACモードで使用している場合は、DBMSラベルが表またはビューの作成ラベルと一致する必要があります。

  • 表またはビューの作成ラベルがDBMSラベルより上位にある場合は、READUPおよびWRITEUPシステム権限が必要です。

  • 表またはビューの作成ラベルがDBMSラベルより下位にある場合は、WRITEDOWNシステム権限が必要です。

  • 表またはビューの作成ラベルがDBMSラベルと同等でない場合は、READUPWRITEUPおよびWRITEDOWNシステム権限が必要です。

構文

構文図: UPDATE
図の説明

キーワードおよびパラメータ

AT

UPDATE文の発行先のデータベースを指定します。データベースは次のいずれかのパラメータで指定できます。

db_nameは、DECLARE DATABASE文で事前に宣言したデータベース識別子。

:host_variableは、値が事前に宣言したdb_nameであるホスト変数。

この句を省略した場合、UPDATE文はデフォルトのデータベースに対して発行されます。

FOR :host_integer

SET句およびWHERE句に配列ホスト変数が含まれる場合に、UPDATE文を実行する回数を制限します。この句を省略した場合、Oracleでは最小の配列のコンポーネントごとに文が1回ずつ実行されます。

schema

表またはビューを含むスキーマ。schemaを省略した場合、Oracleでは表またはビューが自分のスキーマにあるとみなされます。

table view

更新する表の名前。viewを指定した場合、Oracleではそのビューの実表が更新されます。

dblink

表またはビューがあるリモート・データベースへのデータベース・リンクの完全または部分的な名前。Oracleを分散オプションで使用している場合にのみ、リモートの表またはビューを更新するためにデータベース・リンクを使用できます。

alias

文の他の場所にある表、ビューまたは副問合せを参照するために使用する名前。

column

表またはビューで更新する列の名前。SET句から表の列を省略すると、その列値は変更されないままです。

expr

対応する列に割り当てられた新しい値。この式には、ホスト変数およびオプションのインジケータ変数を含めることができます。

subquery_1

対応する列に割り当てられた新しい値を戻す副問合せ。

subquery_2

対応する列に割り当てられた新しい値を戻す副問合せ。

WHERE

表またはビューで更新する行を指定します。

conditionは、条件を満たす行のみを更新します。この条件には、ホスト変数およびオプションのインジケータ変数を含めることができます。

CURRENT OFは、cursorによって最後にフェッチされた行のみを更新します。cursorは、FOR UPDATE句により明示的に1つの表のみがロックされていないかぎり、結合を実行するSELECT文に関連付けることはできません。

この句を完全に省略した場合、Oracleでは表またはビューのすべての行が更新されます。

使用上の注意

SET句およびWHERE句のホスト変数は、すべてがスカラーか、あるいはすべてが配列であることが必要です。変数がスカラーの場合、OracleではUPDATE文が1回しか実行されません。変数が配列の場合は、配列のコンポーネントのセットごとに文が1回実行されます。1回の実行で更新される行は、0行の場合もあれば、1行または複数行の場合もあります。

配列ホスト変数は、サイズが異なってもかまいません。この場合、Oracleで文が実行される回数は、次のうち小さい方の値により決まります。

  • 最小の配列のサイズ

  • オプションのFOR句の:host_integerの値

更新された行の累計数は、SQLCAのSQLERRDコンポーネントの第3要素を介して戻されます。入力ホスト変数として配列を使用した場合、この数値はUPDATE文で処理された配列のすべてのコンポーネントに対する更新の合計数を示します。条件を満たす行がない場合、行は更新されず、OracleからはSQLCAのSQLCODE要素を使用してエラー・メッセージが戻されます。WHERE句を省略した場合、すべての行が更新され、OracleではSQLCAのSQLWARN要素の第5コンポーネントに警告フラグが設定されます。

UPDATE文ではコメントを使用して、指示、すなわちヒントをOracleオプティマイザに渡すことができます。オプティマイザでは、このヒントを使用して文の実行計画が選択されます。

このコマンドの詳細は、第4章「埋込みSQLの使用方法」および第7章「トランザクションの定義および制御」を参照してください。

次の例では、埋込みSQL UPDATEコマンドの使用方法を示しています。

EXEC SQL UPDATE emp 
 SET sal = :sal, comm = :comm INDICATOR :comm_ind 
 WHERE ename = :ename; 
 
EXEC SQL UPDATE emp 
 SET (sal, comm) = 
 (SELECT AVG(sal)*1.1, AVG(comm)*1.1 
 FROM emp) 
 WHERE ename = 'JONES';

VAR(Oracle埋込みSQLディレクティブ)

用途

ホスト変数の同値化を実行するか、個々のホスト変数に特定のOracle外部データ型を割り当て、デフォルトのデータ型の割当てをオーバーライドします。

前提条件

ホスト変数は、埋込みSQLプログラムの宣言部で事前に宣言しておく必要があります。

構文

構文図: VAR
図の説明

キーワードおよびパラメータ

host_variable

Oracle外部データ型を割り当てるホスト変数。

datatype

Oracleプリコンパイラによって認識されるOracle外部データ型(Oracle内部データ型ではありません)。データ型には、長さ、精度または位取りが含まれます。この外部データ型がhost_variableに割り当てられます。外部データ型のリストは、第3章「プログラム要件への対応」を参照してください。

使用上の注意

ホスト変数の同値化は、一種のデータ型の同値化です。データ型の同値化は、次のいずれの目的にも役に立ちます。

  • 文字ホスト変数を自動的にNULLで終了させます。

  • プログラム・データをバイナリ・データとしてデータベースに格納します。

  • デフォルトのデータ型変換をオーバーライドします。

この例では、ホスト変数DEPT_NAME

データ型STRINGに、ホスト変数BUFFERをデータ型RAW(2000)に同値化しています。

EXEC SQL BEGIN DECLARE SECTION; 
 ... 
 dept_name CHARACTER(15); -- default datatype is CHAR 
 EXEC SQL VAR dept_name IS STRING; -- reset to STRING 
 ... 
 buffer CHARACTER(200); -- default datatype is CHAR 
 EXEC SQL VAR buffer IS RAW(200); -- refer to RAW 
 ...
EXEC SQL END DECLARE SECTION;

関連トピック

なし。

WHENEVER(埋込みSQLディレクティブ)

用途

埋込みSQLプログラムの実行によりエラーまたは警告が発生した場合の処置を指定します。

前提条件

なし。

構文

次の構文図は、WHENEVER文の作成方法を示しています。

構文図: WHENEVER
図の説明

キーワードおよびパラメータ

NOT FOUND

エラー・コード+1403(または、MODE=ANSIのときは+100コード)をSQLCODEに戻す例外状態を示します。

SQLERROR

負のリターン・コードを戻す状態を示します。

SQLWARNING

致命的でない警告状態を示します。

CONTINUE

プログラムが次の文に進む必要があることを示します。

GOTO

プログラムがlabelで指定した名前の文に分岐するように指示します。

STOP

プログラムの実行を停止します。

DO

プログラムがホスト言語ルーチンをコールするように指示します。routineの構文はホスト言語によって異なります。使用する言語固有のOracleプリコンパイラ・ガイドの補足資料を参照してください。

使用上の注意

WHENEVERコマンドを使用すると、埋込みSQL文でエラーまたは警告が発生したときに、プログラムからエラー処理のルーチンに制御を移すことができます。

WHENEVER文の有効範囲は、論理的なものではなく、位置的なものです。WHENEVER文は、プログラム論理の流れではなく、ソース・ファイル内で物理的に後に続くすべての埋込みSQL文に適用されます。WHENEVER文は、同じ条件をチェックする別のWHENEVER文に置換されるまで有効です。

このコマンドの詳細は、第7章「トランザクションの定義および制御」を参照してください。WHENEVER埋込みSQLコマンドとWHENEVER SQL*Plusコマンドを混同しないでください。

次の例では、Pro*C/C++埋込みSQLプログラムでのWHENEVERコマンドの使用方法を示しています。

EXEC SQL WHENEVER NOT FOUND CONTINUE;
... 
EXEC SQL WHENEVER SQLERROR GOTO sql_error: 
... 
sql_error: 
 EXEC SQL WHENEVER SQLERROR CONTINUE; 
 EXEC SQL ROLLBACK RELEASE;

関連項目

なし。