4.2 SQLプリコンパイラの構文
SQLプリコンパイラでは、単一文と複合文をホスト言語プログラムに直接組み込む(埋め込む)ことができる特別なキーワードおよび構文が提供されています。これにより、SQLプリコンパイラを使用して埋込み文とホスト言語コードの組合せを処理し、リンクと実行に使用するオブジェクト・ファイルを生成できます。
SQLプリコンパイラの構文は、Ada、C、COBOL、FORTRAN、PascalおよびPL/Iのホスト言語ソース・ファイルでのみ使用できます。SQLプリコンパイラは、他のホスト言語はサポートしていません。サポート対象に含まれていないホスト言語を埋込みSQLに対して使用して、そのホスト言語でSQLインタフェースを使用する場合は、SQLモジュール・プロセッサを使用する必要があります。
compound-statement
複数のSQL文を、1つのSQLモジュール・プロシージャまたは埋込みSQLプロシージャに組み込むことができる文です。複合文を含む埋込みプロシージャは、埋込み複数文プロシージャと呼ばれます。SQLでは、ホスト言語プログラムに埋め込まれた複合文でSQL文の制限されたサブセットがサポートされています。複合文で使用できる有効なSQL文のリストは、表1-1を参照してください。
複合文には、プログラムのような制御フロー文(IF、LOOP、CASE、LEAVE)、トランザクション管理文(COMMITおよびROLLBACK)、変数宣言文(SET代入)、カーソル処理文(FOR)、およびプロシージャ・デバッグ文(TRACE)を組み込むこともできます。
複合文の詳細は、「複合文」を参照してください。
ending-symbol
埋込みの単一文または複合文を終了します。埋込み文の終了では、表4-1にリストされているホスト言語の要件に従います。
表4-1 埋込みSQL文の終了 言語 EXEC SQL文の終了記号 Ada セミコロン(;) C セミコロン(;) COBOL END-EXEC FORTRAN 終了記号は不要 Pascal セミコロン(;) PL/I セミコロン(;)
EXEC SQL
それぞれの単一文または複合文に接頭辞として付与されます。対話型文をプリコンパイルされた文に変換するには、それぞれの単一文または複合文をキーワードEXEC SQLで開始する追加手順が必要です。SQLでは、他の方法でこれらの文を処理できません。さらに、キーワードEXECとSQLの両方を同じ行に配置する必要があります。キーワードEXECとSQLの間にコメントを挿入することはできません。simple-statement
単一SQL文のみを組み込むことができる文です。単一文で有効なSQL文のリストは、表1-1を参照してください。単一文の詳細は、「単一文」を参照してください。
- 埋込み複合文に開始ラベルまたは終了ラベルを組み込むことはできません。
- キーワードPROCEDUREは、埋込みSQLプロシージャでは使用できません。
- 埋込み文が複合文の場合は、BEGIN ... ENDブロックの実行中にローカル変数によって同名のホスト変数を隠蔽できます。
- DECLARE TABLE文がCREATE DATABASE文の前に出現する場合は、SQL$DATABASEまたはSQL_DATABASEをオープンできないまたは特定のデータベース・オブジェクトがデータベース内に存在しないことを示すエラー・メッセージが表示され、コンパイルが失敗する可能性があります。
SQLプリコンパイラでは、他の文の前にメタデータ文が処理されます。DECLARE TABLE文がそれを定義するCREATE DATABASE文の前に出現する場合、メタデータ検索用にSQL$DATABASEまたはSQL_DATABASEへのアタッチが試行されます。
CREATE DATABASE文は、DECLARE TABLE文の前に配置してください。- SQLプリコンパイラは、構文BEGIN DECLARE SECTIONもサポートしています。複合文のBEGIN DECLAREのため、この句はあいまいです。したがって、EXEC-SQL複合文では1つのプラグマ句のみが選択可能です。PRAGMAリストを使用すると、すべてのオプションを指定できます。
- ON ALIAS句、OPTIMIZE句およびWITH HOLD句は、複合文の最も外側のBEGINにのみ配置してください。
例1: ホスト言語プログラムへの複合文の埋込み次の例は、複数文プロシージャをプログラムに埋め込む方法を示しています。キーワードPROCEDUREは、埋込みSQLアプリケーションでは使用されません。
EXEC SQL BEGIN DECLARE SECTION ; int x ; EXEC SQL END DECLARE SECTION ; EXEC SQL BEGIN DECLARE :y INTEGER ; SET :y = 2 * :x ; -- :x is a host variable UPDATE employees SET salary = :y ; WHERE . . . BEGIN DECLARE :x INTEGER ; SET :x = 100 ; -- :x is a local variable UPDATE employees SET salary = :x ; WHERE . . . END ; END ;