Symfoware(R) Server RDBユーザーズガイド 応用プログラム開発編 - FUJITSU - |
目次 索引 |
ホスト変数は、応用プログラムとデータベースの間でデータの受渡しをするのに使用する変数です。SQL文中でホスト変数と対にして指定し、データの内容がナル値かどうかを表すために使用する変数を、標識変数と呼びます。応用プログラムで参照するデータをデータベースから取り出す場合、標識変数には、取り出したデータがナル値かどうかを表す情報が設定されます。逆に、応用プログラムで設定したデータをデータベースに格納する場合には、標識変数には、格納するデータがナル値かどうかを表す情報を設定しておきます。標識変数は、埋込みSQL宣言節で宣言します。宣言の記述方法はホスト変数と同じです。なお、標識変数のデータ型はSQLのSMALLINTに対応するデータ型であることが必要です。各ホスト言語でのデータ型と、SQLのデータ型との対応については、“SQLリファレンスガイド”を参照してください。
ホスト変数および標識変数をSQL文中に指定する場合には、変数の前にコロン“:”を付けて指定します。以下にその指定例を示します(ゴシック部がホスト変数または標識変数です)。ただし、SQL文以外の、C言語のステートメント中では、一般のC言語の変数と同じで、コロン“:”は付けません。
標識変数には、SQL文の処理結果が以下のように格納されます。
取り出すデータがナル値の場合、標識変数には、-1が格納されます。
取り出すデータのデータ型が文字列または各国語文字列で、かつナル値ではなく、取り出すデータの長さが相手指定の文字列または各国語文字列の長さよりも長い場合は、取り出すデータの有効な長さが標識変数に格納されます。
上記以外の場合は、標識変数に0が格納されます。
なお、標識変数を指定していない場合、取り出すデータがナル値になると、SQL文の処理はエラーになります。
例1
ホスト変数の指定例
STOCKおよびHOUSEをホスト変数、QFLAGをSTOCKの標識変数、そして、WFLAGをHOUSEの標識変数として指定します。SQL文中にホスト変数および標識変数を指定する場合は、コロン“:”を付けます。
EXEC SQL SELECT 在庫数量,倉庫番号 INTO :STOCK INDICATOR :QFLAG, :HOUSE INDICATOR :WFLAG FROM 在庫表 WHERE 製品番号 = 110; |
例2
SQL文以外のC言語のステートメント上のホスト変数の指定例
STOCKをホスト変数、QFLAGをSTOCKの標識変数として使用しています。C言語のステートメントでは、これらの変数にコロン“:”は付けません。
EXEC SQL FETCH CU1 INTO :STOCK INDICATOR :QFLAG; if( QFLAG == -1) goto p_null ; if( STOCK == 0) goto p_loop ; |
文字列型または各国語文字列型の場合、ナル文字(\0)はデータ受渡しの対象にはなりません。そのため、応用プログラムで文字列の終わりを認識するような処理を行う場合、ナル文字を設定しなければなりません。以下に例を示します。
SQLSTATE[5]='\0'; printf( "SQLSTATE:%s\n" , SQLSTATE ); |
ホスト変数へ入出力するデータの文字コード系がシステムのコード系と異なる場合は、そのホスト変数に格納するデータの文字コードを、クライアント用の動作環境ファイルまたは環境変数に設定します。
コード系のうち、UNICODEは、Symfoware Server Enterprise Extended Edition、Symfoware Server Enterprise EditionおよびSymfoware Server Standard Editionで使用できます。
以下に、ホスト変数へ入出力するデータの文字コード系がシステムのコード系と異なる場合の例、および、ホスト変数へ入出力するデータの文字コード系とシステムのコード系が同じ場合の例を示します。
例1
ホスト変数へ入出力するデータの文字コードとシステムのコード系が異なる場合
以下の例では、クライアントシステムのコード系がシフトJIS、また、SELECT文(1)でホスト変数に格納されたデータの文字コードがUNICODEであるとします。そして、このデータを格納するデータベースのコード系はUNICODEであるとします。
この場合、クライアント用の動作環境ファイルまたは環境変数には、ホスト変数に格納されているデータがUNICODEであることを示すパラメタを設定します。設定するパラメタについての詳細は、“クライアント用の動作環境ファイルの作成”を参照してください。
こうすることによって、サーバでのコード変換の必要がなくなります。
EXEC SQL BEGIN DECLARE SECTION; char SQLSTATE[6]; char SQLMSG[256]; : char CHARACTER SET NCHAR H1[10]; EXEC SQL END DECLARE SECTION; : memset(H1,'',sizeof(H1)); SELECT COL1 INTO :H1 FROM S1.TO WHERE COL0=3; …… (1) EXEC SQL INSERT INTO S1.T1 VALUES(3,:H1); …… (2) |
(1) データベースよりUNICODEなどのシステムのコード系と異なるコードのデータが取得できます。
(2) 上記のSELECT文で取得したデータのコードのまま、INSERT文が実行できます。このように、応用プログラムにおいて、システムのコード系と異なるコードのデータが操作可能です。
例2
ホスト変数へ入出力するデータの文字コードがシステムのコード系と同じ場合
以下の例では、クライアントシステムのコード系がシフトJISであるとします。この場合、ホスト変数に入出力するデータの文字コード系はシフトJISになります。
EXEC SQL BEGIN DECLARE SECTION; char SQLSTATE[6]; char SQLMSG[256]; : char CHARACTER SET NCHAR H1[10]; EXEC SQL END DECLARE SECTION; : memset(H1,'\0',sizeof(H1)); memcpy(H1,"日本語",6); …… (1) EXEC SQL INSERT INTO S1.T1 VALUES(:H1); …… (2) |
(1) システムのコードの“日本語”がホスト変数H1に格納されます。
(2) システムのコードの“日本語”でINSERT文を実行します。このように、システムのコードを使用してデータ操作を行う場合に適しています。
64ビットマシンで実行する応用プログラムでは、ホスト変数にlong型を指定した場合、-2147483648〜2147483647以外の値は入力できません。-2147483648〜2147483647以外の値を入力した場合は、実行時にエラーになります。
64ビットマシンで実行するSQL埋込みCプログラムは、Symfoware Server Enterprise Extended Editionでのみ作成できます。
マルチスレッド環境で実行する応用プログラムでは、ホスト変数にはauto変数を使用することを推奨します。extern変数およびstatic変数などを使用した場合は、スレッド間でホスト変数が共有されるため、複数のスレッドから同時にデータベースをアクセスすると、参照および更新が正しくできない場合があります。extern変数およびstatic変数などを使用する場合は、セマフォを利用するなどして、並列に動作するスレッド間の排他制御を考慮した応用プログラムを作成してください。
セマフォの詳細については、OSのシステム関数について説明されているマニュアルを参照してください。
目次 索引 |