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つ選択した後で、繰り返し戻って別の列名を選択できます。

DEBITCREDITおよび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.3.5 データベース・オブジェクト

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

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

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

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

E.4.1 Allocateの用途

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

E.4.2 Allocateの前提条件

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

E.4.3 Allocateの構文

E.4.4 Allocateのキーワードおよびパラメータ

:cursor_variable

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

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.1 CLOSEの用途

カーソルのオープン時に取得したリソースを解放し、解析ロックを解除して、カーソルを使用禁止にします。

E.5.2 CLOSEの前提条件

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

E.5.3 CLOSEの構文

E.5.4 CLOSEのキーワードとパラメータ

cursor

クローズするカーソル。

cursor_variable

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

E.5.5 CLOSEの使用上の注意

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

E.5.6 CLOSEの例

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

EXEC SQL CLOSE emp_cursor;

E.6 COMMIT (実行可能埋込みSQL)

E.6.1 COMMITの用途

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

E.6.2 COMMITの前提条件

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

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

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

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

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

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

E.6.3 COMMITの構文

E.6.4 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を問い合せます。また、オプションの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.1 CONNECTの用途

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

E.7.2 CONNECTの前提条件

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

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

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

E.7.3 CONNECTの構文

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の値にしたり、AAAAA/BBBBBのようにpasswordを「/」で区切ったものを設定できます。

EXEC SQL CONNECT :userid

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

E.8.1 DECLARE CURSORの用途

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

E.8.2 DECLARE CURSORの前提条件

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

E.8.3 DECLARE CURSORの構文

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.8.6 DECLARE CURSORの例

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

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

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

E.9.1 DECLARE DATABASEの用途

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

E.9.2 DECLARE DATABASEの前提条件

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

E.9.3 DECLARE DATABASEの構文

E.9.4 DECLARE DATABASEのキーワードとパラメータ

db_name

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

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.1 DECLARE STATEMENTの用途

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

E.10.2 DECLARE STATEMENTの前提条件

なし。

E.10.3 DECLARE STATEMENTの構文

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.6 DECLARE STATEMENTの例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

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.1 DECLARE TABLEの用途

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

E.11.2 DECLARE TABLEの前提条件

なし。

E.11.3 DECLARE TABLEの構文

E.11.4 DECLARE TABLEのキーワードとパラメータ

table

宣言した表の名前。

column

tableの列。

datatype

columnのデータ型。

DEFAULT

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

NULL

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

NOT NULL

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

WITH DEFAULT

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

E.11.5 DECLARE TABLEの使用上の注意

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

E.11.6 DECLARE TABLEの例

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

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

E.11.7 DECLARE TABLEの関連項目

なし。

E.12 DELETE(実行可能埋込みSQL)

E.12.1 DELETEの用途

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

E.12.2 DELETEの前提条件

表から行を削除するには、表が自分のスキーマにあるか、または表に対する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システム権限が必要です。

E.12.3 DELETEの構文

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の値

この条件を満たす行がない場合、行は削除されず、SQLCODENOT_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.1 DESCRIBEの用途

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

E.13.2 DESCRIBEの前提条件

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

E.13.3 DESCRIBEの構文

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.13.7 DESCRIBEの関連項目

PREPARE(実行可能埋込みSQL)

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

E.14.1 EXECUTE ... END-EXECの用途

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

E.14.2 EXECUTE ... END-EXECの前提条件

なし。

E.14.3 EXECUTE ... END-EXECの構文

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.14.6 EXECUTE ... END-EXECの例

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

E.14.7 EXECUTE ... END-EXECの関連項目

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

E.15 EXECUTE (実行可能埋込みSQL)

E.15.1 EXECUTEの用途

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

E.15.2 EXECUTEの前提条件

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

E.15.3 EXECUTEの構文

E.15.4 EXECUTEのキーワードとパラメータ

FOR :host_integer

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

statement_id

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

USING

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

E.15.5 EXECUTEの使用上の注意

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

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.1 EXECUTE IMMEDIATEの用途

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

E.16.2 EXECUTE IMMEDIATEの前提条件

なし。

E.16.3 EXECUTE IMMEDIATEの構文

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.16.7 EXECUTE IMMEDIATEの関連項目

EXECUTE(実行可能埋込みSQL)およびPREPARE(実行可能埋込みSQL)

E.17 FETCH (実行可能埋込みSQL)

E.17.1 FETCHの用途

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

E.17.2 FETCHの前提条件

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

E.17.3 FETCHの構文

E.17.4 FETCHのキーワードおよびパラメータ

FOR :host_integer

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

cursor

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

:cursor_variable

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

INTO

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

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.1 INSERTの用途

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

E.18.2 INSERTの前提条件

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

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

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

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

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

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

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

E.18.3 INSERTの構文

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.1 OPENの用途

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

E.19.2 OPENの前提条件

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

E.19.3 OPENの構文

E.19.4 OPENのキーワードとパラメータ

cursor

オープンするカーソル。

USING

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

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

DESCRIPTOR

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

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

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.1 PREPAREの用途

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

E.20.2 PREPAREの前提条件

なし。

E.20.3 PREPARE文の構文

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.1 ROLLBACKの用途

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

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

E.21.2 ROLLBACKの前提条件

現行のトランザクションをロールバックする場合、権限は不要です。

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

E.21.3 ROLLBACKの構文

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文です。トランザクションは、COMMITROLLBACKまたはデータベースへの接続の後の最初の実行SQL文から始まります。トランザクションは、COMMIT文、ROLLBACK文またはデータベースとの接続を切断(意図的または不用意な切断)により終了します。Oracleでは、データ定義言語文の処理前および処理後に暗黒的COMMIT文が発行されます。

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

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

  • カレント・トランザクションの変更内容がすべて取り消されます。

  • トランザクションのセーブポイントがすべて消去されます。

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

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

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

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

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

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

E.21.6 ROLLBACKの例I

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

EXEC SQL ROLLBACK;

E.21.7 ROLLBACKの例II

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

EXEC SQL ROLLBACK TO SAVEPOINT sp5;

E.21.8 ROLLBACKの分散トランザクション

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

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

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

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

E.21.9 ROLLBACKの例III

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

EXEC SQL
 ROLLBACK WORK
 FORCE '25.32.87';

E.22 SAVEPOINT (実行可能埋込みSQL)

E.22.1 SAVEPOINTの用途

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

E.22.2 SAVEPOINTの前提条件

なし。

E.22.3 SAVEPOINTの構文

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.1 SELECTの用途

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

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.3 SELECTの構文

E.23.4 SELECTのキーワードとパラメータ

AT

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

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

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

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

select_list

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

INTO

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

WHERE

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

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

E.23.5 SELECTの使用上の注意

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

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

E.23.6 SELECTの例

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

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

E.24 UPDATE (実行可能埋込みSQL)

E.24.1 UPDATEの用途

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

E.24.2 UPDATEの前提条件

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

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

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

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

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

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

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

E.24.3 UPDATEの構文

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.1 VARの用途

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

E.25.2 VARの前提条件

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

E.25.3 VARの構文

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.25.7 VARの関連項目

なし。

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

E.26.1 WHENEVERの用途

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

E.26.2 WHENEVERの前提条件

なし。

E.26.3 WHENEVERの構文

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

E.26.4 WHENEVERのキーワードとパラメータ

NOT FOUND

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

SQLERROR

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

SQLWARNING

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

CONTINUE

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

GOTO

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

STOP

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

DO

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

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;

E.26.7 WHENEVERの関連項目

なし。