第3章 アプリケーションの作成
3.1 SQL 埋込み C プログラムの作成方法
3.1.2 SQL文の指定位置および指定順序
アプリケーション中に埋め込んで使用するSQL文には、実行文と非実行文があります。実行文は、データベースをアクセ スしたり、トランザクションの制御を行うために使用します。非実行文は、実行文で利用するカーソルの宣言やホスト変数 の宣言、例外条件発生時の動作を定義します。非実行文は、アプリケーションの実行対象にはなりません。したがって、
アプリケーション中のGOTO文などによる制御の影響を受けません。
なお、SQL文は、サーバのOS環境で使用できる範囲が異なります。SQL文の利用範囲については、“付録J SQL文の使 用範囲”を参照してください。
SQL文の一覧を以下に示します。
表3.1 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
分類 SQL文 備考
資源操作文 RELEASE TABLE文 実行文
利用者制御文 SET USER PASSWORD文 実行文
アクセス制御文 SET ROLE文 実行文
SQL埋込みCプログラムでの、SQL文の指定位置について説明します。
埋込みSQL宣言節の指定位置
埋込みSQL宣言節は、ホスト変数を定義するためのものです。埋込みSQL宣言節は、C言語仕様上で変数宣言が記述 可能な位置に記述します。なお、ホスト変数を参照するカーソル宣言や実行文の記述位置より、ソースファイル上で先行 して定義します。また、ホスト変数の変数名は、Cプログラムソース上で、一意にかつ、“SQL”以外で始まる名前にする必 要があります。
ホスト変数の宣言
ホスト変数は、アプリケーションとデータベースの間でデータの受渡しをするのに使用する変数です。すなわち、アプ リケーションで参照するデータをデータベースから取り出すため、または逆に、アプリケーションで設定したデータを データベースに格納するために、SQL文に指定する変数です。
ホスト変数の宣言は、埋込みSQL宣言節で行います。宣言の記述方法そのものは、C言語での変数の宣言と同じで す。以下に、ホスト変数の宣言の例を示します。
図3.2 ホスト変数宣言の例(SQL埋込みCプログラム)
状態変数の宣言
状態変数は、処理結果の状態をアプリケーションに伝えるための変数です。状態変数には状態コードが設定されま す。状態コードは、処理が正常に完了した、または処理中になんらかの例外条件が発生したという状態を表します。
状態変数の変数名は“SQLSTATE”です。
SQLSTATEは長さ5桁の文字列型(char SQLSTATE[6])の変数であり、埋込みSQL宣言節で宣言します。埋込みSQL を使用するアプリケーション中では、状態変数を必ず宣言します。
メッセージ変数の宣言
メッセージ変数は、処理結果をメッセージとしてアプリケーションに伝えるための変数です。メッセージ変数の変数名 は“SQLMSG”です。
SQLMSGは文字列型の変数であり、埋込みSQL宣言節で宣言します。メッセージ変数の宣言のしかたを以下に示し ます。
char SQLMSG[n]
n:メッセージ変数の長さ(バイト数)であり、2以上32001以下の値を指定します。
メッセージ変数にメッセージが設定されるときの規則を以下に示します。
-
設定されるメッセージは1つだけです。-
メッセージの長さがメッセージ変数の長さ(n)を超える場合、メッセージの先頭からn文字分設定されます。カーソル宣言の指定位置
カーソル宣言は、Cプログラムソース上のどの位置にも記述できます。ただし、宣言したカーソル名を参照するカーソル系の SQL文より、ソースファイル上で先行して記述します。なお、カーソル名は、Cプログラムソース上で一意にすることが必要 です。
埋込み例外宣言の指定位置
埋込み例外宣言は、Cプログラムの関数内であればどの位置にも記述できます。埋込み例外宣言の意味と有効範囲に ついては、“3.1.4 SQL文の処理結果の確認”で説明します。
実行文の指定位置
データ操作文やトランザクション制御文などの実行文は、C言語の実行文が記述可能な位置ならどの位置にも記述でき ます。
INCLUDE文の指定位置
アプリケーション中に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);
}