ホスト変数は、SQL ステートメント内で参照される C または C++ の言語変数です。これにより、アプリケーションは入力データをデータベース・マネージャーに渡し、またデータベース・マネージャーから出力データを受け取ることができます。アプリケーションのプリコンパイルが行われると、コンパイラーはホスト変数をその他の C/C++ 変数と同様に使用します。ホスト変数の命名、宣言、および使用は、以下の節で述べる規則に従って行ってください。
SQL プリコンパイラーは、宣言された名前によってホスト変数を識別します。以下の規則が適用されます。
EXEC SQL BEGIN DECLARE SECTION; char varsql; /* allowed */ char sqlvar; /* not allowed */ char SQL_VAR; /* not allowed */ EXEC SQL END DECLARE SECTION;
void f1(int i) { EXEC SQL BEGIN DECLARE SECTION; short host_var_1; EXEC SQL END DECLARE SECTION; EXEC SQL SELECT COL1 INTO :host_var_1 from TBL1; } void f2(int i) { EXEC SQL BEGIN DECLARE SECTION; short host_var_2; EXEC SQL END DECLARE SECTION; EXEC SQL INSERT INTO TBL1 VALUES (:host_var_2); }
複数のローカル・ホスト変数に同じ名前を付けることも可能です。ただしこの場合、それらの変数がすべて同じタイプかつ同じサイズであることが条件です。このことを行うには、そのようなホスト変数の最初の出現箇所を BEGIN DECLARE SECTION ステートメントと END DECLARE SECTION ステートメントの間でプリコンパイラーに宣言し、残りの変数の宣言については宣言セクション外でそのままにしておきます。以下のコーディング例は、このことを示したものです。
void f3(int i) { EXEC SQL BEGIN DECLARE SECTION; char host_var_3[25]; EXEC SQL END DECLARE SECTION; EXEC SQL SELECT COL2 INTO :host_var_3 FROM TBL2; } void f4(int i) { char host_var_3[25]; EXEC SQL INSERT INTO TBL2 VALUES (:host_var_3); }
f3 と f4 は同じモジュールにあり、 host_var_3 はどちらの関数でも同じタイプかつ長さなので、プリコンパイラーへの宣言は 1 回で済みます。
ホスト変数宣言の識別には、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: 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-'
注:
書式 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-' >----;---------------------------------------------------------><
注:
可変長文字ホスト変数に関する考慮事項:
標識変数のデータ・タイプは short と宣言してください。
図形ホスト変数の宣言書式は、以下の 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-'
注:
グラフィック・ホスト変数に関する考慮事項:
図形宣言の構文 (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--}--'
注:
図形宣言 (VARGRAPHIC 構造書式) に関する考慮事項:
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")-'
注:
LOB ホスト変数に関する考慮事項:
SQL TYPE IS BLOB my_blob;
注: | ワイド・キャラクター・リテラル、たとえば L"Hello" は、 WCHARTYPE CONVERT プリコンパイル・オプションを選択した場合に、プリコンパイル済みプログラムでのみ使用すべきである。 |
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) ロケーター・ホスト変数の構文 >>-+----------+---+----------+--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 ロケーター・ホスト変数に関する考慮事項:
CLOB ロケーターの例 (他のタイプの LOB ロケーターの場合も同様):
宣言:
SQL TYPE IS CLOB_LOCATOR my_locator;
この結果、以下の宣言が生成されます。
sqlint32 my_locator;
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++ の宣言セクションでは、括弧を使用してホスト変数を初期化することはできません。次に、宣言セクション内での初期化の正しい方法と誤った方法の例を示します。
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 プリプロセッサーでソース・ファイルをプリプロセスしなければなりません。これを実行するには、PREPROCESSOR オプションを使って、C プリプロセッサーを起動するためのコマンドをプリコンパイラーに指定します。
PREPROCESSOR オプションを指定すると、プリコンパイラーはまず、 SQL INCLUDE ステートメントで参照されているすべてのファイルの内容をソース・ファイルに結合させることによって、すべての SQL INCLUDE ステートメントを処理します。次にプリコンパイラーは、修正したソース・ファイルを入力として指定するコマンドを使用して、外部 C プリプロセッサーを起動します。プリプロセス済みのファイル (拡張子 ".i" によってプリコンパイラーは識別) は、プリコンパイルの残りのプロセスでの新しいソース・ファイルとして使用されます。
プリコンパイラーにより生成された任意の #line マクロは、元のソース・ファイルを参照することはありません。代わりに、プリプロセスされたファイルを参照します。コンパイラー・エラーを元のソース・ファイルに関連付けるには、プリプロセスされたファイルに注釈を保存します。これにより、ヘッダー・ファイルを含むオリジナル・ソース・ファイルのあらゆるセクションを位置指定できます。注釈を保存するオプションは、通常、C プリプロセッサーで使用でき、 PREPROCESSOR オプションを使用して、指定するコマンドにオプションを含められます。 C プリプロセッサーには、任意の #line マクロ自体を出力させてはなりません。これには、プリコンパイラーにより生成されたものが誤って混在している可能性があるためです。
マクロ展開の使用上の注意:
xlC -P -DMYMACRO=1
xlC -E > x.i
たとえば、以下のようにソース・コード内でマクロ展開を使用することができます。
#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++ プリコンパイラーは、ホスト変数を単一のホスト構造にグループ化することができます。これにより、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 つの方法があります。
EXEC SQL SELECT id, name, years, salary INTO :staff_record FROM staff WHERE id = 10;
プリコンパイラーは staff_record の参照を、ホスト構造内で宣言されたすべてのフィールドをコンマで区切ったリストに変換します。他のホスト変数またはフィールドとの重複を避けるために、それぞれのフィールドは、すべてのレベルのホスト構造名で修飾されます。これは以下の使用法と同じです。
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 つしか持たないホスト構造が許可されます。
インディケーター表は、ホスト構造で使用される標識変数の集合です。これは、短整数の配列として宣言しなければなりません。以下はその例です。
short ind_tab[10];
上の例は、要素が 10 個のインディケーター表を宣言します。以下に、これを SQL ステートメントで使用する方法を示します。
EXEC SQL SELECT id, name, years, salary INTO :staff_record INDICATOR :ind_tab FROM staff WHERE id = 10;
以下の表では、それぞれのホスト構造フィールドとそれに対応する標識変数をリストしています。
注: | インディケーター表要素、たとえば 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 終了ストリングは、独自の 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 データ・タイプとして処理されます。
ホスト変数は、特定のデータ・タイプへのポインターとして、以下のような制限付きで宣言されることがあります。
char mystring[20]; char (*mystring)[20];
EXEC SQL BEGIN DECLARE SECTION; char (*arr)[10]; /* correct */ char *(arr); /* incorrect */ char *arr[10]; /* incorrect */ EXEC SQL END DECLARE SECTION;
この例で、最初の宣言は 10 バイトの文字配列へのポインターです。これは有効なホスト変数となっています。 2 番目は無効な宣言です。文字へのポインターでは括弧は使用できません。 3 番目の宣言はポインターの配列です。このデータ・タイプはサポートされていません。
以下のようなホスト変数の宣言があるとします。
char *ptr
この宣言は受け入れられますが、 長さが未指定の NULL 終了文字ストリング を意味するわけではありません。その代わり、これは 固定長の単一文字のホスト変数へのポインター であることを表します。これは意図された宣言ではないかもしれません。別の文字ストリングを指示することができるポインター・ホスト変数を定義するには、上記の最初の宣言書式を用いてください。
EXEC SQL BEGIN DECLARE SECTION; char (*mychar)[20]; /* Pointer to character array of 20 bytes */ EXEC SQL END DECLARE SECTION; EXEC SQL SELECT column INTO :*mychar FROM table; /* Correct */
クラス・データ・メンバーは、ホスト変数として宣言できます (クラスまたはオブジェクト自身ではなく)。以下は、使用方法を説明する例です。
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_name、staff_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; }
組み込み 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++ で作成されたアプリケーションでグラフィック・データを処理するには、 wchar_t C/C++ データ・タイプまたは DB2 提供の sqldbchar データ・タイプに基づくホスト変数を使用してください。これら 2 つのホスト変数は、 GRAPHIC、VARGRAPHIC、または DBCLOB などの表の列に割り当てることができます。たとえば、表の GRAPHIC または VARGRAPHIC 列から、DBCS データを更新したり選択したりすることができます。
図形ホスト変数には、以下のような 3 つの有効な書式があります。
単純図形ホスト変数は、GRAPHIC(1) SQL データ・タイプに相当する 468/469 の SQLTYPE を持っています。 (図形宣言の構文 (単純図形書式および NULL 終了図形書式) を参照。)
NULL 終了とは、図形ストリングの最後の文字のバイトがすべて 2 進ゼロ ('\0') である状態を言います。これらは SQLTYPE が 400/401 となります。 (図形宣言の構文 (単純図形書式および NULL 終了図形書式) を参照。)
VARGRAPHIC 構造ホスト変数は、長さが 1 から 16 336 バイトの間の場合は SQLTYPE が 464/465 となります。この変数の長さが 2000 から 16 350 バイトの間の場合は、SQLTYPE が 472/473 となります。 (図形宣言の構文 (VARGRAPHIC 構造書式) を参照。)
文字の符号化スキーマの中には、特に東アジアの国々の文字には 1 つの文字を表すのに複数バイトを必要とするものがあります。このデータの外部表現は文字の多重バイト文字コード 表現と呼ばれ、 2 バイト文字 (2 バイトで表される文字) を含みます。 DB2 のグラフィック・データは、2 バイト文字からなります。
2 バイト文字で文字ストリングを扱うためには、アプリケーションでデータの内部表現を使用するのが便利です。この内部表現は、2 バイト文字のワイド・キャラクター・コード 表現と呼ばれており、通常 wchar_t C/C++ データ・タイプで使用される形式です。ワイド・キャラクター・データの処理やワイド・キャラクター形式データの多重バイト形式との変換を行うためには、 ANSI C および X/OPEN Portability Guide 4 (XPG4) に準拠するサブルーチンを使用することができます。
アプリケーションでは、文字データを多重バイト形式またはワイド・キャラクター形式のどちらかで処理できますが、データベース・マネージャーとの対話は、DBCS (多重バイト) 文字コードでしか行うことができないことに注意してください。つまり、データの GRAPHIC 列への保管や GRAPHIC 列からの検索は、DBCS 形式で行われます。 WCHARTYPE プリコンパイラー・オプションは、ワイド・キャラクター形式のアプリケーション・データがデータベース・エンジンで交換される際に、これを多重バイト形式に変換したり元に戻したりするために使用されます。
DB2 グラフィック・データのサイズおよびコード化は、特定のコード・ページではどのプラットフォームでも同じですが、 ANSI C または C++ wchar_t データ・タイプのサイズおよび内部書式は、使用するコンパイラーとプラットフォームによって異なります。しかしながら、sqldbchar データ・タイプは、DB2 によってサイズが 2 バイトと定義されており、データベース内で保管されるのと同じ形式で DBCS および UCS-2 データを操作する、可搬性のある方法が使用されています。 UCS-2 データの詳細については、 日本語および中国語 (繁体字) EUC および UCS-2 コード・セットに関する考慮事項および管理の手引き を参照してください。
DB2 C 図形ホスト変数タイプはすべて、wchar_t か sqldbchar によって定義できます。 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_t か sqldbchar を誤って使用すると、プリコンパイル時に SQLCODE 15 (SQLSTATE ではない) が返されます。
WCHARTYPE プリコンパイラー・オプションを使用すると、 C/C++ アプリケーションでどの図形文字形式を使用するかを指定できます。このオプションにより、グラフィック・データを多重バイト形式またはワイド・キャラクター形式のどちらにするかを柔軟に選択することができます。 WCHARTYPE オプションには、次の 2 つの値があります。
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) を使用してください。 |
WCHARTYPE NOCONVERT を選択した場合は、他の DB2 クライアント / サーバー・プラットフォームへの可搬性を最大限に得られるようにするため、すべての図形ホスト変数を sqldbchar タイプを使用して宣言してください。
注意すべきその他の指針としては以下のものがあります。
注:
アプリケーション・コード・ページが日本語または中国語 (繁体字) EUC の場合、またはアプリケーションが UCS-2 データベースと接続されている場合、 CONVERT オプションか NOCONVERT オプションのどちらか、および wchar_t または sqldbchar 図形ホスト変数、または入力 / 出力 SQLDA を使用することにより、データベース・サーバーで GRAPHIC 列にアクセスできます。この節で DBCS 形式 に言及する場合、それは EUC データ用の UCS-2 コード化スキーマを指します。次の 2 つのケースを考えてみてください。
DB2 クライアントによって、グラフィック・データがワイド・キャラクター形式からご使用のアプリケーション・コード・ページに変換され、その後、入力 SQLDA をデータベース・サーバーに送信する前に UCS-2 に変換します。グラフィック・データはすべて、UCS-2 コード・ページ識別子によってタグ付けされたデータベース・サーバーに送られます。混合文字データは、アプリケーション・コード・ページ識別子によってタグ付けされます。クライアントによってデータベースからグラフィック・データが取り出されると、そのグラフィック・データは UCS-2 コード・ページ識別子によってタグ付けされます。 DB2 クライアントが、データを UCS-2 からクライアント・アプリケーション・コード・ページへ変換し、さらにそれをワイド・キャラクター形式に変換します。ホスト変数の代わりに入力 SQLDA を使用した場合は、グラフィック・データを必ずワイド・キャラクター形式でコード化する必要があります。このデータは UCS-2 に変換され、その後データベース・サーバーに送られます。上記の変換はパフォーマンスに影響を及ぼします。
グラフィック・データは UCS-2 によってコード化され、 UCS-2 コード・ページでタグ付けされたものと DB2 からはみなされます。変換は行われません。 DB2 は、図形ホスト変数を単にバケットとして使用されるものとみなします。 NOCONVERT オプションを選択した場合、データベース・サーバーから取り出されるグラフィック・データは、 UCS-2 によってコード化されたアプリケーションに渡されます。アプリケーション・コード・ページから UCS-2、および UCS-2 からアプリケーション・コード・ページへの変換は、すべてユーザーの責任で行うことになります。 UCS-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 コード・セットに関する考慮事項を参照してください。