ここでは、SQL埋込みCプログラムに記述するSQL文中の名前の一意性と有効範囲について説明します。
以下の埋込みSQL文をSQL埋込みCプログラムに記述する場合は、注意が必要です。
埋込み例外宣言
ホスト変数
カーソル宣言とホスト変数の関係
埋込み例外宣言で指定したGOTOのホストラベル識別子は、次の同一エラー条件が出現するまで有効となります。
埋込み例外宣言の有効範囲が、複数の関数にまたがる場合は、有効となるすべての関数に、GOTOのホストラベル識別子を記述する必要があります。ホストラベル識別子を関数内に記述していない場合は、コンパイル時にエラーとなります。
埋込み例外宣言のGOTOのホストラベル識別子が、main関数、sub1関数およびsub2関数で有効となる場合には、それぞれの関数内にGOTOのホストラベル識別子を記述します。

ホスト変数の名前は、SQL埋込みCプログラムで一意である必要があります。名前が一意でない場合は、コンパイル時にエラーとなります。
このため、複数の関数で共通に使うホスト変数、SQLSTATEおよびSQLMSGは、グローバル域に記述する必要があります。
ただし、マルチスレッド環境の場合は、コンパイル時にオプションを指定することにより、以下の変数については、関数単位に変数の名前を重複して記述できます。
SQLSTATE
SQLMSG
それぞれの例を以下に示します。
複数の関数で共通に使うホスト変数をグローバル域に記述する例
EXEC SQL BEGIN DECLARE SECTION ;
char SQLSTATE[6] ; …… (1)
char SQLMSG[256] ; …… (2)
long common1 ; …… (3)
long common2 ; …… (4)
EXEC SQL END DECLARE SECTION ;
main() {
EXEC SQL BEGIN DECLARE SECTION ;
long private1 ; …… (5)
long private2 ; …… (6)
EXEC SQL END DECLARE SECTION ;
}
long sub1(){
EXEC SQL BEGIN DECLARE SECTION ;
long private3 ; …… (7)
long private4 ; …… (8)
EXEC SQL END DECLARE SECTION ;
} (1)~(4) 複数関数で共通なホスト変数の記述
(5)~(6) main関数でだけ使用するホスト変数の記述
(7)~(8) sub1関数でだけ使用するホスト変数の記述
マルチスレッド環境において、複数の関数で共通に使うホスト変数を関数単位に重複して記述する例
SQLHDBS ses_id;
:
int main( void )
{
EXEC SQL BEGIN DECLARE SECTION;
auto char SQLSTATE[6]; …… (1)
auto char SQLMSG[256]; …… (2)
EXEC SQL END DECLARE SECTION;
SQLThrAllocID( &ses_id );
SQLThrStartID( ses_id );
EXEC SQL CONNECT TO 'SV1';
:
sub01();
:
EXEC SQL DISCONNECT ALL;
SQLThrEndID ( ses_id );
SQLThrFreeID ( ses_id );
return 0;
}
void sub01( void )
{
EXEC SQL BEGIN DECLARE SECTION;
auto char SQLSTATE[6]; …… (3)
auto char SQLMSG[256]; …… (4)
auto short len1; …… (5)
EXEC SQL END DECLARE SECTION;
:
EXEC SQL CONNECT TO 'SV2';
:
return 0;
} (1)~(2) 複数関数で共通なホスト変数のmain関数における記述
(3)~(4) 複数関数で共通なホスト変数のsub01関数における記述
(5) sub01関数でだけ使用するホスト変数の記述
カーソル宣言で使用したホスト変数が評価されるのは、OPEN文の実行時です。このため、複数の関数でホスト変数が指定された同一のカーソルをオープンする場合は、カーソル宣言に指定したホスト変数は、グローバル域に記述する必要があります。マルチスレッド環境で動作させる場合は、グローバル域に記述した変数に対して排他を考慮する必要があります。
カーソル宣言文をグローバル域に記述する例を以下に示します。
EXEC SQL BEGIN DECLARE SECTION ; char SQLSTATE[6] ; …… (1) char SQLMSG[256] ; …… (2) long common1 ; …… (3) (5) EXEC SQL END DECLARE SECTION ; EXEC SQL DECLARE CUR1 CURSOR FOR SELECT … WHERE NUMBER = :common1; … (4) (6) (5) main() { EXEC SQL OPEN CUR1 ; : (6) } long sub1(){ EXEC SQL OPEN CUR1 ; : (6) }
(1)~(3) 複数関数で共通なホスト変数の記述
(4) 複数関数で共通なカーソル宣言の記述
(5) main関数とsub1関数で共通に使うホスト変数名
(6) main関数とsub1関数で共通に使うカーソル名