アプリケーション中に埋め込んで使用するSQL文には、実行文と非実行文があります。実行文は、データベースをアクセスしたり、トランザクションの制御を行うために使用します。非実行文は、実行文で利用するカーソルの宣言やホスト変数の宣言、例外条件発生時の動作を定義します。非実行文は、アプリケーションの実行対象にはなりません。したがって、アプリケーション中のGOTO文などによる制御の影響を受けません。
なお、SQL文は、サーバのOS環境で使用できる範囲が異なります。SQL文の利用範囲については、“付録J SQL文の使用範囲”を参照してください。
分類 | SQL文 | 備考 |
---|---|---|
非カーソル系データ操作 | 単一行SELECT文 | 実行文 |
UPDATE文:探索 | ||
INSERT文 | ||
DELETE文:探索 | ||
カーソル系データ操作 | カーソル宣言(DECLARE CURSOR) | 非実行文 |
OPEN文 | 実行文 | |
CLOSE文 | ||
FETCH文 | ||
UPDATE文:位置づけ | ||
DELETE文:位置づけ | ||
動的SQL文 | ALLOCATE DESCRIPTOR文 | 実行文 |
DEALLOCATE DESCRIPTOR文 | ||
DESCRIPTOR取得文 | ||
DESCRIPTOR設定文 | ||
PREPARE文 | ||
DEALLOCATE PREPARE文 | ||
DESCRIBE文 | ||
EXECUTE文 | ||
EXECUTE IMMEDIATE文 | ||
動的カーソル宣言 | 非実行文 | |
動的OPEN文 | 実行文 | |
動的FETCH文 | ||
動的CLOSE文 | ||
動的DELETE文:位置づけ | ||
動的UPDATE文:位置づけ | ||
ストアドプロシジャ | CALL文 | 実行文 |
トランザクション制御文 | COMMIT文 | 実行文 |
ROLLBACK文 | ||
SET TRANSACTION文 | ||
コネクション管理文 | CONNECT文 | 実行文 |
SET CONNECTION文 | ||
DISCONNECT文 | ||
セション管理文 | SET CATALOG文 | 実行文 |
SET SCHEMA文 | ||
SET SESSION AUTHORIZATION文 | ||
表宣言 | 表宣言 | 非実行文 |
埋込み例外宣言 | WHENEVER文 | 非実行文 |
埋込みSQL宣言節 | BEGIN DECLARE SECTION | 非実行文 |
END DECLARE SECTION | ||
資源操作文 | RELEASE TABLE文 | 実行文 |
利用者制御文 | SET USER PASSWORD文 | 実行文 |
アクセス制御文 | SET ROLE文 | 実行文 |
SQL埋込みCプログラムでの、SQL文の指定位置について説明します。
埋込みSQL宣言節は、ホスト変数を定義するためのものです。埋込みSQL宣言節は、C言語仕様上で変数宣言が記述可能な位置に記述します。なお、ホスト変数を参照するカーソル宣言や実行文の記述位置より、ソースファイル上で先行して定義します。また、ホスト変数の変数名は、Cプログラムソース上で、一意にかつ、“SQL”以外で始まる名前にする必要があります。
ホスト変数は、アプリケーションとデータベースの間でデータの受渡しをするのに使用する変数です。すなわち、アプリケーションで参照するデータをデータベースから取り出すため、または逆に、アプリケーションで設定したデータをデータベースに格納するために、SQL文に指定する変数です。
ホスト変数の宣言は、埋込みSQL宣言節で行います。宣言の記述方法そのものは、C言語での変数の宣言と同じです。以下に、ホスト変数の宣言の例を示します。
図3.2 ホスト変数宣言の例(SQL埋込みCプログラム)
カーソル宣言は、Cプログラムソース上のどの位置にも記述できます。ただし、宣言したカーソル名を参照するカーソル系のSQL文より、ソースファイル上で先行して記述します。なお、カーソル名は、Cプログラムソース上で一意にすることが必要です。
埋込み例外宣言は、Cプログラムの関数内であればどの位置にも記述できます。埋込み例外宣言の意味と有効範囲については、“3.1.4 SQL文の処理結果の確認”で説明します。
データ操作文やトランザクション制御文などの実行文は、C言語の実行文が記述可能な位置ならどの位置にも記述できます。
アプリケーション中にINCLUDE文を指定することができます。インクルードファイルには、SQL文およびC言語の言語テキストを記述できます。インクルードファイルに、ホスト変数および状態変数の宣言を格納しておくことにより、複数のアプリケーションで共通に使用する変数をまとめて宣言することができます。
表宣言は、スキーマ名の修飾をしない表名を定義する宣言文です。表宣言で定義した表名を、それ以降のSQL文で記述する場合、スキーマ名を省略することができます。INCLUDE文と表宣言の例を以下に示します。
[インクルードファイル“HOSTVAR”]
char SQLSTATE[6]; long STOCK;
[SQL埋込みCプログラム]
EXEC SQL BEGIN DECLARE SECTION; EXEC SQL INCLUDE HOSTVAR; EXEC SQL END DECLARE SECTION; main(){ EXEC SQL DECLARE 在庫表 TABLE ON SCH1; EXEC SQL SELECT 在庫数量 INTO :STOCK FROM 在庫表 WHERE 製品番号 = 240; ↑ スキーマ名修飾省略 printf("%d\n",STOCK); }