この付録の項目は次のとおりです。
この付録では、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つ選択した後、繰り返し戻って別の列名を選択できます。

DEBIT、CREDITおよび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;
カーソルが静的であるのに対し、カーソル変数は特定の問合せに関連付けられていないため動的です。カーソル変数は型の互換性のある任意の問合せに対してオープンできます。
例
この部分的な例では、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;
}
クローズしたカーソルからは行をフェッチできません。カーソルは、再オープンするためにクローズする必要はありません。HOLD_CURSORおよびRELEASE_CURSORのプリコンパイラ・オプションによって、CLOSEコマンドの効果が変わります。これらのオプションの詳細は、第6章「Oracleプリコンパイラの実行」を参照してください。
現行のトランザクションをコミットするために必要な権限はありません。
自分でコミットしたインダウトの分散トランザクションを手動でコミットするには、FORCE TRANSACTIONシステム権限が必要です。他のユーザーがコミットしたインダウトの分散トランザクションを手動でコミットするには、FORCE ANY TRANSACTIONシステム権限が必要です。
DBMS MACモードでOracleを使用しているとき、インダウト・トランザクションをコミットできるのは、DBMSラベルがトランザクションのラベル、およびこのトランザクションをコミットしたユーザーの作成ラベルと一致するか、次の条件のいずれかを満たしている場合のみです。
トランザクションのラベルまたはユーザーの作成ラベルが、BMSラベルより上位である場合は、READUPおよびWRITEUPシステム権限が必要です。
トランザクションのラベルまたはユーザーの作成ラベルがDBMSラベルより下位の場合は、WRITEDOWNシステム権限が必要です。
トランザクションのラベルまたはユーザーの作成ラベルがDBMSラベルと同等でない場合は、READUP、WRITEUPおよびWRITEDOWNシステム権限が必要です。
AT
COMMIT文の発行先のデータベースを指定します。データベースは次のいずれかのパラメータを使用して指定します。
db_nameは、事前にDECLARE DATABASE文で宣言したデータベース識別子。
:host_variableは、値が事前に宣言したdb_nameであるホスト変数。
この句を省略した場合、Oracleではデフォルトのデータベースに文が発行されます。
標準SQLに準拠している場合にのみサポートされます。COMMIT文とCOMMIT WORK文は同等です。
現行のトランザクションに関連付けるコメントを指定します。'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;
指定するデータベースでのCREATE SESSIONシステム権限が必要です。
DBMS MACモードでOracleを使用している場合、オペレーティング・システム・ラベルが、作成ラベルおよびCREATE SESSIONシステム権限を付与されたラベルのどちらよりも上位である必要があります。また、オペレーティング・システム・ラベルは、オペレーティング・システムの同等ラベルDBHIGHとDBLOWの間に位置することも必要です。
Oracleをオペレーティング・システムMACモードで使用している場合、オペレーティング・システムのラベルは接続先のデータベースのラベルと一致する必要があります。
: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
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章「プログラム要件への対応」を参照してください。
デフォルト以外のデータベースに対してdb_nameを宣言するのは、他の埋込みSQL文でAT句を使用してそのデータベースを参照できるようにするためです。AT句を指定してCONNECT文を発行する前に、DECLARE DATABASE文でデフォルト以外のデータベースに対してdb_nameを宣言する必要があります。
このコマンドの詳細は、第3章「プログラム要件への対応」を参照してください。
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の使用方法」を参照してください。
この例では、DECLARE STATEMENT文の使用方法を示しています。
EXEC SQL AT remote_db DECLARE my_statement STATEMENT EXEC SQL PREPARE my_statement FROM :my_string EXEC SQL EXECUTE my_statement
table
宣言した表の名前。
column
tableの列。
datatype
columnのデータ型。
DEFAULT
columnのデフォルト値を指定します。
NULL
columnにNULLを含めてよいことを指定します。
NOT NULL制約
columnにはNULLを含められないことを指定します。
WITH DEFAULT
IBM DB2データベースとの互換性のためにサポートされています。
表から行を削除するには、表が自分のスキーマにあるか、または表に対するDELETE権限が必要です。
ビューの実表から行を削除するには、ビューが属するスキーマの所有者に、実表に対するDELETE権限が必要です。また、ビューが自分以外のスキーマにある場合は、そのビューに対するDELETE権限が必要です。
DELETE ANY TABLEシステム権限があれば、どの表またはビューの実表からでも行を削除できます。
OracleをDBMS MACモードで使用している場合は、DBMSラベルが表またはビューの作成ラベルより上位にあるか、次の条件の1つを満たしている必要があります。
表またはビューの作成ラベルがDBMSラベルより上位にある場合は、READUPおよびWRITEUPシステム権限が必要です。
表またはビューの作成ラベルがDBMSラベルと同等でない場合は、READUP、WRITEUPおよびWRITEDOWNシステム権限が必要です。
さらに、各表を削除するには、DBMSラベルがその行のラベルと一致するか、次の条件の1つを満たす必要があります。
行のラベルがDBMSラベルより上位にある場合は、READUPおよびWRITEUPシステム権限が必要です。
行ラベルがDBMSラベルより下位にある場合は、WRITEDOWNシステム権限が必要です。
行ラベルがDBMSラベルと同等でない場合は、READUP、WRITEUPおよびWRITEDOWNシステム権限が必要です。
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文で使用されます。
削除する行を指定します。
conditionは、条件を満たす行のみを削除します。この条件には、ホスト変数およびオプションのインジケータ変数を含めることができます。
CURRENT OFは、cursorによって最後にフェッチされた行のみを削除します。cursorは、FOR UPDATE句により具体的に1つの表のみがロックされていないかぎり、結合を実行するSELECT文に関連付けることはできません。
この句を完全に省略した場合、Oracleでは表またはビューからすべての行が削除されます。
WHERE句のホスト変数は、すべてがスカラーか、あるいはすべてが配列であることが必要です。変数がスカラーの場合、OracleではDELETE文が1回しか実行されません。変数が配列の場合は、配列のコンポーネントのセットごとに文が1回実行されます。1回の実行で削除される行は、0行の場合もあれば、1行または複数行の場合もあります。
WHERE句の配列ホスト変数は、サイズが異なっていてもかまいません。この場合、Oracleでの文の実行回数は、次のうち小さい方の値により決まります。
最小の配列のサイズ
オプションのFOR句の:host_integerの値
この条件を満たす行がない場合、行は削除されず、SQLCODEはNOT_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;
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;
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の使用方法」を参照してください。
USING句に配列ホスト変数が含まれる場合に、文を実行する回数を制限します。この句を省略した場合、Oracleでは最小の配列のコンポーネントごとに文が1回ずつ実行されます。
statement_id
実行するSQL文またはPL/SQLブロックに関連付けられるプリコンパイラ識別子。プリコンパイラ識別子を文またはPL/SQLブロックに関連付けるには、埋込みSQL PREPAREコマンドを使用します。
オプションのインジケータ変数を使用して、Oracleで実行する文に入力変数として代入するホスト変数のリストを指定します。ホスト変数およびインジケータ変数は、すべてがスカラーであるか、あるいはすべてが配列であることが必要です。
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の使用方法」を参照してください。
FOR :host_integer
配列ホスト変数を使用している場合、フェッチする行数を制限します。この句を省略した場合、Oracleでは最小の配列を満たすのに十分な数の行がフェッチされます。
cursor
DECLARE CURSOR文を使用して宣言したカーソル。FETCH文は、カーソルに関連付けられた問合せにより選択された行のうち1行を戻します。
:cursor_variable
ALLOCATE文を使用して割り当てたカーソル変数。FETCH文は、カーソル変数に関連付けられた問合せにより選択された行のうちの1行を戻します。
フェッチしたデータを格納するホスト変数およびオプションのインジケータ変数のリストを指定します。これらのホスト変数およびインジケータ変数は、プログラム内で宣言しておく必要があります。
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権限が必要です。
ビューの実表に行を挿入するには、ビューが属するスキーマの所有者に、実表に対するINSERT権限が必要です。また、ビューが自分以外のスキーマにある場合は、そのビューに対するINSERT権限が必要です。
INSERT ANY TABLEシステム権限があれば、どの表またはビューの実表にも行を挿入できます。
OracleをDBMS MACモードで使用している場合は、DBMSラベルが表またはビューの作成ラベルと一致する必要があります。
表またはビューの作成ラベルがDBMSラベルより上位にある場合は、WRITEUPシステム権限が必要です。
表またはビューの作成ラベルがDBMSラベルより下位にある場合は、WRITEDOWNシステム権限が必要です。
表またはビューの作成ラベルがDBMSラベルと同等でない場合は、WRITEUPおよびWRITEDOWNシステム権限が必要です。
AT
INSERT文を実行するデータベースを指定します。データベースは次のいずれかのパラメータを使用して指定します。
db_nameは、DECLARE DATABASE文で事前に宣言したデータベース識別子。
:host_variableは、値が事前に宣言したdb_nameであるホスト変数。
この句を省略した場合、INSERT文はデフォルトのデータベースで実行されます。
VALUES句に配列ホスト変数が含まれる場合に、文を実行する回数を制限します。この句を省略した場合、Oracleでは最小の配列のコンポーネントごとに文が1回ずつ実行されます。
schema
表またはビューを含むスキーマ。schemaを省略した場合、Oracleでは表またはビューが自分のスキーマにあるとみなされます。
table view
行を挿入する表の名前。viewを指定すると、Oracleではそのビューの実表に行が挿入されます。
dblink
表またはビューがあるリモート・データベースへのデータベース・リンクの完全または部分的な名前。Oracleを分散オプションで使用している場合にのみ、リモートの表またはビューに行を挿入できます。
dblinkを省略した場合、Oracleでは表またはビューがローカル・データベースにあるとみなされます。
column
表またはビューの列。挿入した行では、このリストの各列にVALUES句または問合せから値が割り当てられます。
このリストから表の列の1つを省略すると、挿入された行の列値は、表の作成時に指定した列のデフォルト値になります。列のリストを完全に省略した場合は、VALUES句または問合せで表のすべての列に値を指定する必要があります。
表またはビューに挿入する値の表を指定します。ホスト変数には、オプションのインジケータ変数と合せて式も使用できます。VALUES句では、列リストの列ごとに式を指定する必要があります。
subquery
表に挿入される行を戻す副問合せ。この副問合せの選択リストの列数は、INSERT文の列リストの列数と同じであることが必要です。
WHERE句のホスト変数は、すべてがスカラーか、あるいはすべてが配列であることが必要です。変数がスカラーの場合、OracleではINSERT文が1回しか実行されません。変数が配列の場合は、配列のコンポーネントのセットごとにINSERT文が1回実行され、1行ずつ挿入されます。
WHERE句の配列ホスト変数は、サイズが異なっていてもかまいません。この場合、Oracleでの文の実行回数は、次のうち小さい方の値により決まります。
最小の配列のサイズ
オプションのFOR句の:host_integerの値。
このコマンドの詳細は、第4章「埋込みSQLの使用方法」を参照してください。
この例では、埋込みSQL INSERTコマンドの使用方法を示しています。
EXEC SQL INSERT INTO emp (ename, empno, sal) VALUES (:ename, :empno, :sal);
cursor
オープンするカーソル。
関連付けられた問合せのWHERE句に代入するホスト変数を指定します。
:host_variableは、カーソルに関連付けられた文に代入する、オプションのインジケータ変数を持つホスト変数を指定します。
DESCRIPTOR
関連付けられた問合せのWHERE句に代入するホスト変数を説明する記述子を指定します。記述子は、DESCRIBE文で事前に初期化しておく必要があります。
代入は、位置に基づいて行われます。この文で指定するホスト変数名は、関連付けられた問合せの変数名と異なってもかまいません。
OPENコマンドは、行のアクティブ・セットを定義し、アクティブ・セットの最初の行の直前でカーソルを初期化します。OPEN時のホスト変数の値が文に代入されます。このコマンドは、実際には行を取得しません。行はFETCHコマンドによって取得します。
カーソルと一度オープンすると、その入力変数はカーソルを再オープンするまで再検査されません。入力ホスト変数を変更し、その結果アクティブ・セットを変更するには、カーソルを再オープンする必要があります。
プログラム内のすべてのカーソルは、プログラムを開始するとき、またはCLOSEコマンドを使用して明示的にクローズした後はクローズ状態です。
カーソルは、事前にクローズしなくても、再オープンできます。このコマンドの詳細は、第4章「埋込みSQLの使用方法」を参照してください。
statement_id
準備済のSQL文またはPL/SQLブロックに関連付ける識別子。この識別子がすでに別の文またはブロックに割り当てられている場合、前の割当ては置き換えられます。
:host_string
準備するSQL文またはPL/SQLブロックのテキストが値であるホスト変数。
text
準備するSQL文またはPL/SQLブロックを含む文字列リテラル。
:host_stringまたはtextの変数はすべてプレースホルダです。実際のホスト変数名は、OPENコマンドのUSING句(入力ホスト変数)またはFETCHコマンドのINTO句(出力ホスト変数)に割り当てます。
SQL文は一度準備すると、何回でも実行できます。
現行のトランザクションをロールバックするには、権限は必要ありません。
自分でコミットしたインダウトの分散トランザクションを手動でロールバックするには、FORCE TRANSACTIONシステム権限が必要です。他のユーザーがコミットしたインダウトの分散トランザクションを手動でロールバックするには、FORCE ANY TRANSACTIONシステム権限が必要です。
オプションで、ANSIとの互換性のために用意されています。
指定したセーブポイントまで現行のトランザクションをロールバックします。この句を省略した場合、ROLLBACK文はトランザクション全体をロールバックします。
FORCE
インダウトの分散トランザクションを手動でロールバックします。トランザクションは、ローカルまたはグローバル・トランザクションIDを含むテキストで指定します。このようなトランザクションのIDを検索するには、データ・ディクショナリ・ビューDBA_2PC_PENDINGに問い合せます。
ROLLBACK文でのFORCE句の使用は、PL/SQLではサポートされていません。
RELEASE
すべてのリソースを解放し、アプリケーションのOracleサーバーとの接続を切断します。RELEASE句は、SAVEPOINT句およびFORCE句とは併用できません。
トランザクション(論理的な作業単位)は、Oracleで1つの単位として扱われる一連のSQL文です。トランザクションは、COMMIT、ROLLBACKまたはデータベースへの接続の後の最初の実行SQL文から始まります。トランザクションは、COMMIT文、ROLLBACK文またはデータベースとの接続を切断(意図的または不用意な切断)により終了します。Oracleでは、データ定義言語文の処理前および処理後に暗黒的COMMIT文が発行されます。
TO SAVEPOINT句を指定せずにROLLBACKコマンドを使用すると、次の処理が実行されます。
トランザクションを終了します。
現行のトランザクションでの変更をすべて取り消します。
トランザクション内のセーブポイントをすべて消去します。
トランザクションのロックを解除します。
TO SAVEPOINT句を指定してROLLBACKコマンドを使用すると、次の処理が実行されます。
トランザクションのセーブポイント後の部分のみをロールバックします。
指定したセーブポイントの後に作成したセーブポイントをすべて消去します。指定したセーブポイントは保持されるため、そのセーブポイントまで複数回ロールバックできます。それより前のセーブポイントも保持されます。
指定したセーブポイント後に取得した表および行ロックをすべて解除します。セーブポイント後にロックされた行へのアクセスを要求した他のトランザクションは、そのトランザクションがコミットまたはロールバックされるまで待機する必要があります。まだ行を要求していない他のトランザクションは、行を要求すればだたちにアクセスできます。
アプリケーション・プログラムでは、COMMITまたはROLLBACK文のいずれかを使用してトランザクションを明示的に終了することをお薦めします。トランザクションを明示的にコミットせずにプログラムが異常終了した場合、Oracleではコミットされていない最後のトランザクションがロールバックされます。
Oracleで分散オプションを使用すると、分散トランザクション、または複数のデータベースでデータを変更するトランザクションを実行できます。分散トランザクションをコミットまたはロールバックするには、他のトランザクションの場合と同様に、COMMIT文またはROLLBACK文を発行すれば済みます。
分散トランザクションのコミット処理中に、ネットワーク障害が発生すると、トランザクションの状態が不明またはインダウトになる可能性があります。そのトランザクションに関係する他のデータベースの管理者と相談してから、自分のローカル・データベースでそのトランザクションを手動でコミットするか、ロールバックするかを決めます。ローカル・データベースのトランザクションは、FORCE句を指定したROLLBACK文を発行すれば、手動でロールバックできます。
インダウトのトランザクションは、手動でセーブポイントまでロールバックすることはできません。
FORCE句を指定したROLLBACK文でロールバックできるのは、指定したトランザクションのみです。このような文は、現行のトランザクションには影響がありません。
AT
セーブポイントを宣言するデータベースを指定します。データベースは次のいずれかのパラメータを使用して指定します。
db_nameは、DECLARE DATABASE文で事前に宣言したデータベース識別子。
:host_variableは、値が事前に宣言したdb_nameであるホスト変数。
この句を省略した場合、セーブポイントはデフォルトのデータベースで作成されます。
savepoint
作成するセーブポイントの名前。
このコマンドの詳細は、第7章「トランザクションの定義および制御」を参照してください。
例
この例では、埋込みSQL SAVEPOINTコマンドの使用方法を示しています。
EXEC SQL SAVEPOINT save3;
表またはスナップショットからデータを選択するには、表またはスナップショットが自分のスキーマにあるか、またはその表あるいはスナップショットに対するSELECT権限が必要です。
ビューの実表から行を選択するには、ビューが属するスキーマの所有者に、実表に対するSELECT権限が必要です。また、ビューが自分以外のスキーマにある場合は、そのビューに対するSELECT権限が必要です。
SELECT ANY TABLEシステム権限を使用すると、すべての表、スナップショットまたはビューの実表からデータを選択できます。
OracleをDBMS MACモードで使用している場合は、DBMSラベルが問合せ先の各表、ビューまたはスナップショットの作成ラベルより上位にあるか、READUPシステム権限が必要です。
AT
SELECT文の発行先のデータベースを指定します。データベースは次のいずれかのパラメータで指定できます。
db_nameは、DECLARE DATABASE文で事前に宣言したデータベース識別子。
:host_variableは、値が事前に宣言したdb_nameであるホスト変数。
この句を省略した場合、SELECT文はデフォルトのデータベースに対して発行されます。
select_list
非埋込みSELECTコマンドと同じですが、リテラルのかわりにホスト変数を使用できます。
SELECT文で戻されるデータを受け取る出力ホスト変数およびオプションのインジケータ変数を指定します。これらの変数は、すべてがスカラーか、すべてが配列であることが必要です。ただし、配列は同じサイズでなくてもかまいません。
WHERE
戻される行を、条件がTRUEの行のみに制限します。conditionには、ホスト変数を使用できますが、インジケータ変数は使用できません。これらのホスト変数はスカラーまたは配列のいずれでもかまいません。
その他のキーワードおよびパラメータはすべて、非埋込みSQL SELECTコマンドと同じです。
WHERE句の条件を満たす行がない場合、行は取得されず、OracleからはSQLCAのSQLCODEコンポーネントを使用してエラー・コードが戻されます。
SELECT文ではコメントを使用して指示、すなわちヒントをOracleオプティマイザに渡すことができます。オプティマイザではヒントを使用して文の実行計画を選択します。ヒントの詳細は、『Oracle Databaseパフォーマンス・チューニング・ガイド』を参照してください。
表またはスナップショットの値を更新するには、表が自分のスキーマにあるか、または表に対するUPDATE権限が必要です。
ビューの実表の値を更新するには、ビューが属するスキーマの所有者に、実表に対するUPDATE権限が必要です。また、ビューが自分以外のスキーマにある場合は、そのビューに対するUPDATE権限が必要です。
UPDATE ANY TABLEシステム権限があれば、どの表またはビューの実表でも値を更新できます。
OracleをDBMS MACモードで使用している場合は、DBMSラベルが表またはビューの作成ラベルと一致する必要があります。
表またはビューの作成ラベルがDBMSラベルより上位にある場合は、READUPおよびWRITEUPシステム権限が必要です。
表またはビューの作成ラベルがDBMSラベルより下位にある場合は、WRITEDOWNシステム権限が必要です。
表またはビューの作成ラベルがDBMSラベルと同等でない場合は、READUP、WRITEUPおよびWRITEDOWNシステム権限が必要です。
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
対応する列に割り当てられた新しい値を戻す副問合せ。
表またはビューで更新する行を指定します。
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章「トランザクションの定義および制御」を参照してください。
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;
エラー・コード+1403(または、MODE=ANSIのときは+100コード)をSQLCODEに戻す例外状態を示します。
負のリターン・コードを戻す状態を示します。
致命的でない警告状態を示します。
CONTINUE
GOTO
プログラムがlabelで指定した名前の文に分岐するように指示します。
プログラムの実行を停止します。
DO
プログラムがホスト言語ルーチンをコールするように指示します。routineの構文はホスト言語によって異なります。使用する言語固有のOracleプリコンパイラ・ガイドの補足資料を参照してください。
WHENEVERコマンドを使用すると、埋込みSQL文でエラーまたは警告が発生したときに、プログラムからエラー処理のルーチンに制御を移すことができます。
WHENEVER文の有効範囲は、論理的なものではなく、位置的なものです。WHENEVER文は、プログラム論理の流れではなく、ソース・ファイル内で物理的に後に続くすべての埋込みSQL文に適用されます。WHENEVER文は、同じ条件をチェックする別のWHENEVER文に置換されるまで有効です。
このコマンドの詳細は、第7章「トランザクションの定義および制御」を参照してください。WHENEVER埋込みSQLコマンドとWHENEVER SQL*Plusコマンドを混同しないでください。