アプリケーション開発の手引き


C および C++ でのホスト変数

ホスト変数は、SQL ステートメント内で参照される C または C++ の言語変数です。これにより、アプリケーションは入力データをデータベース・マネージャーに渡し、またデータベース・マネージャーから出力データを受け取ることができます。アプリケーションのプリコンパイルが行われると、コンパイラーはホスト変数をその他の C/C++ 変数と同様に使用します。ホスト変数の命名、宣言、および使用は、以下の節で述べる規則に従って行ってください。

C および C++ でのホスト変数の命名

SQL プリコンパイラーは、宣言された名前によってホスト変数を識別します。以下の規則が適用されます。

C および C++ でのホスト変数の宣言

ホスト変数宣言の識別には、SQL の宣言セクションを使用しなければなりません。これは、それ以降の SQL ステートメントで参照が可能なホスト変数をプリコンパイラーに知らせます。

C/C++ プリコンパイラーは、有効な C または C++ 宣言のサブセットのみを有効なホスト変数宣言として認識します。これらの宣言は、数値変数または文字変数のいずれかを宣言します。ホスト変数のタイプとして typedef は使用できません。ホスト変数は、グループ化して単一のホスト構造にすることができます。ホスト構造についての詳細は、 C および C++ でのホスト構造サポートを参照してください。 C++ クラスのデータ・メンバーは、ホスト変数として宣言できます。クラスの詳細については、C および C++ でのクラス・データ・メンバーのホスト変数としての使用を参照してください。

数値ホスト変数は、数値の SQL 入出力値に対する入出力値として使用することができます。文字ホスト変数は任意の文字、日付、時間またはタイム・スタンプの SQL 入出力値に対する入出力値として使用できます。アプリケーションでは、出力変数が受け取る値を含めることのできる長さを持つようにしなければなりません。

構造型のホスト変数の宣言方法についての詳細は、 構造型ホスト変数の宣言を参照してください。

C または C++ における数値ホスト変数の構文は、C または C++ における数値ホスト変数の宣言構文を示します。

C または C++ における数値ホスト変数の構文
 
                                           (1)
>>-+------------+---+----------+---+-float-------------------+-->
   +-auto-------+   +-const----+   |        (2)              |
   +-extern-----+   '-volatile-'   +-double------------------+
   +-    static-+                  |       (3)               |
   '-register---'                  +-short-------+-----+-----+
                                   |             '-int-'     |
                                   +-+---------------------+-+
                                   | +-sqlint32------------+ |
                                   | |      (4)            | |
                                   | '-long-------+-----+--' |
                                   |              '-int-'    |
                                   '-+---------------------+-'
                                     +-sqlint64------------+
                                     +-__int64-------------+
                                     +-long long--+-----+--+
                                     |            '-int-'  |
                                     |      (5)            |
                                     '-long-------+-----+--'
                                                  '-int-'
 
      .-,-----------------------------------------------------------.
      V                                                             |
>--------+------------------------------+---varname--+-----------+--+>
         |  .------------------------.  |            '-=--value--'
         |  V                        |  |
         '-----+-*-+---+----------+--+--'
               '-&-'   +-const----+
                       '-volatile-'
 
>----;---------------------------------------------------------><
 

注:

  1. REAL (SQLTYPE 480)、長さ 4

  2. DOUBLE (SQLTYPE 480)、長さ 8

  3. SMALLINT (SQLTYPE 500)

  4. アプリケーションの移行性を最大限にするには、 INTEGER および BIGINT ホスト変数でそれぞれ sqlint32 および sqlint64 を使用してください。デフォルトでは、 long のホスト変数を使用すると、 long が 64 ビットである 64 BIT UNIX などでプリコンパイル・エラー SQL0402 が起きます。 PREP オプション LONGERROR NO を使用して、 DB2 が long 変数を受け入れ可能なホスト変数型として認めるようにしてください。そして、それらを BIGINT 変数として扱ってください。

  5. アプリケーションの移行性を最大限にするには、 INTEGER および BIGINT ホスト変数でそれぞれ sqlint32 および sqlint64 を使用してください。 BIGINT データ・タイプを使用するには、プラットフォームで 64 ビットの整数値がサポートされていなければなりません。デフォルトでは、 long のホスト変数を使用すると、 long が 64 ビットである 64 BIT UNIX などでプリコンパイル・エラー SQL0402 が起きます。 PREP オプション LONGERROR NO を使用して、 DB2 が long 変数を受け入れ可能なホスト変数型として認めるようにしてください。そして、それらを BIGINT 変数として扱ってください。

書式 1: C/C++ における固定および NULL 終了文字ホスト変数の構文は、C または C++ における固定および NULL 終了文字ホスト変数の宣言構文を示します。

書式 1: C/C++ における固定および NULL 終了文字ホスト変数の構文
 
>>-+------------+---+----------+--+----------+--char------------>
   +-auto-------+   +-const----+  '-unsigned-'
   +-extern-----+   '-volatile-'
   +-    static-+
   '-register---'
 
      .-,-----------------------------------.
      V                                     |
>---------+-| CHAR |-----+---+-----------+--+--;---------------><
          '-| C String |-'   '-=--value--'
 
 
CHAR
 
                                              (1)
|--+------------------------------+---varname-------------------|
   |  .------------------------.  |
   |  V                        |  |
   '-----+-*-+---+----------+--+--'
         '-&-'   +-const----+
                 '-volatile-'
 
 
C String
 
                                                                     (2)
|---+-varname-------------------------------------------+---[length]------|
    '-(--+------------------------------+---varname--)--'
         |  .------------------------.  |
         |  V                        |  |
         '-----+-*-+---+----------+--+--'
               '-&-'   +-const----+
                       '-volatile-'
 

注:

  1. CHAR (SQLTYPE 452)、長さ 1

  2. NULL 終了 C ストリング (SQLTYPE 460); 長さは任意の有効な定数式

書式 2: C/C++ における可変長文字ホスト変数の構文は、C または C++ における可変長文字ホスト変数の宣言構文を示します。

書式 2: C/C++ における可変長文字ホスト変数の構文
 
>>-+----------+---+----------+--struct--+-----+----------------->
   +-auto-----+   +-const----+          '-tag-'
   +-extern---+   '-volatile-'
   +-static---+
   '-register-'
 
                                                                    (1)
>----{--short--+-----+--var1--;--+----------+--char--var2--[length]--------;--}->
               '-int-'           '-unsigned-'
 
      .-,-------------------------------------------------------------------------------.
      V                                                                                 |
>--------+------------------------------+---varname--+-------------------------------+--+>
         |  .------------------------.  |            '-=--{--value-1--,--value-2--}--'
         |  V                        |  |
         '-----+-*-+---+----------+--+--'
               '-&-'   +-const----+
                       '-volatile-'
 
>----;---------------------------------------------------------><
 

注:

  1. 書式 2 では、length は任意の有効な定数式。評価後の値で、ホスト変数が VARCHAR (SQLTYPE 448) または LONG VARCHAR (SQLTYPE 456) のどちらであるかが判別されます。

可変長文字ホスト変数に関する考慮事項:

  1. データベース・マネージャーは、可能な場合には必ず文字データを 書式 1 または書式 2 に変換するが、 書式 1 が列タイプ CHAR または VARCHAR に対応するのに対し、 書式 2 は列タイプ VARCHAR および LONG VARCHAR に対応する。

  2. 書式 1 を長さ指定子の [n] と共に使用した場合、評価後の長さ指定子の値は 32672 より大きくてはならず、変数に含めるストリングは NULL で終わらなければならない。

  3. 書式 2 を使用する場合は、評価後の長さ指定子の値は 32 700 より小さくなくてはならない。

  4. 書式 2 では、 var1 および var2 は単純変数参照 (演算子ではない) でなければならず、ホスト変数として使用することはできない (varname がホスト変数)。

  5. varname を単純変数とすることができるか、または *varname などの演算子を含むことができる。詳細については、C および C++ でのポインター・データ・タイプを参照してください。

  6. プリコンパイラーはすべてのホスト変数の SQLTYPE および SQLLEN を判別する。ホスト変数が SQL ステートメント内に標識変数とともにある場合、そのステートメントの持続期間中は、 SQLTYPE は基本の SQLTYPE プラス 1 となるように割り当てられます。

  7. プリコンパイラーは、C または C++ において構文的に無効であるものも宣言できる場合がある。特定の宣言構文に疑問がある場合には、ご使用のコンパイラーに関する資料をご覧ください。

C および C++ での標識変数

標識変数のデータ・タイプは short と宣言してください。

C または C++ でのグラフィック・ホスト変数宣言

図形ホスト変数の宣言書式は、以下の 3 つのうちのいずれかです。

図形ホスト変数の詳細については、C および C++ でのグラフィック・ホスト変数の処理を参照してください。

図形宣言の構文 (単純図形書式および NULL 終了図形書式) は、単純図形書式および NULL 終了図形書式を用いる図形ホスト変数の宣言構文を示します。

図形宣言の構文 (単純図形書式および NULL 終了図形書式)
 
                                    (1)
>>-+----------+---+----------+---+-----------+------------------>
   +-auto-----+   +-const----+   +-sqldbchar-+
   +-extern---+   '-volatile-'   '-wchar_t---'
   +-static---+
   '-register-'
 
      .-,-----------------------------------.
      V                                     |
>---------+-| CHAR |-----+---+-----------+--+--;---------------><
          '-| C String |-'   '-=--value--'
 
 
CHAR
 
                                              (2)
|--+------------------------------+---varname-------------------|
   |  .------------------------.  |
   |  V                        |  |
   '-----+-*-+---+----------+--+--'
         '-&-'   +-const----+
                 '-volatile-'
 
 
C String
 
                                                                     (3)
|---+-varname-------------------------------------------+---[length]------|
    '-(--+------------------------------+---varname--)--'
         |  .------------------------.  |
         |  V                        |  |
         '-----+-*-+---+----------+--+--'
               '-&-'   +-const----+
                       '-volatile-'
 

注:

  1. 2 つの図形タイプのどちらを使用するかを判別するための基準については、 C および C++ での wchar_t または sqldbchar データ・タイプの選択を参照してください。

  2. GRAPHIC (SQLTYPE 468)、長さ 1

  3. NULL 終了図形ストリング (SQLTYPE 400)

グラフィック・ホスト変数に関する考慮事項:

  1. 単純図形書式では、SQLTYPE が 468 または 469 で長さ 1 の固定長の図形ストリング・ホスト変数が宣言される。

  2. value は初期化指定子である。 WCHARTYPE CONVERT プリコンパイラー・オプションを使用している場合は、ワイド・キャラクターのストリング・リテラル (L-リテラル) を使用してください。

  3. length は任意の有効な定数式にすることができる。評価後の値は、1 〜 16 336 (VARGRAPHIC の最大長) の範囲でなければなりません。

  4. NULL 終了図形ストリングは、標準レベルのプリコンパイラー・オプションの値に基づいてさまざまに処理されます。詳細については、C および C++ での Null 終了ストリングを参照してください。

図形宣言の構文 (VARGRAPHIC 構造書式) は、VARGRAPHIC 構造書式を用いる図形ホスト変数の宣言構文を示します。

図形宣言の構文 (VARGRAPHIC 構造書式)
 
>>-+----------+---+----------+--struct--+-----+----------------->
   +-auto-----+   +-const----+          '-tag-'
   +-extern---+   '-volatile-'
   +-static---+
   '-register-'
 
                                     (1)                         (2)
>----{--short--+-----+--var-1--;--+-----------+---var-2--[length-----]---;--}->
               '-int-'            +-sqldbchar-+
                                  '-wchar_t---'
 
      .-,-----------------------------------------------------.
      V                                                       |
>--------+------------------------------+---| Variable |--;---+-><
         |  .------------------------.  |
         |  V                        |  |
         '-----+-*-+---+----------+--+--'
               '-&-'   +-const----+
                       '-volatile-'
 
Variable
 
|---variable-name----+-------------------------------+----------|
                     '-=--{--value-1--,--value-2--}--'
 

注:

  1. 2 つの図形タイプのどちらを使用するかを判別するための基準については、 C および C++ での wchar_t または sqldbchar データ・タイプの選択を参照してください。

  2. length は、任意の有効な定数式。評価後の値で、ホスト変数が VARGRAPHIC (SQLTYPE 464) または LONG VARGRAPHIC (SQLTYPE 472) のどちらであるかが判別されます。 length の値は、1 〜 16350 (LONG VARGRAPHIC の最大長) の範囲でなければなりません。

図形宣言 (VARGRAPHIC 構造書式) に関する考慮事項:

  1. var-1 および var-2 は単純変数参照 (演算子ではない) でなければならず、ホスト変数として使用することはできない。

  2. value-1 および value-2 は、 var-1var-2 に対する初期化指定子である。 WCHARTYPE CONVERT プリコンパイラー・オプションを使用している場合、 value-1 は整数でなければならず、 value-2 はワイド・キャラクター・ストリング・リテラル (L-リテラル) を使用してください。

  3. struct tag は他のデータ域を定義するために使用できるが、それ自体はホスト変数としては使用できない。

C または C++ での LOB データ宣言

C/C++ におけるラージ・オブジェクト (LOB) ホスト変数の構文は、C または C++ におけるラージ・オブジェクト (LOB) ホスト変数の宣言構文を示します。

C/C++ におけるラージ・オブジェクト (LOB) ホスト変数の構文
 
>>-+----------+---+----------+--SQL TYPE IS----+-BLOB---+------->
   +-auto-----+   +-const----+                 +-CLOB---+
   +-extern---+   '-volatile-'                 '-DBCLOB-'
   +-static---+
   '-register-'
 
              (1)
>-----(length-----)--------------------------------------------->
 
      .-,-------------------------------------------------------------------------------------.
      V                                                                                       |
>--------+------------------------------+---variable-name--| LOB データ |---------------------+>
         |  .------------------------.  |
         |  V                        |  |
         '-----+-*-+---+----------+--+--'
               '-&-'   +-const----+
                       '-volatile-'
 
>----;---------------------------------------------------------><
 
 
LOB データ
 
|--+-------------------------------+----------------------------|
   +-={init-len,"init-data"}-------+
   +-=SQL_BLOB_INIT("init-data")---+
   +-=SQL_CLOB_INIT("init-data")---+
   '-=SQL_DBCLOB_INIT("init-data")-'
 

注:

  1. length は、任意の有効な定数式。これには定数 K、M、または G を使用できる。 BLOB および CLOB の評価後の length 値は、 1 <= length <= 2 147 483 647 でなければなりません。 DBCLOB の評価後の length 値は 1 <= length <= 1 073 741 823 でなければなりません。

LOB ホスト変数に関する考慮事項:

  1. 関数に渡される LOB タイプのホスト変数に対してタイプ検査と関数分解を実行できるように、 3 タイプの LOB を区別するための SQL TYPE IS 文節が必要である。

  2. SQL TYPE IS、BLOB、CLOB、DBCLOB、K、M、G は、大文字と小文字が混在してもかまわない。

  3. 初期化ストリング "init-data" に許可される最大長は、ストリング区切り文字を含めて 32702 バイトである (プリコンパイラー内の C/C++ ストリングの限界と同じ)。

  4. 初期化長である init-len は、数値の定数でなければならない (すなわち、K、M、G は使用できない)。

  5. LOB の長さを指定しなければならない。すなわち、次の宣言は無効です。

         SQL TYPE IS BLOB my_blob;
    

  6. LOB を宣言内で初期化しないと、プリコンパイラーで生成されたコード内での初期化は行われない。

  7. DBCLOB を初期化する場合、ユーザーは、ストリングに 'L' (ワイド・キャラクター・ストリングを表す) という接頭辞を付けること。

    注:ワイド・キャラクター・リテラル、たとえば L"Hello" は、 WCHARTYPE CONVERT プリコンパイル・オプションを選択した場合に、プリコンパイル済みプログラムでのみ使用すべきである。

  8. プリコンパイラーは、ホスト変数のタイプをキャストするために使用できる構造タグを生成する。

BLOB の例:

宣言:

     static Sql Type is Blob(2M) my_blob=SQL_BLOB_INIT("mydata");

この結果、以下の構造が生成されます。

     static struct my_blob_t {
           sqluint32        length;
           char             data[2097152];
      } my_blob=SQL_BLOB_INIT("mydata");

CLOB の例:

宣言:

      volatile sql type is clob(125m) *var1, var2 = {10, "data5data5"};

この結果、以下の構造が生成されます。

      volatile struct var1_t {
           sqluint32        length;
           char             data[131072000];
      } * var1, var2 = {10, "data5data5"};

DBCLOB の例:

宣言:

      SQL TYPE IS DBCLOB(30000) my_dbclob1;

WCHARTYPE NOCONVERT オプション指定でプリコンパイルされ、その結果、以下の構造が生成されます。

     struct my_dbclob1_t {
          sqluint32        length;
          sqldbchar        data[30000];
     } my_dbclob1;

宣言:

      SQL TYPE IS DBCLOB(30000) my_dbclob2 = SQL_DBCLOB_INIT(L"mydbdata");

WCHARTYPE CONVERT オプション指定でプリコンパイルされ、その結果、以下の構造が生成されます。

     struct my_dbclob2_t {
          sqluint32        length;
          wchar_t          data[30000];
     } my_dbclob2 = SQL_DBCLOB_INIT(L"mydbdata");

C または C++ における LOB ロケーター宣言

C/C++ におけるラージ・オブジェクト (LOB) ロケーター・ホスト変数の構文 は、C または C++ におけるラージ・オブジェクト (LOB) ロケーター・ホスト変数の宣言構文を示します。

C/C++ におけるラージ・オブジェクト (LOB) ロケーター・ホスト変数の構文
 
>>-+----------+---+----------+--SQL TYPE IS--------------------->
   +-auto-----+   +-const----+
   +-extern---+   '-volatile-'
   +-static---+
   '-register-'
 
                           .-,---------------.
                           V                 |
>-----+-BLOB_LOCATOR---+-------| Variable |--+--;--------------><
      +-CLOB_LOCATOR---+
      '-DBCLOB_LOCATOR-'
 
 
Variable
 
|-+-----------------------------------------------------------------+-|
  |  .------------------------.                                     |
  |  V                        |                                     |
  '-----+-*-+---+----------+--+--variable-name----+--------------+--'
        '-&-'   +-const----+                      '-= init-value-'
                '-volatile-'
 

LOB ロケーター・ホスト変数に関する考慮事項:

  1. SQL TYPE IS、BLOB-LOCATOR、CLOB-LOCATOR、DBCLOB-LOCATOR は、大文字、小文字、またはその混合のいずれでもかまわない。

  2. init-value により、ポインターの初期化およびロケーター変数の参照ができる。他のタイプの初期化は、無意味となる。

CLOB ロケーターの例 (他のタイプの LOB ロケーターの場合も同様):

宣言:

     SQL TYPE IS CLOB_LOCATOR my_locator;

この結果、以下の宣言が生成されます。

     sqlint32 my_locator;

C または C++ におけるファイル参照宣言

C/C++ におけるファイル参照ホスト変数の構文は、C または C++ におけるファイル参照ホスト変数の宣言構文を示します。

C/C++ におけるファイル参照ホスト変数の構文
 
>>-+----------+---+----------+--SQL TYPE IS----+-BLOB_FILE---+-->
   +-auto-----+   +-const----+                 +-CLOB_FILE---+
   +-extern---+   '-volatile-'                 '-DBCLOB_FILE-'
   +-static---+
   '-register-'
 
      .-,---------------.
      V                 |
>---------| Variable |--+--;-----------------------------------><
 
 
Variable
 
|-+-----------------------------------------------------------------+-|
  |  .------------------------.                                     |
  |  V                        |                                     |
  '-----+-*-+---+----------+--+--variable-name----+--------------+--'
        '-&-'   +-const----+                      '-= init-value-'
                '-volatile-'
 

注:

CLOB ファイル参照の例 (その他の LOB ファイル参照の型宣言も同様):

宣言:

     static volatile SQL TYPE IS BLOB_FILE my_file;

この結果、以下の構造が生成されます。

     static volatile struct {
          sqluint32        name_length;
          sqluint32        data_length;
          sqluint32        file_options;
                   char    name[255];
     } my_file;

C および C++ でのホスト変数の初期化

C++ の宣言セクションでは、括弧を使用してホスト変数を初期化することはできません。次に、宣言セクション内での初期化の正しい方法と誤った方法の例を示します。

     EXEC SQL BEGIN DECLARE SECTION;
       short my_short_2 = 5;       /* correct   */
       short my_short_1(5);        /* incorrect */
     EXEC SQL END DECLARE SECTION;

C マクロ展開

C/C++ プリコンパイラーは、宣言セクション内の宣言で使用された C マクロを直接処理できません。代わりに、まず、外部 C プリプロセッサーでソース・ファイルをプリプロセスしなければなりません。これを実行するには、PREPROCESSOR オプションを使って、C プリプロセッサーを起動するためのコマンドをプリコンパイラーに指定します。

PREPROCESSOR オプションを指定すると、プリコンパイラーはまず、 SQL INCLUDE ステートメントで参照されているすべてのファイルの内容をソース・ファイルに結合させることによって、すべての SQL INCLUDE ステートメントを処理します。次にプリコンパイラーは、修正したソース・ファイルを入力として指定するコマンドを使用して、外部 C プリプロセッサーを起動します。プリプロセス済みのファイル (拡張子 ".i" によってプリコンパイラーは識別) は、プリコンパイルの残りのプロセスでの新しいソース・ファイルとして使用されます。

プリコンパイラーにより生成された任意の #line マクロは、元のソース・ファイルを参照することはありません。代わりに、プリプロセスされたファイルを参照します。コンパイラー・エラーを元のソース・ファイルに関連付けるには、プリプロセスされたファイルに注釈を保存します。これにより、ヘッダー・ファイルを含むオリジナル・ソース・ファイルのあらゆるセクションを位置指定できます。注釈を保存するオプションは、通常、C プリプロセッサーで使用でき、 PREPROCESSOR オプションを使用して、指定するコマンドにオプションを含められます。 C プリプロセッサーには、任意の #line マクロ自体を出力させてはなりません。これには、プリコンパイラーにより生成されたものが誤って混在している可能性があるためです。

マクロ展開の使用上の注意:

  1. PREPROCESSOR オプションを使用して指定するコマンドには、すべての望むオプションを含めることができますが、入力ファイルの名前を含めることはできません。たとえば、AIX 上の IBM C には、次のオプションを使用できます。

       xlC -P -DMYMACRO=1
    

  2. プリコンパイラーは、このコマンドによって、拡張子 .i の付いたプリプロセス済みのファイルの生成を予期します。ただし、プリプロセス済みのファイルを生成するためにリダイレクトを使用することはできません。たとえば、以下のオプションを使用してプリプロセス済みファイルを生成することはできません

       xlC -E > x.i
    

  3. 外部 C プリプロセッサーが検出したエラーは、元のソース・ファイルに対応する名前に拡張子 .err を付けたファイルにレポートされます。

たとえば、以下のようにソース・コード内でマクロ展開を使用することができます。

#define SIZE 3
EXEC SQL BEGIN DECLARE SECTION;
  char a[SIZE+1];
  char b[(SIZE+1)*3];
  struct
  {
    short length;
    char  data[SIZE*6];
  } m;
  SQL TYPE IS BLOB(SIZE+1) x;
  SQL TYPE IS CLOB((SIZE+2)*3) y;
  SQL TYPE IS DBCLOB(SIZE*2K) z;
EXEC SQL END DECLARE SECTION;

PREPROCESSOR オプションを使用した後は、上記の宣言は以下のように解決します。

EXEC SQL BEGIN DECLARE SECTION;
  char a[4];
  char b[12];
  struct
  {
    short length;
    char  data[18];
  } m;
  SQL TYPE IS BLOB(4) x;
  SQL TYPE IS CLOB(15) y;
  SQL TYPE IS DBCLOB(6144) z;
EXEC SQL END DECLARE SECTION;

C および C++ でのホスト構造サポート

ホスト構造サポートを使用すると、C/C++ プリコンパイラーは、ホスト変数を単一のホスト構造にグループ化することができます。これにより、SQL ステートメントで同じセットのホスト変数を参照するのが簡単になります。たとえば、以下のホスト構造は、SAMPLE データベース内の STAFF 表のいくつかの列へのアクセスに使用できます。

   struct tag
      {
        short id;
        struct
        {
          short length;
          char  data[10];
        } name;
        struct
        {
          short   years;
          double salary;
        } info;
      } staff_record;

ホスト構造のフィールドは、有効な任意のホスト変数タイプにすることができます。これらには、すべての数字、文字、およびラージ・オブジェクト・タイプが含まれます。ネストされるホスト構造は、25 レベルまでサポートされます。上の例では、フィールド info は副構造であるのに対し、フィールド name は副構造ではなく、VARCHAR フィールドを示しています。同じ原則は、LONG VARCHAR、VARGRAPHIC および LONG VARGRAPHIC にも当てはまります。ホスト構造へのポインターもサポートされます。

SQL ステートメントでホスト構造にグループ化されるホスト変数を参照するには、以下の 2 つの方法があります。

  1. SQL ステートメントでホスト構造名を参照する。
       EXEC SQL SELECT id, name, years, salary
            INTO :staff_record
            FROM staff
            WHERE id = 10;
    

    プリコンパイラーは staff_record の参照を、ホスト構造内で宣言されたすべてのフィールドをコンマで区切ったリストに変換します。他のホスト変数またはフィールドとの重複を避けるために、それぞれのフィールドは、すべてのレベルのホスト構造名で修飾されます。これは以下の使用法と同じです。

  2. SQL ステートメントで完全修飾ホスト変数名を参照する。
       EXEC SQL SELECT id, name, years, salary
            INTO :staff_record.id, :staff_record.name,
                 :staff_record.info.years, :staff_record.info.salary
            FROM staff
            WHERE id = 10;
    

    同じ名前のホスト変数がない場合でも、フィールド名を参照する際には完全修飾しなければなりません。修飾された副構造も参照できます。上の例では、:staff_record.info.years, :staff_record.info.salary を、 :staff_record.info に置換することができます。

ホスト構造への参照 (1 番目の例) は、コンマで区切ったフィールドのリストと等しいため、このタイプの参照はエラーとなる場合があります。以下はその例です。

   EXEC SQL DELETE FROM :staff_record;

ここでの DELETE ステートメントは、1 バイト文字ベースの変数を予期しています。代わりにホスト構造を指定すると、ステートメントはプリコンパイル時エラーの結果になる可能性があります。

   SQL0087N  Host variable "staff_record" is a structure used where structure
   references are not permitted.

SQL0087N エラーの原因となる可能性があるホスト構造のこの他の使用には、 PREPARE、EXECUTE IMMEDIATE、CALL、標識変数、および SQLDA 参照などがあります。このような状況では、個々のフィールドへの参照と同じように (2 番目の例)、フィールドを 1 つしか持たないホスト構造が許可されます。

C および C++ での標識表

インディケーター表は、ホスト構造で使用される標識変数の集合です。これは、短整数の配列として宣言しなければなりません。以下はその例です。

   short ind_tab[10];

上の例は、要素が 10 個のインディケーター表を宣言します。以下に、これを SQL ステートメントで使用する方法を示します。

   EXEC SQL SELECT id, name, years, salary
        INTO :staff_record INDICATOR :ind_tab
        FROM staff
        WHERE id = 10;

以下の表では、それぞれのホスト構造フィールドとそれに対応する標識変数をリストしています。

staff_record.id
ind_tab[0]

staff_record.name
ind_tab[1]

staff_record.info.years
ind_tab[2]

staff_record.info.salary
ind_tab[3]
注:インディケーター表要素、たとえば ind_tab[1] は、 SQL ステートメントで個々に参照することはできません。キーワード INDICATOR はオプションです。構造化フィールドとインディケーターの数が一致している必要はありません。余分のインディケーターが未使用だったり、インディケーターが割り当てられていない余分のフィールドがあってもかまいません。

インディケーター表の代わりにスカラー標識変数を使用して、ホスト構造の最初のフィールドにインディケーターを提供することもできます。これは、1 つの要素だけのインディケーター表を持つことと同じです。以下はその例です。

   short scalar_ind;
   EXEC SQL SELECT id, name, years, salary
             INTO :staff_record INDICATOR :scalar_ind
             FROM staff
             WHERE id = 10;

ホスト構造の代わりにホスト変数を指定してインディケーター表を指定すると、インディケーター表の最初の要素、たとえば ind_tab[0] しか使用されません。

   EXEC SQL SELECT id
             INTO :staff_record.id INDICATOR :ind_tab
             FROM staff
             WHERE id = 10;

短整数の配列がホスト構造内で宣言される場合、以下のようになります。

   struct tag
   {
     short i[2];
   } test_record;

SQL ステートメントで test_record が参照されるときに配列が要素に展開されると、 :test_record は、:test_record.i[0], :test_record.i[1] と同等になります。

C および C++ での Null 終了ストリング

C/C++ の NULL 終了ストリングは、独自の SQLTYPE (文字の場合は 460/461 で、図形の場合は 468/469) を持ちます。

C/C++ の NULL 終了ストリングは、 LANGLEVEL プリコンパイラー・オプションの値に基づいてさまざまに処理されます。これらの SQLTYPE のうちの 1 つのホスト変数と宣言された長さ n を SQL ステートメント内に指定し、さらにデータのバイト数 (文字タイプの場合) または 2 バイト文字 (図形タイプの場合) が k である場合を以下に説明します。

長さが n の SQLTYPE 460 のホスト変数を他の SQL 文脈内に指定すると、上で定義したように、長さ n の VARCHAR データ・タイプとして処理されます。長さが n の SQLTYPE 468 のホスト変数をその他の SQL 文脈内に指定した場合には、上での定義のように、長さ n の VARGRAPHIC データ・タイプとして処理されます。

C および C++ でのポインター・データ・タイプ

ホスト変数は、特定のデータ・タイプへのポインターとして、以下のような制限付きで宣言されることがあります。

C および C++ でのクラス・データ・メンバーのホスト変数としての使用

クラス・データ・メンバーは、ホスト変数として宣言できます (クラスまたはオブジェクト自身ではなく)。以下は、使用方法を説明する例です。

    class STAFF
    { 
        private:
             EXEC SQL BEGIN DECLARE SECTION;
               char        staff_name[20];
               short int   staff_id;
               double      staff_salary;
             EXEC SQL END DECLARE SECTION;
             short       staff_in_db;
        . 
        . 
    };

データ・メンバーへは、クラス・メンバー関数内の C++ コンパイラーにより提供される暗黙の this ポインターを介して、 SQL ステートメント内で直接アクセスできるだけです。 SQL ステートメント内でオブジェクト・インスタンス (SELECT name INTO :my_obj.staff_name ... など) を明示的に修飾することは できません

SQL ステートメント内でクラス・データ・メンバーを直接参照する場合は、データベース・マネージャーが this ポインターを使用して参照を解決します。こうした理由から、最適化レベルのプリコンパイル・オプション (OPTLEVEL) は、省略時設定の 0 (最適化を行わない) のままにしておいてください。これは、データベース・マネージャーが SQLDA の最適化を行わないということを意味します。 (これは、ポインター・ホスト変数が SQL ステートメントに含まれていれば常に当てはまります。)

次の例は、SQL ステートメント内でホスト変数として宣言したクラス・データ・メンバーを、直接使用する方法を示しています。

    class STAFF
    { 
        
.
.
.
public:
.
.
.
short int hire( void ) { EXEC SQL INSERT INTO staff ( name,id,salary ) VALUES ( :staff_name, :staff_id, :staff_salary ); staff_in_db = (sqlca.sqlcode == 0); return sqlca.sqlcode; } };

この例では、クラス・データ・メンバーである staff_namestaff_id、および staff_salary が INSERT ステートメント内で直接使用されています。これらはホスト変数として宣言されているため (クラス・データ・メンバーをホスト変数として宣言する例の例を参照)、 this ポインターを用いて、現行対象に対して暗黙のうちに修飾されています。 SQL ステートメントでは、 this ポインターを介してアクセスすることができないデータ・メンバーも参照することができます。これは、ポインターまたは参照ホスト変数を使用してこれらを間接的に参照することにより行うことができます。

次の例は、2 番目のオブジェクトである otherGuy を獲得する、 asWellPaidAs という新しい方法を示しています。この方法では、SQL ステートメント内でメンバーを直接参照できないため、ローカル・ポインターまたは参照ホスト変数を介して間接的にメンバーを参照します。

     short int STAFF::asWellPaidAs( STAFF otherGuy )
     { 
         EXEC SQL BEGIN DECLARE SECTION;
           short &otherID = otherGuy.staff_id
           double otherSalary;
         EXEC SQL END DECLARE SECTION;
         EXEC SQL SELECT SALARY INTO :otherSalary
           FROM STAFF WHERE id = :otherID;
           if( sqlca.sqlcode == 0 )
              return staff_salary >= otherSalary;
           else
              return 0;
     }

C および C++ での修飾およびメンバー演算子の使用

組み込み SQL ステートメント内で、C++ 効力範囲解決演算子 '::' を使用したり、C/C++ メンバー演算子 '.' または '->' を使用したりすることはできません。これと同じことは、ローカル・ポインターまたは参照変数を使用することにより、簡単に行うことができます。ローカル・ポインターや参照変数は SQL ステートメントの外部に設定して使用したい効力範囲内の変数を指定し、その後は SQL ステートメント内でこれを参照するために使用されます。以下に、正しい使用方法の例を示します。

     EXEC SQL BEGIN DECLARE SECTION;
       char (& localName)[20] = ::name;
     EXEC SQL END DECLARE SECTION;
     EXEC SQL
       SELECT name INTO :localName FROM STAFF
       WHERE name = 'Sanders';

C および C++ でのグラフィック・ホスト変数の処理

C または C++ で作成されたアプリケーションでグラフィック・データを処理するには、 wchar_t C/C++ データ・タイプまたは DB2 提供の sqldbchar データ・タイプに基づくホスト変数を使用してください。これら 2 つのホスト変数は、 GRAPHIC、VARGRAPHIC、または DBCLOB などの表の列に割り当てることができます。たとえば、表の GRAPHIC または VARGRAPHIC 列から、DBCS データを更新したり選択したりすることができます。

図形ホスト変数には、以下のような 3 つの有効な書式があります。

C および C++ での複数バイト文字の符号化

文字の符号化スキーマの中には、特に東アジアの国々の文字には 1 つの文字を表すのに複数バイトを必要とするものがあります。このデータの外部表現は文字の多重バイト文字コード 表現と呼ばれ、 2 バイト文字 (2 バイトで表される文字) を含みます。 DB2 のグラフィック・データは、2 バイト文字からなります。

2 バイト文字で文字ストリングを扱うためには、アプリケーションでデータの内部表現を使用するのが便利です。この内部表現は、2 バイト文字のワイド・キャラクター・コード 表現と呼ばれており、通常 wchar_t C/C++ データ・タイプで使用される形式です。ワイド・キャラクター・データの処理やワイド・キャラクター形式データの多重バイト形式との変換を行うためには、 ANSI C および X/OPEN Portability Guide 4 (XPG4) に準拠するサブルーチンを使用することができます。

アプリケーションでは、文字データを多重バイト形式またはワイド・キャラクター形式のどちらかで処理できますが、データベース・マネージャーとの対話は、DBCS (多重バイト) 文字コードでしか行うことができないことに注意してください。つまり、データの GRAPHIC 列への保管や GRAPHIC 列からの検索は、DBCS 形式で行われます。 WCHARTYPE プリコンパイラー・オプションは、ワイド・キャラクター形式のアプリケーション・データがデータベース・エンジンで交換される際に、これを多重バイト形式に変換したり元に戻したりするために使用されます。

C および C++ での wchar_t または sqldbchar データ・タイプの選択

DB2 グラフィック・データのサイズおよびコード化は、特定のコード・ページではどのプラットフォームでも同じですが、 ANSI C または C++ wchar_t データ・タイプのサイズおよび内部書式は、使用するコンパイラーとプラットフォームによって異なります。しかしながら、sqldbchar データ・タイプは、DB2 によってサイズが 2 バイトと定義されており、データベース内で保管されるのと同じ形式で DBCS および UCS-2 データを操作する、可搬性のある方法が使用されています。 UCS-2 データの詳細については、 日本語および中国語 (繁体字) EUC および UCS-2 コード・セットに関する考慮事項および管理の手引き を参照してください。

DB2 C 図形ホスト変数タイプはすべて、wchar_tsqldbchar によって定義できます。 WCHARTYPE CONVERT プリコンパイル・オプション (C および C++ での WCHARTYPE プリコンパイラー・オプションで説明) を使用してアプリケーションを構築する場合には、必ず wchar_t の方を使用してください。
注:Windows プラットフォーム上で WCHARTYPE CONVERT オプションを指定する際には、 Windows プラットフォーム上の wchar_t は Unicode であることに注意してください。したがって、ご使用の C/C++ コンパイラーの wchar_t が Unicode でない場合には、 wcstombs() 関数呼び出しは SQLCODE -1421 (SQLSTATE=22504) を出して失敗します。この場合、WCHARTYPE NOCONVERT オプションを指定したり、ご使用のプログラムから wcstombs() および mbstowcs() 関数を明示的に呼び出したりすることができます。

WCHARTYPE NOCONVERT プリコンパイル・オプションを使用してアプリケーションを構築する場合には、異なる DB2 クライアントとサーバー・プラットフォーム間でも最大限の可搬性を得られるよう、 sqldbchar の方を使用してください。 WCHARTYPE NOCONVERT を使用する場合でも wchar_t は使えますが、 wchar_t が 2 バイトで定義されているプラットフォームだけに限ります。

ホスト変数宣言で wchar_tsqldbchar を誤って使用すると、プリコンパイル時に SQLCODE 15 (SQLSTATE ではない) が返されます。

C および C++ での WCHARTYPE プリコンパイラー・オプション

WCHARTYPE プリコンパイラー・オプションを使用すると、 C/C++ アプリケーションでどの図形文字形式を使用するかを指定できます。このオプションにより、グラフィック・データを多重バイト形式またはワイド・キャラクター形式のどちらにするかを柔軟に選択することができます。 WCHARTYPE オプションには、次の 2 つの値があります。

CONVERT
WCHARTYPE CONVERT オプションを選択した場合、文字コードは図形ホスト変数とデータベース・マネージャーとの間で変換されます。図形入力ホスト変数の場合、ワイド・キャラクター形式から多重バイト DBCS 文字形式への文字コード変換は、データがデータベース・マネージャーに送信される前に ANSI C 関数の wcstombs() を使用して行われます。図形出力ホスト変数の場合には、多重バイト DBCS 文字形式からワイド・キャラクター形式への文字コード変換は、データベース・マネージャーから受け取られたデータがホスト変数に保管される前に、 ANSI C 関数の mbstowcs() を使用して実行されます。

WCHARTYPE CONVERT を使用する利点は、それによってアプリケーションが、データベース・マネージャーと通信する前に、データを複数バイト形式に明示的に変換しなくても、ワイド・キャラクター・ストリング (L-リテラル、'wc' ストリング関数など) を処理するための ANSI C 機構を十分に利用できることです。この短所としては、暗黙のうちに変換を行うことによってアプリケーション実行時のパフォーマンスに影響を及ぼすことがあり、さらにメモリー要件が大きくなる恐れがあることが挙げられます。

WCHARTYPE CONVERT を選択した場合は、すべての図形ホスト変数を、sqldbchar ではなく、wchar_t を使用して宣言してください。

WCHARTYPE CONVERT 振る舞いは希望するが、アプリケーションはプリコンパイルする必要がない場合 (たとえば、CLI アプリケーション)、コンパイル時に C プリプロセッサー・マクロ SQL_WCHART_CONVERT を定義してください。これによって、DB2 ヘッダー・ファイルの特定の定義でデータ・タイプ sqldbchar ではなく、 wchar_t が使用されます。
注:WCHARTYPE CONVERT プリコンパイル・オプションは、現在、 DB2 Windows 3.1 クライアントで実行するプログラムではサポートされていません。それらのプログラムには、省略時値 (WCHARTYPE NOCONVERT) を使用してください。

NOCONVERT (省略時値)
WCHARTYPE NOCONVERT オプションを選択した場合、あるいは WCHARTYPE オプションをまったく指定しない場合は、アプリケーションとデータベース・マネージャーの間で暗黙の文字コード変換は行われません。図形ホスト変数内のデータは、未変更の DBCS 文字としてデータベース・マネージャーとの間で送受信されます。これにはパフォーマンスを向上させるという利点がありますが、短所としてアプリケーションが wchar_t ホスト変数内のワイド・キャラクター・データの使用をやめるか、またはデータベース・マネージャーとのインターフェースをとる際にデータの多重バイト形式への変換のために wcstombs() および mbstowcs() 関数を明示的に呼び出さなければならないということがあります。

WCHARTYPE NOCONVERT を選択した場合は、他の DB2 クライアント / サーバー・プラットフォームへの可搬性を最大限に得られるようにするため、すべての図形ホスト変数を sqldbchar タイプを使用して宣言してください。

詳細については、コマンド解説書 を参照してください。

注意すべきその他の指針としては以下のものがあります。

注:

  1. C 言語アプリケーションを WCHARTYPE CONVERT オプションを使用してプリコンパイルする場合、 DB2 は変換関数がデータを渡すときに、入力出力両方のアプリケーションのグラフィック・データを妥当性検査します。 CONVERT オプションを使用しない場合は、グラフィック・データの変換は行われず、したがって検証も行われません。このことが CONVERT/NOCONVERT 混合環境では、無効なデータが NOCONVERT アプリケーションによって挿入され、それを CONVERT アプリケーションが取り出したりする場合に、問題の原因になります。このようなデータの変換は失敗し、CONVERT アプリケーションでの FETCH 時に、SQLCODE -1421 (SQLSTATE 22504) が返されます。

  2. WCHARTYPE CONVERT プリコンパイル・オプションは、現在、DB2 Windows 3.1 クライアントで実行するプログラムではサポートされていません。この場合には、省略時の WCHARTYPE NOCONVERT オプションを使用してください。

C および C++ での日本語または中国語 (繁体字) EUC、および UCS-2 に関する考慮事項

アプリケーション・コード・ページが日本語または中国語 (繁体字) EUC の場合、またはアプリケーションが UCS-2 データベースと接続されている場合、 CONVERT オプションか NOCONVERT オプションのどちらか、および wchar_t または sqldbchar 図形ホスト変数、または入力 / 出力 SQLDA を使用することにより、データベース・サーバーで GRAPHIC 列にアクセスできます。この節で DBCS 形式 に言及する場合、それは EUC データ用の UCS-2 コード化スキーマを指します。次の 2 つのケースを考えてみてください。

変換を最小限に抑えるには、 NOCONVERT オプションを使用してアプリケーション内で変換を処理するか、または GRAPHIC 列を使用しないかのいずれかです。 wchar_t コード化が 2 バイト Unicode のクライアント環境 (たとえば Windows NT または AIX バージョン 4.3 およびそれ以降など) の場合には、 NOCONVERT オプションを使用して直接 UCS-2 で作業できます。この場合、ご使用のアプリケーションはビッグ・エンディアンとリトル・エンディアン・アーキテクチャーとの違いを扱わなければなりません。 NOCONVERT オプションを使用する場合、 DB2 ユニバーサル・データベースは、常に 2 バイト・ビッグ・エンディアンである sqldbchar を使用します。

UCS-2 への変換後 (NOCONVERT 指定の場合) や、ワイド・キャラクター形式への変換 (CONVERT 指定の場合) によって、 IBM-eucJP/IBM-eucTW CS0 (7 ビット ASCII) データおよび IBM-eucJP CS2 (カタカナ) データを図形ホスト変数に割り当てることはしないでください。これは、どちらの EUC コード・セットも UCS-2 から PC DBCS へと変換すると単一バイトになってしまうためです。

通常、eucJP および eucTW は GRAPHIC データを UCS-2 として保管しますが、これらのデータベースにある GRAPHIC データは非 ASCII eucJP または eucTW データのままです。特に、そのような GRAPHIC データに埋め込まれるスペースは、DBCS スペースです (UCS-2、U+3000 では表意文字スペースとも呼ばれます)。しかし、UCS-2 データベースの場合には、 GRAPHIC データに UCS-2 文字を含めることができ、スペースの埋め込みは UCS-2 スペース、U+0020 を使用して実行されます。 UCS-2 データベースから UCS-2 を検索する場合と、 eucJP および eucTW データベースから UCS-2 データを検索する場合には、この違いに注意してください。

一般的な EUC アプリケーション開発の指針については、 日本語および中国語 (繁体字) EUC および UCS-2 コード・セットに関する考慮事項を参照してください。


[ ページのトップ | 前ページ | 次ページ | 目次 | 索引 ]