E 埋込みSQLコマンドおよびディレクティブ
この付録の内容は次のとおりです。
この付録では、SQL92の埋込みSQLコマンドとディレクティブ、およびOracleの埋込みSQL拡張機能について説明します。これらのコマンドおよびディレクティブをソース・コードで使用するときは、キーワードのEXEC SQLを前に付けます。SQL構文をすべて暗記しようとせずに、次のものを含め、この付録を参照してください。
-
埋込みSQLコマンドおよびディレクティブの概要
-
コマンド記述に関する項
-
構文図の読み方
-
コマンドおよびディレクティブのアルファベット順のリスト
E.1 プリコンパイラのディレクティブと埋込み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 |
エラー状態および警告状態の処置を指定します。 |
E.2 コマンドの説明について
ディレクティブ、コマンドおよび句がアルファベット順に並んでいます。各コマンドの説明には、次の項目があります。
| 見出し | 意味 |
|---|---|
|
用途 |
コマンドの基本的な用途を説明します。 |
|
前提条件 |
必要な権限と、コマンドを使用する前に実行する必要のある手順を示します。特記されていないかぎり、ほとんどのコマンドではインスタンスでデータベースがオープンされている必要があります。 |
|
構文 |
コマンドのキーワードとパラメータを示します。 |
|
キーワードとパラメータ |
各キーワードとパラメータの用途を説明します。 |
|
使用上の注意 |
コマンドの使用方法と使用条件を説明します。 |
|
例 |
コマンドの例文を示します。 |
|
関連項目 |
関連するコマンド、句およびこのマニュアルの関連項目を示します。 |
E.3 構文図の読み方
埋込みSQLの構文の説明には、わかりやすい構文図を使用しています。これらは、正しい構文を示す線と矢印の図です。使用した経験がなくても、心配しないでください。この項では必要な知識を説明します。
構文図の論理的な流れを理解すれば、役に立つガイドになります。構文図をたどれば、どんな埋込みSQL文も検証または作成できます。
構文図は、線と矢印を使用して、文を作成するためのコマンド、パラメータおよびその他の言語要素の並べ方を示します。各図を左から右に矢印が指す方向にたどってください。次の記号が使用されています。
コマンドおよびその他のキーワードは、大文字で表記されています。パラメータは小文字で表記されています。演算子、デリミタおよび終了記号は普通に表記されています。「はじめに」で定義されている表記規則に従い、セミコロンで文を終了します。
構文図に複数のパスがある場合は、任意のパスを選択できます。
キーワード、演算子またはパラメータの選択肢が複数ある場合は、オプションを縦に並べて示します。次の例では、まず縦方向を選択した後、横方向に進めます。
この図は、次の文がすべて有効であることを示しています。
EXEC SQL WHENEVER NOT FOUND ... EXEC SQL WHENEVER SQLERROR ... EXEC SQL WHENEVER SQLWARNING ...
E.3.1 必須のキーワードおよびパラメータ
必須のキーワードおよびパラメータは、単一または代替の選択肢を縦に並べた状態で示します。単独の必須キーワードおよびパラメータはメイン・パス、つまり現在たどっている横線上に現れます。次の例では、cursorが必須パラメータです。
emp_cursorという名前のカーソルがある場合、この構文図によると、次の文は有効です。
EXEC SQL CLOSE emp_cursor;
複数のキーワードまたはパラメータがメイン・パス上に縦に並んでいる場合は、その中のいずれかが必須になります。つまり、キーワードやパラメータを1つ選択する必要がありますが、それはメイン・パス上にあるものでなくてもかまいません。次の例では、4つのアクションのうち1つを選択する必要があります。
E.3.2 オプションのキーワードとパラメータ
キーワードおよびパラメータがメイン・パスの下に並べられている場合は、オプションです。つまり、それらの1つを選択する必要はありません。次の例では、上方向にたどらずに、メイン・パスを続けることができます。
この図では、oracle2の名前のデータベースが存在する場合、次の文はすべて有効です。
EXEC SQL ROLLBACK; EXEC SQL ROLLBACK WORK; EXEC SQL AT oracle2 ROLLBACK;
E.3.3 構文ループ
ループは、その中の構文を何回でも繰り返せることを示します。次の例では、column_nameがループの中にあります。このため、列名を1つ選択した後で、繰り返し戻って別の列名を選択できます。
DEBIT、CREDITおよびBALANCEが列名の場合、この図によれば、次の文はすべて有効です。
EXEC SQL SELECT DEBIT INTO ... EXEC SQL SELECT CREDIT, BALANCE INTO ... EXEC SQL SELECT DEBIT, CREDIT, BALANCE INTO ...
E.3.4 マルチパート図
複数パーツの図では、メイン・パスがすべて端から端まで続いていると考えます。次の例は2パーツの図です。
この図は、次の文が有効であることを示しています。
EXEC SQL PREPARE sql_statement FROM :sql_string;
E.4 ALLOCATE (実行可能埋込みSQL拡張機能)
E.4.5 Allocateの使用上の注意
カーソルが静的であるのに対して、カーソル変数は特定の問合せに結び付けられていないため、動的です。カーソル変数は、型の互換性のある任意の問合せに対してオープンできます。
例
この部分的な例では、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;
}
E.5 CLOSE (実行可能埋込みSQL)
E.5.5 CLOSEの使用上の注意
クローズしたカーソルからは行をフェッチできません。カーソルを再オープンするには、そのカーソルがクローズされている必要はありません。HOLD_CURSORおよびRELEASE_CURSORのプリコンパイラ・オプションによって、CLOSEコマンドの効果が変わります。これらのオプションの詳細は、Oracleプリコンパイラの実行を参照してください。
E.6 COMMIT (実行可能埋込みSQL)
E.6.2 COMMITの前提条件
現行のトランザクションをコミットするために必要な権限はありません。
自分がコミットしたインダウト分散トランザクションを手動でコミットする場合は、FORCE TRANSACTIONシステム権限が必要です。別のユーザーがコミットしたインダウト分散トランザクションを手動でコミットする場合は、FORCE ANY TRANSACTIONシステム権限が必要です。
DBMS MACモードでOracleを使用しているとき、インダウト・トランザクションをコミットできるのは、DBMSラベルがトランザクションのラベル、およびこのトランザクションをコミットしたユーザーの作成ラベルと一致するか、次の条件のいずれかを満たしている場合のみです。
-
トランザクションのラベルまたはユーザーの作成ラベルが、BMSラベルより上位である場合は、
READUPおよびWRITEUPシステム権限が必要です。 -
トランザクションのラベルまたはユーザーの作成ラベルがDBMSラベルより下位の場合は、
WRITEDOWNシステム権限が必要です。 -
トランザクションのラベルまたはユーザーの作成ラベルがDBMSラベルと同等でない場合は、
READUP、WRITEUPおよびWRITEDOWNシステム権限が必要です。
E.6.4 COMMITのキーワードとパラメータ
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を問い合せます。また、オプションのintegerを使用してトランザクションにシステム変更番号(SCN)を明示的に割り当てることができます。整数を省略すると、トランザクションは現行のSCNを使用してコミットされます。
E.6.5 COMMITの使用上の注意
プログラムの最後のトランザクションは、COMMITまたはROLLBACKコマンドとRELEASEオプションを使用して、必ず明示的にコミットまたはロールバックしてください。プログラムが異常終了すると、Oracleによって変更は自動的にロールバックされます。
COMMITコマンドは、ホスト変数またはプログラムの制御の流れには影響を与えません。このコマンドの詳細は、トランザクションの定義および制御を参照してください。
この例では、埋込みSQL COMMITコマンドの使用方法を示しています。
EXEC SQL AT sales_db COMMIT RELEASE;
E.7 CONNECT(実行可能埋込みSQL拡張機能)
E.7.2 CONNECTの前提条件
指定するデータベースでのCREATE SESSIONシステム権限が必要です。
DBMS MACモードでOracleを使用している場合、オペレーティング・システム・ラベルが、作成ラベルおよびCREATE SESSIONシステム権限を付与されたラベルのどちらよりも上位である必要があります。また、オペレーティング・システム・ラベルは、オペレーティング・システムの同等ラベルDBHIGHとDBLOWの間に位置することも必要です。
Oracleをオペレーティング・システムMACモードで使用している場合、オペレーティング・システムのラベルは接続先のデータベースのラベルと一致する必要があります。
E.7.4 CONNECTのキーワードとパラメータ
:user :password
ユーザー名とパスワードを個別に指定します。
:user_password
スラッシュ(/)で区切られたOracleのユーザー名とパスワードを含む1つのホスト変数。
Oracleで使用しているオペレーティング・システムを介した接続を検証するには、:user_password値として「/」を指定します。
AT
接続先のデータベースを指定します。次のいずれかを使用してデータベースを指定します。
db_nameは、DECLARE DATABASE文で事前に宣言したデータベース識別子。
:host_variableは、値が事前に宣言したdb_nameであるホスト変数。
USING
デフォルト以外のデータベースへの接続に使用するSQL*Netデータベース指定文字列を指定します。この句を省略した場合は、デフォルトのデータベースに接続します。
E.7.5 CONNECTの使用上の注意
プログラムは複数の接続を持つことができますが、デフォルト・データベースには1度しか接続できません。このコマンドの詳細は、プログラム要件への対応を参照してください。
例
次の例では、CONNECTの使用方法を説明しています。
EXEC SQL CONNECT :username IDENTIFIED BY :password
さらにこの文を使用して、useridの値をusernameの値にしたり、SCOTT/TIGERのようにpasswordを「/」で区切ったものを設定できます。
EXEC SQL CONNECT :userid
E.8 DECLARE CURSOR (埋込みSQLディレクティブ)
E.8.2 DECLARE CURSORの前提条件
SQL文またはPL/SQLブロックの識別子にカーソルを関連付ける場合、DECLARE STATEMENT文でこの識別子を事前に宣言しておく必要があります。
E.8.4 DECLARE CURSORのキーワードとパラメータ
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文で事前に宣言する必要があります。
E.8.5 DECLARE CURSORの使用上の注意
カーソルは、他の埋込みSQL文で参照する前に、宣言する必要があります。カーソル宣言のスコープはプリコンパイル・ユニット内全体になるため、各カーソルの名前はスコープ内で一意であることが必要です。1つのプリコンパイル・ユニット内で同じ名前のカーソルを複数宣言することはできません。
CURRENT OF構文を使用しているUPDATEまたはDELETE文のWHERE句ではカーソルを参照することができます。その場合カーソルはOPEN文でオープンされ、FETCH文で行に配置されます。このコマンドの詳細は、プログラム要件への対応を参照してください。
E.9 DECLARE DATABASE (Oracle埋込みSQLディレクティブ)
E.9.5 DECLARE DATABASEの使用上の注意
デフォルト以外のデータベースに対してdb_nameを宣言するのは、他の埋込みSQL文でAT句を使用してそのデータベースを参照できるようにするためです。AT句を指定してCONNECT文を発行する前に、DECLARE DATABASE文でデフォルト以外のデータベースに対してdb_nameを宣言する必要があります。
このコマンドの詳細は、プログラム要件への対応を参照してください。
E.9.6 DECLARE DATABASEの例
この例では、DECLARE DATABASEディレクティブの使用方法を示しています。
EXEC SQL DECLARE oracle3 DATABASE
E.10 DECLARE STATEMENT (埋込みSQLディレクティブ)
E.10.4 DECLARE STATEMENTのキーワードとパラメータ
AT
SQL文またはPL/SQLブロックが宣言されるデータベースを指定します。次のいずれかを使用してデータベースを指定します。
db_nameは、DECLARE DATABASE文で事前に宣言したデータベース識別子。
:host_variableは、値が事前に宣言したdb_nameであるホスト変数。
この句を省略した場合、Oracleではデフォルトのデータベースに対してSQL文またはPL/SQLブロックを宣言します。
statement_name block_name
文に対して宣言する識別子。
E.10.5 DECLARE STATEMENTの使用上の注意
DECLARE STATEMENT文を使用してSQL文またはPL/SQLブロックの識別子を宣言する必要があるのは、その識別子を参照するDECLARE CURSOR文が、埋込みSQLプログラム内で、その文またはブロックを解析して識別子と関連付けるPREPARE文よりも物理的に(論理的にではなく)前にある場合のみです。
文の宣言の有効範囲は、カーソルの宣言と同様に、プリコンパイル・ユニット内全体に及びます。このコマンドの詳細は、プログラム要件への対応および動的SQLの使用方法を参照してください。
E.10.7 DECLARE 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; ...
E.11 DECLARE TABLE (Oracle埋込みSQLディレクティブ)
E.11.4 DECLARE TABLEのキーワードとパラメータ
table
宣言した表の名前。
column
tableの列。
datatype
columnのデータ型。
DEFAULT
columnのデフォルト値を指定します。
NULL
columnにNULLを含めてよいことを指定します。
NOT NULL
columnにはNULLを含められないことを指定します。
WITH DEFAULT
IBM DB2データベースとの互換性のためにサポートされています。
E.12 DELETE(実行可能埋込みSQL)
E.12.2 DELETEの前提条件
表から行を削除するには、表が自分のスキーマにあるか、または表に対する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システム権限が必要です。
E.12.4 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は表またはビューからすべての行を削除します。
E.12.5 DELETEの使用上の注意
WHERE句のホスト変数は、すべてがスカラーか、あるいはすべてが配列であることが必要です。変数がスカラーの場合、OracleではDELETE文が1回しか実行されません。変数が配列の場合、Oracleは配列のコンポーネント・セットごとに1回ずつこの文を実行します。1回の実行で0行、1行または複数行を削除できます。
WHERE句の配列ホスト変数は、サイズが異なっていてもかまいません。この場合、Oracleが文を実行する回数は、次のうちの小さい方の値によって決定します。
-
最小の配列のサイズ
-
オプションの
FOR句の:host_integerの値
この条件を満たす行がない場合、行は削除されず、SQLCODEはNOT_FOUND条件を戻します。
削除された行の累積数はSQLCAを介して戻されます。WHERE句に配列ホスト変数が指定されていると、DELETE文によって処理された配列のすべてのコンポーネントについて削除された行の合計数がこの値に反映されます。
条件を満たす行がない場合、OracleからはSQLCAのSQLCODEを介してエラーが戻されます。WHERE句を省略した場合、OracleによりSQLCAのSQLWARNの第5コンポーネントに警告フラグが設定されます。このコマンドおよびSQLCAの詳細は、エラーの処理および診断を参照してください。
DELETE文ではコメントを使用して、指示、すなわちヒントをOracleオプティマイザに渡すことができます。オプティマイザでは、このヒントを使用して文の実行計画が選択されます。
E.12.6 DELETEの例
この例では、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;
E.13 DESCRIBE(実行可能埋込みSQL)
E.13.4 DESCRIBEのキーワードとパラメータ
BIND VARIABLES
SQL文またはPL/SQLブロックの入力変数に関する情報を保持する記述子を初期化します。
SELECT LIST
SELECT文の選択リストに関する情報を保持する記述子を初期化します。
デフォルトはSELECT LIST FORです。
statement_name block_name
PREPARE文で事前に準備したSQL文またはPL/SQLブロックを指定します。
descriptor
初期化する記述子の名前。
E.13.5 DESCRIBEの使用上の注意
埋込みSQLプログラム内のバインド記述子または選択記述子を操作するには、その前にDESCRIBE文を発行する必要があります。
入力変数と出力変数の両方を同じ記述子に記述することはできません。
DESCRIBE文で検出される変数の数は、一意に名前が指定されたプレースホルダの合計数ではなく、準備するSQL文またはPL/SQLブロックのプレースホルダの合計数です。このコマンドの詳細は、動的SQLの使用方法を参照してください。
E.13.6 DESCRIBEの例
この例では、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;
E.14 EXECUTE ...END-EXEC (実行可能埋込みSQL拡張機能)
E.14.4 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文終了記号を入れる必要があります。
E.14.5 EXECUTE ... END-EXECの使用上の注意
Oracleプリコンパイラは埋込みPL/SQLブロックを1つの埋込みSQL文のように扱うため、PL/SQLブロックはOracleプリコンパイラ・プログラムでSQL文を埋め込める場所であればどこにでも埋め込めます。Oracleプリコンパイラ・プログラムへのPL/SQLブロックの埋込みの詳細は、埋込みPL/SQLの使用方法を参照してください。
E.15 EXECUTE (実行可能埋込みSQL)
E.15.4 EXECUTEのキーワードとパラメータ
FOR :host_integer
USING句に配列ホスト変数が含まれる場合に、文を実行する回数を制限します。この句を省略した場合、Oracleでは最小の配列のコンポーネントごとに文が1回ずつ実行されます。
statement_id
実行するSQL文またはPL/SQLブロックに関連付けられるプリコンパイラ識別子。プリコンパイラ識別子を文またはPL/SQLブロックに関連付けるには、埋込みSQL PREPAREコマンドを使用します。
オプションのインジケータ変数を使用して、Oracleで実行する文に入力変数として代入するホスト変数のリストを指定します。ホスト変数およびインジケータ変数は、すべてがスカラーであるか、あるいはすべてが配列であることが必要です。
E.15.6 EXECUTEの例
この例では、Pro*C/C++埋込みSQLプログラムでのEXECUTE文の使用方法を示しています。
EXEC SQL PREPARE my_statement FROM :my_string; EXEC SQL EXECUTE my_statement USING :my_var;
E.16 EXECUTE IMMEDIATE (実行可能埋込みSQL)
E.16.4 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文のいずれかです。
E.16.5 EXECUTE IMMEDIATEの使用上の注意
EXECUTE IMMEDIATE文を発行すると、Oracleでは指定したSQL文またはPL/SQLブロックを解析してエラーをチェックし、実行します。見つかったエラーは、SQLCAのSQLCODEコンポーネントに戻されます。
このコマンドの詳細は、動的SQLの使用方法を参照してください。
E.16.6 EXECUTE IMMEDIATEの例
この例では、EXECUTE IMMEDIATE文の使用方法を示しています。
EXEC SQL EXECUTE IMMEDIATE 'DELETE FROM emp WHERE empno = 9460'
E.17 FETCH (実行可能埋込みSQL)
E.17.4 FETCHのキーワードおよびパラメータ
FOR :host_integer
配列ホスト変数を使用している場合、フェッチする行数を制限します。この句を省略した場合、Oracleは最小の配列を満たすのに十分な数の行をフェッチします。
cursor
DECLARE CURSOR文を使用して宣言したカーソル。FETCH文は、カーソルに関連付けられた問合せにより選択された行のうち1行を戻します。
:cursor_variable
ALLOCATE文を使用して割り当てたカーソル変数。FETCH文は、カーソル変数に関連付けられた問合せにより選択された行のうちの1行を戻します。
フェッチしたデータを格納するホスト変数およびオプションのインジケータ変数のリストを指定します。これらのホスト変数および標識変数は、プログラム内で宣言されている必要があります。
USING
DESCRIBE文で事前に参照している記述子を指定します。この句は、動的埋込みSQL方法4以外では使用しないでください。また、カーソル変数を使用しているときも、USING句は適用されません。
E.17.5 FETCHの使用上の注意
FETCH文は、アクティブ・セットの行を読み取り、結果が含まれる出力変数の名前を付けます。対応付けられたホスト変数がNULLの場合、インディケータ変数の値は-1に設定されます。最初のカーソルのFETCH文は、必要に応じて、アクティブ・セットの行のソートも行います。
フェッチする行数は、出力ホスト変数のサイズおよびFOR句で指定した値で指定します。データを取得するホスト変数は、すべてがスカラーか、あるいはすべてが配列であることが必要です。スカラーの場合は、Oracleは1行のみフェッチします。配列の場合、Oracleは配列を満たすのに十分な数の行をフェッチします。
配列ホスト変数は、サイズが異なってもかまいません。この場合、Oracleがフェッチする行数は、次の値のうち小さい方です。
-
最小の配列のサイズ
-
オプションの
FOR句の:host_integerの値
フェッチする行数は、実際に問合せを満たす行数によってさらに限定できます。
FETCH文が、問合せで戻された行すべてを取得しなかった場合、カーソルは戻された次の行に配置されます。問合せで戻された最後の行を取得すると、次のFETCH文を実行すると、SQLCAのSQLCODE要素にエラー・コードが戻されることになります。
FETCHコマンドにはAT句がないので注意してください。カーソルでアクセスするデータベースは、DECLARE CURSOR文で指定する必要があります。
FETCH文では、アクティブ・セット内で進めるのは前方向のみです。すでにフェッチした行に戻る場合は、カーソルを再オープンして各行を順番に取り出す必要があります。アクティブ・セットを変更するには、新しい値をカーソルの問合せの入力ホスト変数に割り当て、カーソルを再オープンします。
E.17.6 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; ...
E.18 INSERT(実行可能埋込みSQL)
E.18.2 INSERTの前提条件
表に行を挿入するには、表が自分のスキーマにあるか、または表に対するINSERT権限が必要です。
ビューの実表に行を挿入するには、ビューが属するスキーマの所有者に、実表に対するINSERT権限が必要です。また、ビューが自分以外のスキーマにある場合は、そのビューに対するINSERT権限が必要です。
INSERT ANY TABLEシステム権限があれば、どの表またはビューの実表にも行を挿入できます。
OracleをDBMS MACモードで使用している場合は、DBMSラベルが表またはビューの作成ラベルと一致する必要があります。
-
表またはビューの作成ラベルがDBMSラベルより上位にある場合は、
WRITEUPシステム権限が必要です。 -
表またはビューの作成ラベルがDBMSラベルより下位にある場合は、
WRITEDOWNシステム権限が必要です。 -
表またはビューの作成ラベルがDBMSラベルと同等でない場合は、
WRITEUPおよびWRITEDOWNシステム権限が必要です。
E.18.4 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句または問合せから値が割り当てられます。
このリストから表の列を削除する場合、挿入された行の列値は、表の作成時に指定した列のデフォルト値となります。列のリストを完全に省略した場合は、VALUES句または問合せで表のすべての列に値を指定する必要があります。
VALUES
表またはビューに挿入する値の表を指定します。ホスト変数には、オプションのインディケータ変数と合せて式も使用できます。VALUES句では、列リストの列ごとに式を指定する必要があります。
subquery
表に挿入される行を戻す副問合せ。この副問合せの選択リストの列数は、INSERT文の列リストの列数と同じであることが必要です。
E.18.5 INSERTの使用上の注意
WHERE句のホスト変数は、すべてがスカラーか、あるいはすべてが配列であることが必要です。変数がスカラーの場合、OracleではINSERT文が1回しか実行されません。変数が配列の場合は、配列のコンポーネントのセットごとにINSERT文が1回実行され、1行ずつ挿入されます。
WHERE句の配列ホスト変数は、サイズが異なっていてもかまいません。この場合、Oracleが文を実行する回数は、次のうちの小さい方の値によって決定します。
-
最小の配列のサイズ
-
オプションのFOR句の:host_integerの値。
このコマンドの詳細は、埋込みSQLの使用方法を参照してください。
E.18.6 INSERTの例I
この例では、埋込みSQL INSERTコマンドの使用方法を示しています。
EXEC SQL INSERT INTO emp (ename, empno, sal) VALUES (:ename, :empno, :sal);
E.18.7 INSERTの例II
この例では、副問合せを使用した埋込みSQL INSERTコマンドを示しています。
EXEC SQL INSERT INTO new_emp (ename, empno, sal) SELECT ename, empno, sal FROM emp WHERE deptno = :deptno;
E.19 OPEN (実行可能埋込みSQL)
E.19.5 OPENの使用上の注意
OPENコマンドは、行のアクティブ・セットを定義し、アクティブ・セットの最初の行の直前でカーソルを初期化します。OPEN時のホスト変数の値が文に代入されます。このコマンドは、実際には行を取り出しません。行はFETCHコマンドを使用して取り出されます。
カーソルと一度オープンすると、その入力変数はカーソルを再オープンするまで再検査されません。入力ホスト変数およびアクティブ・セットを変更するには、カーソルを再オープンする必要があります。
プログラム内のすべてのカーソルは、プログラムを開始するとき、またはCLOSEコマンドを使用して明示的にクローズした後はクローズ状態です。
カーソルは事前にクローズしなくても、再オープンできます。このコマンドの詳細は、埋込みSQLの使用方法を参照してください。
E.19.6 OPENの例
この例では、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;
E.20 PREPARE (実行可能埋込みSQL)
E.20.4 PREPAREのキーワードおよびパラメータ
statement_id
準備済のSQL文またはPL/SQLブロックに関連付ける識別子。この識別子がすでに別の文またはブロックに割り当てられている場合は、以前の割当てが置き換えられます。
:host_string
準備するSQL文またはPL/SQLブロックのテキストが値であるホスト変数。
text
準備するSQL文またはPL/SQLブロックを含む文字列リテラル。
E.20.5 PREPAREの使用上の注意
:host_stringまたはtextの変数はすべてプレースホルダです。実際のホスト変数名は、OPENコマンドのUSING句(入力ホスト変数)またはFETCHコマンドのINTO句(出力ホスト変数)に割り当てます。
SQL文は一度準備すると、何回でも実行できます。
E.20.6 PREPAREの例
この例では、Pro*C/C++埋込みSQLプログラムでのPREPARE文の使用方法を示しています。
EXEC SQL PREPARE my_statement FROM :my_string; EXEC SQL EXECUTE my_statement;
E.21 ROLLBACK (実行可能埋込みSQL)
E.21.2 ROLLBACKの前提条件
現行のトランザクションをロールバックする場合、権限は不要です。
自分でコミットしたインダウトの分散トランザクションを手動でロールバックするには、FORCE TRANSACTIONシステム権限が必要です。他のユーザーがコミットしたインダウトの分散トランザクションを手動でロールバックするには、FORCE ANY TRANSACTIONシステム権限が必要です。
E.21.4 ROLLBACKのキーワードおよびパラメータ
WORK
オプションで、ANSIとの互換性のために用意されています。
TO
指定したセーブポイントまで現行のトランザクションをロールバックします。この句を省略した場合、ROLLBACK文はトランザクション全体をロールバックします。
FORCE
インダウトの分散トランザクションを手動でロールバックします。ローカルまたはグローバル・トランザクションIDを格納するtextによりトランザクションを指定します。このトランザクションのIDを確認する場合は、データ・ディクショナリ・ビューDBA_2PC_PENDINGを問い合せます。
ROLLBACK文でのFORCE句の使用は、PL/SQLではサポートされていません。
RELEASE
すべてのリソースを解放し、アプリケーションのOracleサーバーとの接続を切断します。RELEASE句は、SAVEPOINT句およびFORCE句とは併用できません。
E.21.5 ROLLBACKの使用上の注意
トランザクション(または論理作業単位)は、Oracleが1つの単位として扱う一連のSQL文です。トランザクションは、COMMIT、ROLLBACKまたはデータベースへの接続の後の最初の実行SQL文から始まります。トランザクションは、COMMIT文、ROLLBACK文またはデータベースとの接続を切断(意図的または不用意な切断)により終了します。Oracleでは、データ定義言語文の処理前および処理後に暗黒的COMMIT文が発行されます。
TO SAVEPOINT句を指定せずにROLLBACKコマンドを使用すると、次の処理が実行されます。
-
トランザクションを終了します。
-
カレント・トランザクションの変更内容がすべて取り消されます。
-
トランザクションのセーブポイントがすべて消去されます。
-
トランザクションのロックを解除します。
TO SAVEPOINT句を指定してROLLBACKコマンドを使用すると、次の処理が実行されます。
-
トランザクションのセーブポイント後の部分のみロールバックされます。
-
指定したセーブポイントの後に作成したセーブポイントをすべて消去します。指定したセーブポイントは保持されるため、そのセーブポイントまで複数回ロールバックできます。指定したセーブポイントより前に作成されたセーブポイントも残ります。
-
指定したセーブポイント後に取得した表および行のロックがすべて解除されます。セーブポイント後にロックされた行へのアクセスを要求した他のトランザクションは、コミットまたはロールバックされるまで待機する必要があります。行を要求していない他のトランザクションは、すぐに行の要求およびアクセスができます。
アプリケーション・プログラムでは、COMMITまたはROLLBACK文のいずれかを使用してトランザクションを明示的に終了することをお薦めします。トランザクションを明示的にコミットしなかった場合にプログラムが異常終了すると、Oracleはコミットされていない最後のトランザクションをロールバックします。
E.21.8 ROLLBACKの分散トランザクション
Oracleで分散オプションを使用すると、分散トランザクション、または複数のデータベースでデータを変更するトランザクションを実行できます。分散トランザクションをコミットまたはロールバックするには、他のトランザクションの場合と同様に、COMMIT文またはROLLBACK文を発行すれば済みます。
分散トランザクションのコミット・プロセス中にネットワーク障害が発生すると、トランザクションの状態が不明、つまりインダウトになる可能性があります。そのトランザクションに関連する他のデータベースの管理者に問い合せて、ローカル・データベースのトランザクションを手動でコミットするか、ロールバックするかを決定できます。ローカル・データベースのトランザクションは、FORCE句を指定したROLLBACK文を発行すれば、手動でロールバックできます。
インダウトのトランザクションを手動でセーブポイントまでロールバックすることはできません。
FORCE句を指定したROLLBACK文でロールバックできるのは、指定したトランザクションのみです。この文は、現行のトランザクションには影響しません。
E.22 SAVEPOINT (実行可能埋込みSQL)
E.22.4 SAVEPOINTのキーワードとパラメータ
AT
セーブポイントを宣言するデータベースを指定します。次のいずれかを使用してデータベースを指定します。
db_nameは、DECLARE DATABASE文で事前に宣言したデータベース識別子。
:host_variableは、値が事前に宣言したdb_nameであるホスト変数。
この句を省略した場合、セーブポイントはデフォルトのデータベースに対して作成されます。
savepoint
作成するセーブポイントの名前。
E.22.5 SAVEPOINTの使用上の注意
このコマンドの詳細は、トランザクションの定義および制御を参照してください。
例
この例では、埋込みSQL SAVEPOINTコマンドの使用方法を示しています。
EXEC SQL SAVEPOINT save3;
E.23 SELECT (実行可能埋込みSQL)
E.23.2 SELECTの前提条件
表またはスナップショットからデータを選択するには、表またはスナップショットが自分のスキーマにあるか、またはその表あるいはスナップショットに対するREADまたはSELECT権限が必要です。
ビューの実表から行を選択するには、ビューが属するスキーマの所有者に、実表に対するREADまたはSELECT権限が必要です。また、ビューが自分以外のスキーマにある場合は、そのビューに対するREADまたはSELECT権限が必要です。
READ ANY TABLEまたはSELECT ANY TABLEシステム権限を使用すると、すべての表、スナップショットまたはビューの実表からデータを選択できます。
OracleをDBMS MACモードで使用している場合は、DBMSラベルが問合せ先の各表、ビューまたはスナップショットの作成ラベルより上位にあるか、READUPシステム権限が必要です。
READ権限は、SELECT ... FOR UPDATE操作には使用できません。
E.23.4 SELECTのキーワードとパラメータ
AT
SELECT文の発行先のデータベースを指定します。次のいずれかを使用してデータベースを指定します。
db_nameは、DECLARE DATABASE文で事前に宣言したデータベース識別子。
:host_variableは、値が事前に宣言したdb_nameであるホスト変数。
この句を省略した場合、SELECT文はデフォルトのデータベースに対して発行されます。
select_list
非埋込みSELECTコマンドと同じですが、リテラルのかわりにホスト変数を使用できます。
SELECT文が戻すデータを受け取る出力ホスト変数とオプションのインディケータ変数を指定します。これらの変数は、すべてスカラーか、すべて配列である必要があります。ただし、配列は同じサイズでなくてもかまいません。
WHERE
戻される行を、条件がTRUEの行のみに制限します。conditionには、ホスト変数を使用できますが、インジケータ変数は使用できません。これらのホスト変数は、スカラーと配列のどちらでもかまいません。
その他のキーワードおよびパラメータはすべて、非埋込みSQL SELECTコマンドと同じです。
E.24 UPDATE (実行可能埋込みSQL)
E.24.2 UPDATEの前提条件
表またはスナップショットの値を更新するには、表が自分のスキーマにあるか、または表に対するUPDATE権限が必要です。
ビューの実表の値を更新するには、ビューが属するスキーマの所有者に、実表に対するUPDATE権限が必要です。また、ビューが自分以外のスキーマにある場合は、そのビューに対するUPDATE権限が必要です。
UPDATE ANY TABLEシステム権限があれば、どの表またはビューの実表でも値を更新できます。
OracleをDBMS MACモードで使用している場合は、DBMSラベルが表またはビューの作成ラベルと一致する必要があります。
-
表またはビューの作成ラベルがDBMSラベルより上位にある場合は、
READUPおよびWRITEUPシステム権限が必要です -
表またはビューの作成ラベルがDBMSラベルより下位にある場合は、
WRITEDOWNシステム権限が必要です。 -
表またはビューの作成ラベルがDBMSラベルと同等でない場合は、
READUP、WRITEUPおよびWRITEDOWNシステム権限が必要です。
E.24.4 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は表またはビューのすべての行を更新します。
E.24.5 UPDATEの使用上の注意
SET句およびWHERE句のホスト変数は、すべてがスカラーか、あるいはすべてが配列であることが必要です。変数がスカラーの場合、OracleではUPDATE文が1回しか実行されません。変数が配列の場合、Oracleは配列のコンポーネント・セットごとに1回ずつこの文を実行します。1回の実行で、0行または1行、複数行を更新できます。
配列ホスト変数は、サイズが異なってもかまいません。この場合、Oracleが文を実行する回数は、次のうちの小さい方の値によって決定します。
-
最小の配列のサイズ
-
オプションの
FOR句の:host_integerの値
更新された行の累計数は、SQLCAのSQLERRDコンポーネントの第3要素を介して戻されます。入力ホスト変数として配列を使用した場合、この数値はUPDATE文で処理された配列のすべてのコンポーネントにおよぶ更新数の合計を示します。条件を満たす行がない場合、行は更新されず、OracleからはSQLCAのSQLCODE要素を使用してエラー・メッセージが戻されます。WHERE句を省略した場合、すべての行が更新され、OracleではSQLCAのSQLWARN要素の第5コンポーネントに警告フラグが設定されます。
UPDATE文ではコメントを使用して、指示、すなわちヒントをOracleオプティマイザに渡すことができます。オプティマイザでは、このヒントを使用して文の実行計画が選択されます。
このコマンドの詳細は、埋込みSQLの使用方法およびトランザクションの定義および制御を参照してください。
E.24.6 UPDATEの例
次の例では、埋込み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';
E.25 VAR (Oracle埋込みSQLディレクティブ)
E.25.4 VARのキーワードおよびパラメータ
host_variable
Oracle外部データ型を割り当てるホスト変数。
datatype
Oracleプリコンパイラによって認識されるOracle外部データ型(Oracle内部データ型ではありません)。データ型には、長さ、精度または位取りを含めることができます。この外部データ型がhost_variableに割り当てられます。外部データ型のリストは、プログラム要件への対応を参照してください。
E.25.5 VARの使用上の注意
ホスト変数の同値化は、一種のデータ型の同値化です。データ型の同値化は次の目的に有効です。
-
文字ホスト変数を自動的にNULLで終了させます。
-
プログラム・データをバイナリ・データとしてデータベースに格納します。
-
デフォルトのデータ型変換をオーバーライドします。
E.25.6 VARの例
この例では、ホスト変数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;
E.26 WHENEVER(埋込みSQLディレクティブ)
E.26.4 WHENEVERのキーワードとパラメータ
E.26.5 WHENEVERの使用上の注意
WHENEVERコマンドを使用すると、埋込みSQL文でエラーまたは警告が発生したときに、プログラムからエラー処理のルーチンに制御を移すことができます。
WHENEVER文の有効範囲は、論理的なものではなく、位置的なものです。WHENEVER文は、プログラム論理の流れではなく、ソース・ファイル内で物理的に後に続くすべての埋込みSQL文に適用されます。WHENEVER文は、同じ条件をチェックする別のWHENEVER文に置換されるまで有効です。
このコマンドの詳細は、トランザクションの定義および制御を参照してください。WHENEVER埋込みSQLコマンドとWHENEVER SQL*Plusコマンドを混同しないでください。
E.26.6 WHENEVERの例
次の例では、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;





























