Java 以外の言語で作成されたアプリケーションは、ヌル値を受け取ることができるホスト変数と標識変数 とを関連付けることによって、ヌル値を受け取る準備をしておく必要があります。 Java アプリケーションは、ホスト変数の値を Java のヌル値と比較して、受け取った値がヌル値かどうかを判別します。標識変数は、データベース・マネージャーとホスト・アプリケーションにより共用されます。したがって、標識変数はアプリケーション内ではホスト変数として宣言しておくことが必要です。このホスト変数は、SQL データのタイプ SMALLINT に対応します。
標識変数は SQL ステートメントでホスト変数の直後に置かれ、接頭部としてコロンが付けられます。スペースを用いると標識変数とホスト変数を分けることができますが、このスペースは必須ではありません。ただし、ホスト変数と標識変数の間にコンマを使用しないでください。また、オプションの INDICATOR キーワードをホスト変数とその標識の間に置いて標識変数を指定することもできます。
標識変数は、サポートされているホスト言語で INDICATOR キーワードを用いて標識変数を使用する方法について示しています。
EXEC SQL FETCH C1 INTO :cm INDICATOR :cmind; if ( cmind < 0 ) printf( "Commission is NULL\n" );
#SQL { FETCH :c1 INTO :cm }; if ( cm == null ) System.out.println( "Commission is NULL\n" );
EXEC SQL FETCH C1 INTO :cm INDICATOR :cmind END-EXEC IF cmind LESS THAN 0 DISPLAY 'Commission is NULL'
EXEC SQL FETCH C1 INTO :cm INDICATOR :cmind IF ( cmind .LT. 0 ) THEN WRITE(*,*) 'Commission is NULL' ENDIF
上の例で、cmind は負の値かどうかが検査されます。負の値ではない場合、アプリケーションは cm の戻り値を使用することができます。負の値の場合、取り出される値は NULL で、cm は使用されません。この場合、データベース・マネージャーはホスト変数の値を変更しません。
注: | データベースの構成パラメーター DFT_SQLMATHWARN を 'YES' に設定した場合、 cmind の値は -2 になることがあります。これは、算術計算エラーのある式を評価したため、または結果数値をホスト変数に変換しようとした時に桁あふれが起きたために、 NULL になったことを示しています。 |
データ・タイプが NULL を処理できる場合、アプリケーションは NULL 標識を指定しなければなりません。そうでない場合は、エラーが発生することがあります。 NULL 標識を使用しない場合、SQLCODE -305 (SQLSTATE 22002) が戻されます。
SQLCA 構造が切り捨て警告を示す場合、標識変数の切り捨て検査を行うことができます。標識変数が正の値の場合は、切り捨てが行われます。
INSERT または UPDATE ステートメントを処理中に、データベース・マネージャーは標識変数を検査します (標識変数がある場合)。標識変数が負の値の場合、データベース・マネージャーは目標の列値を NULL に設定します (NULL が使用できる場合)。標識変数がゼロ以上の場合、データベース・マネージャーは関連付けられたホスト変数の値を使用します。
ホスト変数に割り当てられる際にストリング列の値が割り当てられた場合、 SQLCA 構造の SQLWARN1 フィールドに 'X' または 'W' が入れられる場合があります。ヌル終止符が切り捨てられた場合は、'N' が入ります。
下記の条件のすべてに適合した場合にのみ、データベース・マネージャーから 'X' の値が戻されます。
標識変数に戻される値は、アプリケーションのコード・ページでの文字ストリングの長さになります。
それ以外の場合でデータ切り捨てが行われると、 (NULL 終止符の切り捨てとは対照的に) データベース・マネージャーは必ず 'W' を戻します。この場合、データベース・マネージャーは、選択リスト項目のコード・ページ (アプリケーションのコード・ページであれ、データベースのコード・ページであれ、あるいは何もない場合であれ) にある結果文字ストリングの長さを指す標識変数の値をアプリケーションに戻します。詳細については、SQL 解説書 を参照してください。
DB2 表の各列には、列の作成時に SQL データ・タイプ が付与されます。列にデータ・タイプを割り当てる方法については、 SQL 解説書 の CREATE TABLE ステートメントを参照してください。データベース・マネージャーは、以下の列データ・タイプをサポートしています。
以下のデータ・タイプは、 2 バイト文字セット (DBCS) および拡張 UNIX コード (EUC) 文字環境でしか使用できません。
注:
サポートされるホスト言語のデータ・タイプは、データベース・マネージャーのデータ・タイプの大多数に対応しています。ホスト変数宣言には、これらのホスト言語のデータ・タイプだけが使用できます。プリコンパイラーは、ホスト変数宣言を検出すると、適切な SQL データ・タイプの値を判別します。データベース・マネージャーはこの値を使用して、アプリケーションとの間でやり取りするデータを変換します。
データベース・マネージャーが異なるデータ・タイプ間の比較と割り当てをどのように処理するかを理解することは、アプリケーション・プログラマーにとって重要です。つまり、データベース・マネージャーが 2 つの SQL 列データ・タイプと 2 つのホスト言語データ・タイプ (あるいはそのいずれか) で処理を行っているとしても、データ・タイプは割り当ておよび比較の操作中は互いに互換性を持たなければなりません。
データ・タイプの互換性に関する一般的な 規則とは、サポートされるホスト言語の数値データ・タイプはすべてデータベース・マネージャーの数値データ・タイプと比較して割り当てることができ、ホスト言語の文字タイプはすべてデータベース・マネージャーの文字タイプと互換性があるということです。数値タイプには文字タイプとの互換性がありません。ただし、この一般的な規則には、ラージ・オブジェクトでの処理時に課される特徴および制限に基づいた例外もあります。
SQL ステートメント内であれば、DB2 では互換性のあるデータ・タイプどうしでの変換が可能です。たとえば、以下の SELECT ステートメントでは、SALARY と BONUS は DECIMAL 列ですが、各従業員の合計支給額は DOUBLE データとして戻されます。
SELECT EMPNO, DOUBLE(SALARY+BONUS) FROM EMPLOYEE
上記のステートメントの実行では、 DECIMAL と DOUBLE のデータ・タイプ間で変換が行われることに注目してください。画面に表示される照会結果をもっと読みやすくするには、次の SELECT ステートメントを使用することができます。
SELECT EMPNO, DIGIT(SALARY+BONUS) FROM EMPLOYEE
アプリケーション内でデータを変換するには、この変換をサポートするその他のルーチン、クラス、組み込みタイプ、または API があるかコンパイラーのベンダーにお問い合わせください。
文字データ・タイプには文字変換が必要な場合もあります。アプリケーションのコード・ページがデータベースのコード・ページと異なる場合は、 異なるコード・ページ間での変換を参照してください。
サポートされる SQL データ・タイプのリストと、それに対応するホスト言語データ・タイプについては、以下を参照してください。
SQL データ・タイプ、割り当てと比較の規則、およびデータ変換と変換エラーの詳細については、 SQL 解説書 を参照してください。
次のコード・セグメントは、 C の例: STATIC.SQCで挙げた C バージョンの STATIC サンプル・プログラムに対応するセグメントへの修正を示しています。これらのセグメントは、ヌル可能なデータ列での標識変数のインプリメンテーションを示しています。この例では、STATIC プログラムは別の列 WORKDEPT を選択するために拡張されます。この列にはヌル値を使用することができます。標識変数は、使用前にホスト変数として宣言しておかなければなりません。
.
.
.
EXEC SQL BEGIN DECLARE SECTION; char wd[3]; short wd_ind; char firstname[13];
.
.
.
EXEC SQL END DECLARE SECTION;
.
.
.
/* CONNECT TO SAMPLE DATABASE */
.
.
.
EXEC SQL SELECT FIRSTNME, WORKDEPT INTO :firstname, :wd:wdind FROM EMPLOYEE WHERE LASTNAME = 'JOHNSON';
.
.
.