CLI の手引きおよび解説書

SQLBindParameter - バッファーまたは LOB ロケーターにパラメーター・マーカーをバインドする

目的


仕様: DB2 CLI 2.1 ODBC 2.0  

SQLBindParameter() は、 SQL ステートメント内のパラメーター・マーカーを以下のいずれかに関連付ける (バインドする) ために使用します。

この関数は、パラメーターを入力または出力 (あるいはその両方) できるストアード・プロシージャー CALL ステートメントのパラメーターに、アプリケーション記憶域をバインドするときにも使用しなければなりません。この関数は、基本的には SQLSetParam() の拡張です。

構文

SQLRETURN  SQL_API SQLBindParameter(
                SQLHSTMT          StatementHandle,  /* hstmt */
                SQLUSMALLINT      ParameterNumber,  /* ipar */
                SQLSMALLINT       InputOutputType,  /* fParamType */
                SQLSMALLINT       ValueType,        /* fCType */
                SQLSMALLINT       ParameterType,    /* fSqlType */
                SQLUINTEGER       ColumnSize,       /* cbColDef */
                SQLSMALLINT       DecimalDigits,    /* ibScale */
                SQLPOINTER        ParameterValuePtr,/* rgbValue */
                SQLINTEGER        BufferLength,     /* cbValueMax */
                SQLINTEGER *FAR   StrLen_or_IndPtr);/* pcbValue */

関数引き数


表 21. SQLBindParameter 引き数
データ・タイプ 引き数 使用法 説明
SQLHSTMT StatementHandle 入力 ステートメント・ハンドル
SQLUSMALLINT ParameterNumber 入力 パラメーター・マーカーは、1 を最初の番号として順次左から右へ番号が付けられます。
SQLSMALLINT InputOutputType 入力 パラメーターのタイプ。 IPD の SQL_DESC_PARAMETER_TYPE フィールドの値も、この引き数に設定されます。サポートされるタイプは次のとおりです。
  • SQL_PARAM_INPUT: パラメーター・マーカーは、ストアード・プロシージャー CALL でない SQL ステートメントに関連付けられるか、 CALL ストアード・プロシージャーの入力パラメーターにマークを付けます。

    ステートメントが実行されるとき、パラメーターの実際のデータ値がサーバーへ送信されます。 ParameterValuePtr バッファーは、有効な入力データ値を含んでいなければなりません。 StrLen_or_IndPtr バッファーは、対応する長さの値または SQL_NTS、SQL_NULL_DATA、もしくは (その値が SQLParamData() および SQLPutData() を介して送られる場合は) SQL_DATA_AT_EXEC を含んでいなければなりません。

  • SQL_PARAM_INPUT_OUTPUT: パラメーター・マーカーは、呼び出された (CALL された) ストアード・プロシージャー内の入出力パラメーターに関連付けられます。

    ステートメントが実行されるとき、パラメーターの実際のデータ値がサーバーへ送信されます。 ParameterValuePtr バッファーは、有効な入力データ値を含んでいなければなりません。 StrLen_or_IndPtr バッファーは、対応する長さの値または SQL_NTS、 SQL_NULL_DATA、もしくは (その値が SQLParamData() および SQLPutData() を介して送らされる場合は) SQL_DATA_AT_EXEC を含んでいなければなりません。

  • SQL_PARAM_OUTPUT: パラメーター・マーカーは、呼び出された (CALL された) ストアード・プロシージャー内の出力パラメーターまたはストアード・プロシージャーの戻り値に関連付けられます。

    ステートメントの実行後、出力パラメーターのデータは、 ParameterValuePtr および StrLen_or_IndPtr によって指定されるアプリケーション・バッファーに返されます。ただし、これは ParameterValuePtr および StrLen_or_IndPtr が NULL ポインターでない場合のことで、両者が NULL ポインターの場合は、出力データは廃棄されます。出力パラメーターが戻り値を持たない場合、 StrLen_or_IndPtr は SQL_NULL_DATA に設定されます。

SQLSMALLINT ValueType 入力 パラメーターの C データ・タイプ。以下のタイプがサポートされます。
  • SQL_C_BINARY
  • SQL_C_BIT
  • SQL_C_BLOB_LOCATOR
  • SQL_C_CHAR
  • SQL_C_CLOB_LOCATOR
  • SQL_C_DBCHAR
  • SQL_C_DBCLOB_LOCATOR
  • SQL_C_DOUBLE
  • SQL_C_FLOAT
  • SQL_C_LONG
  • SQL_C_NUMERIC a
  • SQL_C_SBIGINT
  • SQL_C_SHORT
  • SQL_C_TYPE_DATE
  • SQL_C_TYPE_TIME
  • SQL_C_TYPE_TIMESTAMP
  • SQL_C_TINYINT
  • SQL_C_UBIGINT

SQL_C_DEFAULT を指定すると、データが省略時の C データ・タイプから ParameterType で指定するタイプに転送されることになります。

  • a Windows 32 ビットのみ
SQLSMALLINT ParameterType 入力 パラメーターの SQL データ・タイプ。サポートされるタイプは次のとおりです。
  • SQL_BIGINT
  • SQL_BINARY
  • SQL_BLOB
  • SQL_BLOB_LOCATOR
  • SQL_CHAR
  • SQL_CLOB
  • SQL_CLOB_LOCATOR
  • SQL_DBCLOB
  • SQL_DBCLOB_LOCATOR
  • SQL_DECIMAL
  • SQL_DOUBLE
  • SQL_FLOAT
  • SQL_GRAPHIC
  • SQL_INTEGER
  • SQL_LONGVARBINARY
  • SQL_LONGVARCHAR
  • SQL_LONGVARGRAPHIC
  • SQL_NUMERIC
  • SQL_REAL
  • SQL_SMALLINT
  • SQL_TYPE_DATE
  • SQL_TYPE_TIME
  • SQL_TYPE_TIMESTAMP
  • SQL_VARBINARY
  • SQL_VARCHAR
  • SQL_VARGRAPHIC

注:SQL_BLOB_LOCATOR、SQL_CLOB_LOCATOR、SQL_DBCLOB_LOCATOR は、アプリケーション関連の概念であり、 CREATE TABLE ステートメント中に列定義するためのデータ・タイプにはマッピングしません。

SQLUINTEGER ColumnSize 入力 対応するパラメーター・マーカーの精度。 ParameterType が以下を表している場合、次のようになります。
  • 2 進または単一バイト文字ストリング (たとえば、SQL_CHAR、SQL_BLOB) を示している場合、これはこのパラメーター・マーカーの最大長 (バイト数) です。
  • 2 バイト文字 (たとえば、SQL_GRAPHIC) の場合、これはこのパラメーターに関する 2 バイト文字の最大長です。
  • SQL_DECIMAL、SQL_NUMERIC の場合、これは、最大の 10 進数の精度です。
  • それ以外の場合は、この引き数は無視されます。
列サイズが事前に分からない場合、アプリケーションはこの値を 0 に設定することができます。詳細については、『列サイズが事前に分からないとき』 を参照してください。
SQLSMALLINT DecimalDigits 入力 ParameterType が SQL_DECIMAL または SQL_NUMERIC である場合、相当するパラメーターの位取り。 ParameterType が SQL_TYPE_TIMESTAMP である場合は、これはタイム・スタンプの文字表示の小数点の右側の桁数です (たとえば、 yyyy-mm-dd hh:mm:ss.fff の位取りは 3 になります)。

上記以外の ParameterType 値の場合は、DecimalDigits は無視されます。

SQLPOINTER ParameterValuePtr 入力 (据え置き) または出力 (据え置き) (あるいはその両方)
  • 入力時 (InputOutputType は SQL_PARAM_INPUT、または SQL_PARAM_INPUT_OUTPUT に設定されます)

    実行時に、StrLen_or_IndPtr が SQL_NULL_DATA または SQL_DATA_AT_EXEC を含まない場合、ParameterValuePtr は、そのパラメーターの実際のデータがあるバッファーを指します。

    StrLen_or_IndPtr が SQL_DATA_AT_EXEC を含む場合は、 ParameterValuePtr は、このパラメーターに関連したアプリケーション定義の 32 ビット値です。この 32 ビット値は、以後の SQLParamData() 呼び出しによってアプリケーションに返されます。

    SQLParamOptions() が呼び出されて、パラメーターの複数の値を指定する場合、ParameterValuePtr は、 BufferLength バイトの入力バッファー配列を指すポインターになります。

  • 出力時 (InputOutputType は SQL_PARAM_OUTPUT、または SQL_PARAM_INPUT_OUTPUT に設定されます)

    ParameterValuePtr は、ストアード・プロシージャーの出力パラメーター値が保管されるバッファーを指します。

    InputOutputType を SQL_PARAM_OUTPUT に設定し、 ParameterValuePtrStrLen_or_IndPtr がともに NULL ポインターである場合、ストアード・プロシージャー呼び出しからの出力パラメーター値または戻り値は廃棄されます。


SQLINTEGER BufferLength 入力 文字データと 2 進データの場合、 BufferLength は、 ParameterValuePtr バッファーの長さを指定するか (そのバッファーが単一要素として扱われる場合)、または ParameterValuePtr 配列内の個々の要素の長さを指定します (アプリケーションが SQLParamOptions() を呼び出して各パラメーターに複数の値を指定する場合)。文字および 2 進以外のデータの場合、この引き数は無視されます。つまり、ParameterValuePtr のバッファーの長さ (単一要素である場合) または ParameterValuePtr 配列内の各要素の長さ (SQLParamOptions() を使用して各パラメーターに値の配列を指定する場合) は、 C データ・タイプに関連した長さであることが前提とされます。

出力パラメーターの場合、BufferLength を使用して、以下の方法で文字または 2 進出力データを切り捨てるかどうかを判別します。

  • 文字データの場合、戻りに使用できるバイト数が BufferLength 以上であれば、 ParameterValuePtr 内のデータは BufferLength-1 バイトに切り捨てられ、ヌル終了します (ヌル終了がオフになっていない場合)。
  • 2 進データの場合、戻りに使用できるバイト数が BufferLength より大きいと、 ParameterValuePtr 内のデータが BufferLength バイトに切り捨てられます。
SQLINTEGER * StrLen_or_IndPtr 入力 (据え置き) または出力 (据え置き) (あるいはその両方)

これが入力または入出力パラメーターである場合:

これは、 ParameterValuePtr に保管されているパラメーター・マーカー値の長さを (ステートメントの実行時に) 入れる場所を指すポインターです。

パラメーター・マーカーに NULL 値を指定するには、この記憶場所に SQL_NULL_DATA を入れる必要があります。

ValueType が SQL_C_CHAR である場合、この記憶場所には、 ParameterValuePtr に保管されているデータの正確な長さか、または ParameterValuePtr の内容がヌル終了の場合は SQL_NTS が入っていなければなりません。

ValueType が (明示的に、または SQL_C_DEFAULT を使用して暗黙的に) 文字データを示し、かつこのポインターが NULL に設定されている場合、アプリケーションが常に ParameterValuePtr にヌル終了のストリングを提供すると想定されています。また、このことは、このパラメーター・マーカーがヌル値ではありえないことをも暗黙指定しています。

ParameterType が図形データ・タイプを表し、かつ ValueType が SQL_C_CHAR である場合は、 StrLen_or_IndPtr を指すポインターは、NULL ではあり得ず、 StrLen_or_IndPtr の内容が SQL_NTS を保持することもあり得ません。一般に図形データ・タイプの場合、この長さは 2 バイト・データが占有するオクテットの数であり、したがってこの長さは常に 2 の倍数になります。実際に、長さが奇数である場合には、ステートメントを実行しようとするとエラーが発生します。

SQLExecute() または SQLExecDirect() が呼び出され、かつ StrLen_or_IndPtr が SQL_DATA_AT_EXEC の値を指していると、パラメーターの値は SQLPutData() によって送信されます。このパラメーターは、実行時データ・パラメーターと呼ばれます。

SQLINTEGER * StrLen_or_IndPtr (cont) 入力 (据え置き) または出力 (据え置き) (あるいはその両方)

SQLParamOptions() を使用して各パラメーターに複数の値を指定する場合、 StrLen_or_IndPtr は SQLINTEGER 値の配列 (各要素が対応する ParameterValuePtr 要素 (ヌル終了を除く) 内のバイト数となり得る)、または SQL_NULL_DATA を指します。

- これが出力パラメーターである (InputOutputType が SQL_PARAM_OUTPUT に設定されている) 場合:

これは、出力パラメーターまたはストアード・プロシージャー呼び出し (CALL) でなければならず、ストアード・プロシージャー実行後に以下のいずれかを指します。

  • ParameterValuePtr 内に返すために使用できるバイト数 (ヌル終了文字を除く)。
  • SQL_NULL_DATA
  • SQL_NO_TOTAL (返すために使用できるバイト数を判別できない場合)。

使用法

パラメーター・マーカーは "?" 文字で表され、アプリケーションに提供された値がステートメントの実行時に置き換えられるステートメント内の位置を指示するのに使用されます。この値は、次のものから得られます。

アプリケーションは、SQL ステートメントを実行する前に、その SQL ステートメント内の各パラメーター・マーカーに変数をバインドする必要があります。この関数の場合、 ParameterValuePtr および StrLen_or_IndPtr が据え置き引き数であり、ステートメント実行時には記憶場所が有効であり、かつ入力データ値が入っていなければなりません。このことは、 SQLExecDirect() または SQLExecute() 呼び出しが SQLBindParameter() 呼び出しと同じプロシージャー有効範囲に保持されているか、またはこれらの記憶場所が動的に割り振られているか静的またはグローバルに宣言されているかのいずれかです。

SQLBindParameter() (または SQLSetParam()) は、結果セットの列が知られている場合は、SQLPrepare() の前に呼び出すことができます。それ以外の場合は、ステートメントが作成された後で結果セットの属性を獲得できます。

パラメーター・マーカーは、番号 (ColumnNumber) で参照され、 1 から始まって、左から右へ、連続した番号が付けられます。

この関数によってバインドされるすべてのパラメーターは、以下のいずれかのときまで有効です。

SQL ステートメントを実行し、結果を処理した後、アプリケーションはステートメント・ハンドルを再利用して別の SQL ステートメントを実行したい場合があります。パラメーター・マーカーの仕様 (パラメーターの数、長さ、またはタイプ) が異なる場合、パラメーターのバインドをリセットまたはクリアするには、 SQL_RESET_PARAMS を指定して SQLFreeStmt() を呼び出す必要があります。

ValueType によって指定された C バッファー・データ・タイプは、 ParameterType によって指定される SQL データ・タイプと互換性がなければならず、そうでない場合はエラーが発生します。

アプリケーションは、パラメーターの値を、 ParameterValuePtr バッファーに入れて、または SQLPutData() への 1 つまたは複数の呼び出しによって、渡すことができます。呼び出しを用いた場合、パラメーターは実行時データ・パラメーターになります。アプリケーションは、SQL_DATA_AT_EXEC 値を StrLen_or_IndPtr バッファーに置くことによって、 DB2 CLI に実行時データ・パラメーターについて通知します。また、 ParameterValuePtr 入力引き数を 32 ビット値に設定して、次の SQLParamData() 呼び出しの際に返されるようにし、パラメーター位置を表すのに使用できるようにします。

ParameterValuePtrStrLen_or_IndPtr で参照される変数内のデータはステートメントを実行するまで検査されないため、データの内容または形式のエラーは SQLExecute() または SQLExecDirect() を呼び出すまで検出も報告もされません。

SQLBindParameter() は、以下のことを行う方法を提供することにより、実質的には SQLSetParam() 関数の機能を拡張したものとなっています。

InputOutputType 引き数は、パラメーターのタイプを指定します。プロシージャーを呼び出さない SQL ステートメント内のパラメーターは、すべて入力パラメーターです。ストアード・プロシージャー呼び出しのパラメーターは、入力、入出力、または出力パラメーターにすることができます。すべてのプロシージャー引き数が入出力であることを DB2 ストアード・プロシージャー引き数規則で一般に暗黙指定している場合でも、アプリケーション・プログラマーはこれまでどおり SQLBindParameter() に関する入力や出力の性質をさらに正確に指定して、さらに厳格なコーディング・スタイルに従うことができます。

文字データと 2 進 C データの場合、 BufferLength 引き数は ParameterValuePtr バッファーが単一要素である場合にそのバッファーの長さを指定します。一方、アプリケーションが SQLParamOptions() を呼び出して各パラメーターに複数値を指定する場合、 BufferLength は、ヌル終了を含む ParameterValuePtr 配列内の個々の 要素の長さになります。アプリケーションが複数値を指定する場合、 BufferLength を使用して ParameterValuePtr 配列内の値の位置を判別します。その他の C データ・タイプの場合はすべて、BufferLength 引き数は無視されます。

アプリケーションは、パラメーターの値を、 ParameterValuePtr バッファーに入れて、または SQLPutData() への 1 つまたは複数の呼び出しによって、渡すことができます。呼び出しを用いた場合、パラメーターは実行時データ・パラメーターになります。アプリケーションは、SQL_DATA_AT_EXEC 値を StrLen_or_IndPtr バッファーに置くことによって、 DB2 CLI に実行時データ・パラメーターについて通知します。また、ParameterValuePtr 入力引き数を 32 ビット値に設定して、次の SQLParamData() 呼び出しの際に返されるようにし、パラメーター位置を表すのに使用できるようにします。

SQLBindParameter() を使用してアプリケーション変数をストアード・プロシージャーの出力パラメーターにバインドする場合、 ParameterValuePtr バッファーが StrLen_or_IndPtr バッファーの後のメモリーに連続的に置かれると、 DB2 CLI ではある程度パフォーマンスを拡張できます。たとえば、

    struct {  SQLINTEGER  StrLen_or_IndPtr;
              SQLCHAR     ParameterValuePtr[MAX_BUFFER];
           } column;

パラメーターは、ファイルまたは記憶場所のいずれか一方にのみバインドすることができ、その両方にバインドすることはできません。最新のバインド・パラメーター関数呼び出しは、有効なバインドを判別します。

列サイズが事前に分からないとき

ターゲットの列または出力パラメーターの実サイズが分からない場合、アプリケーションは列の長さとして 0 を指定できます。 (ColumnSize を 0 に設定する)。

以前のリリースでは、 ColumnSize が 0 に設定されていると DB2 CLI は列のデータ・タイプに可能な最大サイズを使用しました。場合によっては、これにより不必要に大きなメモリー・ブロックが割り振られる結果となりました。バージョン 6 で、この動作は変更されました。

列のデータ・タイプが固定長の場合、 DB2 CLI ドライバーは長さをデータ・タイプそのものから判別します。しかし、データ・タイプが文字、2 進ストリング、またはラージ・オブジェクトである場合、 ColumnSize を 0 に設定すると別の意味を持ちます。

入力パラメーター
ColumnSize が 0 であると、 DB2 CLI は列またはストアード・プロシージャー・パラメーターのサイズとして、ステートメントの実行時に判別される入力値の実際のデータ長を使用します。 DB2 CLI はそのサイズを使用して必要な変換を実行します。

出力パラメーター (ストアード・プロシージャーのみ)
ColumnSize が 0 であると、 DB2 CLI はパラメーターのサイズとして BufferLength を使用します。つまり、ストアード・プロシージャーは BufferLength バイトを超えるデータを戻すことができないということです。それを超えるデータを戻した場合、打ち切り誤差が生じます。

入出力パラメーターの場合 (ストアード・プロシージャーのみ)
ColumnSize が 0 であると、 DB2 CLI は入力および出力の両方をターゲット・パラメーターとして BufferLength に設定します。つまり、入力データはストアード・プロシージャーに送られる前に必要であればその新しいサイズに変換されるということ、そして戻されるデータの最大サイズは BufferLength バイトであるということです。

ColumnSize を 0 に設定する必要がなければ、そうすることは勧められていません。それにより、DB2 CLI は実行時にデータの長さを不必要にチェックすることになるからです。

パラメーター・バインドの相対位置

パラメーター・バインドの変更の必要が生じた場合、アプリケーションはもう一度 SQLBindParameter() を呼び出すことができます。これにより、バインドされているパラメーターのバッファー・アドレスと、それに対応する使用中の長さ / 標識バッファー・アドレスを変更します。

SQLBindParameter() への複数の呼び出しの代わりに、 DB2 CLI はパラメーター・バインドの相対位置もサポートしています。毎回再バインドするよりも、相対位置を使用すると、 SQLExecute() または SQLExecDirect() への次の呼び出しで使用される新しいバッファー・アドレスおよび長さ / 標識アドレスを指定することができます。これは、列方向配列の挿入では使用できませんが、アプリケーションが個々にまたは配列を使用してパラメーターをバインドするかどうかを決めます。

相対位置を使用するのに必要なステップのリストについては、 パラメーター・バインドの相対位置を参照してください。

記述子

パラメーターのバインド方法は、APD および IPD のフィールドによって決定されます。 SQLBindParameter 内の引き数を使用して、その記述子フィールドを設定します。そのフィールドは、また、SQLSetDescField 関数によっても設定できます。 SQLBindParameter は、使用効率が良く、アプリケーションが SQLBindParameter を呼び出すのに記述子ハンドルを獲得する必要はありません。
注:1 つのステートメントについての SQLBindParameter() の呼び出しは、他のステートメントに影響することがあり得ます。それが生じるのは、ステートメントに関連した ARD が明示的に割り当てられ、それらが他のステートメントにも関連しているような場合です。 SQLBindParameter() は APD のフィールドを修正するため、この記述子が関連付けられているすべてのステートメントにその修正が適用されます。これが必須の動作でない場合、アプリケーションは、 SQLBindParameter() を呼び出す前に、その他のステートメントとの記述子の関連付けを解除する必要があります。

概念的には、SQLBindParameter() は、以下のステップを順次実行します。

  1. SQLGetStmtAttr() を呼び出して、APD ハンドルを獲得します。
  2. SQLGetDescField() を呼び出して、 APD の SQL_DESC_COUNT フィールドを獲得します。 ColumnNumber 引き数の値が SQL_DESC_COUNT の値を超える場合は、 SQLSetDescField() を呼び出して、 SQL_DESC_COUNT の値を ColumnNumber に増やします。
  3. SQLSetDescField() を複数回呼び出して、値を APD の以下のフィールドに割り当てます。

    StrLen_or_Ind パラメーターは、標識情報およびパラメーター値の長さの両方を指定します。

  4. SQLGetStmtAttr() を呼び出して、IPD ハンドルを獲得します。
  5. SQLGetDescField() を呼び出して、IPD の SQL_DESC_COUNT フィールドを獲得します。 ColumnNumber 引き数の値が SQL_DESC_COUNT の値を超える場合は、 SQLSetDescField フィールドを呼び出して SQL_DESC_COUNT の値を ColumnNumber に増やします。
  6. SQLSetDescField() を複数回呼び出して、IPD の以下のフィールドに値を割り当てます。

SQLBindParameter() への呼び出しが失敗したときは、それが APD に設定するはずの記述子の内容フィールドは未定義で、 APD の SQL_DESC_COUNT フィールドは変更されません。さらに、IPD 内の適当なレコードの SQL_DESC_LENGTH、SQL_DESC_PRECISION、SQL_DESC_SCALE、および SQL_DESC_TYPE フィールドは未定義で、 IPD の SQL_DESC_COUNT フィールドは変更されません。

戻りコード

診断


表 22. SQLBindParameter SQLSTATE
SQLSTATE 説明 解説
07006 変換が無効です。 ValueType 引き数によって識別されるデータ値から ParameterType 引き数によって識別されるデータ・タイプへの変換は、意味のある変換ではありません。 (たとえば、SQL_C_DATE から SQL_DOUBLE への変換は無意味です。)
40003 08S01 通信リンクに障害が起きました。 アプリケーションとデータ・ソースとの間の通信リンクが、関数の完了する前に失敗しました。
58004 予期しないシステム障害です。 回復不能システム・エラー。
HY001 メモリーの割り振り失敗です。 DB2 CLI は、関数の実行または完了をサポートするのに必要なメモリーを割り振ることができません。
HY003 プログラム・タイプが範囲外です。 引き数 ParameterNumber で指定された値が、有効なデータ・タイプまたは SQL_C_DEFAULT ではありません。
HY004 SQL のデータ・タイプが範囲外です。 引き数 ParameterType に指定された値が、有効な SQL データ・タイプではありません。
HY009 引き数値が無効です。 引き数 ParameterValuePtr は NULL ポインターで、引き数 StrLen_or_IndPtr は NULL ポインターであり、 InputOutputType は SQL_PARAM_OUTPUT ではありません。
HY010 関数の順序エラーです。 SQLExecute() または SQLExecDirect() が SQL_NEED_DATA を返した後に関数が呼び出されましたが、すべての実行時データ・パラメーターに関するデータは送られませんでした。
HY013 予期しないメモリーのハンドル・エラーが起きました。 DB2 CLI は、関数の実行または完了をサポートするのに必要なメモリーを使用することができませんでした。
HY021 不整合な記述子情報 整合性検査時に検査された記述子情報は、整合性がとれていませんでした。
HY090 ストリングまたはバッファー長が無効です。 引き数 BufferLength に指定された値は、0 より小さい値でした。
HY093 パラメーターの数値が無効です。 引き数 ValueType に指定された値が、1 より小さいか、サーバーでサポートされる最大数より大きい値でした。
HY094 位取り値が無効です。 ParameterType に指定された値が SQL_DECIMAL または SQL_NUMERIC であり、 DecimalDigits に指定された値が 0 より小さいかまたは引き数 ParamDef (精度) の値より大きい値でした。

ParameterType に指定された値が SQL_C_TIMESTAMP で、 ParameterType に指定された値が SQL_CHAR または SQL_VARCHAR のどちらかであり、 DecimalDigits に指定された値が 0 より小さいかまたは 6 より大きい値でした。

HY104 精度値が無効です。 ParameterType に指定された値が SQL_DECIMAL または SQL_NUMERIC のどちらかで、 ParamDef に指定された値が 1 より小さい値でした。
HY105 パラメーター・タイプが無効です。 InputOutputType が SQL_PARAM_INPUT、SQL_PARAM_OUTPUT、または SQL_PARAM_INPUT_OUTPUT のいずれでもありません。
HYC00 ドライバーが機能していません。 DB2 CLI またはデータ・ソースが、引き数 ValueType に指定された値と引き数 ParameterType に指定された値との組み合わせによって指定された変換をサポートしません。

引き数 ParameterType に指定された値が、 DB2 CLI またはデータ・ソースのどちらかでサポートされていません。

制約

DB2 CLI v5 と ODBC 2.0 では、この関数は SQLSetParam() に代わるものとして用いられます。

StrLen_or_IndPtr の新しい値 SQL_DEFAULT_PARAM が ODBC 2.0 に導入され、プロシージャーで使用する値を、アプリケーションから送信された値ではなく、パラメーターの省略時値にするように指定できるようになりました。 DB2 ストアード・プロシージャーの引き数には省略時値の概念がないため、StrLen_or_IndPtr 引き数にこの値を指定すると、 SQL_DEFAULT_PARAM 値は無効な長さとみなされ、 CALL ステートメントを実行したときにエラーになります。

また、ODBC 2.0 には、StrLen_or_IndPtr 引き数を指定して使用する SQL_LEN_DATA_AT_EXEC (length) マクロも導入されました。このマクロは、後続の SQLPutData() 呼び出しを経由して文字または C データ用に送信されるデータ全体の長さの合計を指定するために使用されます。 DB2 ODBC ドライバーではこの情報の必要がないため、このマクロは必要ありません。 ODBC アプリケーションは、 SQLGetInfo() に SQL_NEED_LONG_DATA_LEN オプションを指定して、ドライバーがこの情報を必要とするかどうかを調べます。 DB2 ODBC ドライバーは、この情報が SQLPutData() に必要ないことを示す場合、'N' を戻します。

CLI サンプル tbread.c

以下に、さまざまなデータ・タイプをバインドして、一組のパラメーターに結合する例を示します。追加の例については、ストアード・プロシージャーの例を参照してください。

(ここで完全サンプル tbread.c を使用することもできます 。)

/* From the CLI sample TBREAD.C */
/* ... */
    /* bind divisionParam to the statement */
    printf("    Bind divisionParam to the statement\n");
    printf("        %s\n", stmt);
    sqlrc = SQLBindParameter(hstmt, 1, SQL_PARAM_INPUT, SQL_C_CHAR,
                             SQL_CHAR, 15, 0, divisionParam, 15, NULL);
 
 

参照


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