Symfoware(R) Server RDBユーザーズガイド 応用プログラム開発編 - FUJITSU -
目次 索引 前ページ次ページ

上へ第2章 データベースを処理する応用プログラムの開発の概要
上へ2.1 SQL埋込みCプログラムの作成方法

2.1.3 ホスト変数および標識変数の指定方法

ホスト変は、応用プログラムとデータベースの間でデータの受渡しをするのに使用する変数です。SQL文中でホスト変数と対にして指定し、データの内容がナル値かどうかを表すために使用する変数を、標識変と呼びます。応用プログラムで参照するデータをデータベースから取り出す場合、標識変数には、取り出したデータがナル値かどうかを表す情報が設定されます。逆に、応用プログラムで設定したデータをデータベースに格納する場合には、標識変数には、格納するデータがナル値かどうかを表す情報を設定しておきます。標識変数は、埋込みSQL宣言節で宣言します。宣言の記述方法はホスト変数と同じです。なお、標識変数のデータ型はSQLのSMALLINTに対応するデータ型であることが必要です。各ホスト言語でのデータ型と、SQLのデータ型との対応については、“SQLリファレンスガイド”を参照してください。

ホスト変数および標識変数をSQL文中に指定する場合には、変数の前にコロン“:”を付けて指定します。以下にその指定例を示します(ゴシック部がホスト変数または標識変数です)。ただし、SQL文以外の、C言語のステートメント中では、一般のC言語の変数と同じで、コロン“:”は付けません。

標識変数には、SQL文の処理結果が以下のように格納されます。

なお、標識変数を指定していない場合、取り出すデータがナル値になると、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ビット環境でのホスト変数の扱

64ビットマシンで実行する応用プログラムでは、ホスト変数にlong型を指定した場合、-2147483648〜2147483647以外の値は入力できません。-2147483648〜2147483647以外の値を入力した場合は、実行時にエラーになります。

64ビットマシンで実行するSQL埋込みCプログラムは、Symfoware Server Enterprise Extended Editionでのみ作成できます。

■マルチスレッド環境でのホスト変数の宣

マルチスレッド環境で実行する応用プログラムでは、ホスト変数にはauto変数を使用することを推奨します。extern変数およびstatic変数などを使用した場合は、スレッド間でホスト変数が共有されるため、複数のスレッドから同時にデータベースをアクセスすると、参照および更新が正しくできない場合があります。extern変数およびstatic変数などを使用する場合は、セマフォを利用するなどして、並列に動作するスレッド間の排他制御を考慮した応用プログラムを作成してください。

セマフォの詳細については、OSのシステム関数について説明されているマニュアルを参照してください。


目次 索引 前ページ次ページ

All Rights Reserved, Copyright (C) 富士通株式会社 2003-2004