仕様: | DB2 CLI 2.1 | ODBC 1.0 | ISO CLI |
SQLSetStmtAttr() はステートメントに関するオプションを設定します。
構文
SQLRETURN SQLSetStmtAttr (SQLHSTMT StatementHandle, SQLINTEGER Attribute, SQLPOINTER ValuePtr, SQLINTEGER StringLength);
関数の引き数
データ・タイプ | 引き数 | 用途 | 説明 |
---|---|---|---|
SQLHSTMT | StatementHandle | 入力 | ステートメント・ハンドル。 |
SQLINTEGER | Attribute | 入力 | セットするオプション。 |
SQLPOINTER | ValuePtr | 入力 | Attribute が ODBC 定義の属性であり、ValuePtr が文字ストリングまたは
バイナリー・バッファーを指している場合は、この引き数は、*ValuePtr の長さでなければならない。
Attribute が ODBC 定義の属性であり、ValuePtr が
整数であれば、StringLength は無視される。
Attribute が DB2 CLI 属性であれば、アプリケーションは属性の性質を StringLength 引き数を設定することによって示す。 StringLength には、以下の値を設定可能。
|
SQLINTEGER | StringLength | 入力 | ValuePtr が文字ストリングまたはバイナリー・バッファーを指している場合は、 この引き数は ValuePtr の長さでなければならない。 ValuePtr がポインターであるがストリングまたはバイナリー・バッファーを 指していない場合は、StringLength の値は SQL_IS_POINTER でなければならない。 ValuePtr がポインターでない場合は、 StringLength の値は SQL_IS_NOT_POINTER でなければならない。 |
使用法
ステートメントのステートメント属性は、別の SQLSetStmtAttr() 呼び出しで 変更されるか、SQLFreeHandle() の呼び出しでそのステートメントが 除去されるまでは有効です。SQL_CLOSE、SQL_UNBIND、 または SQL_RESET_PARAMS オプションを指定して SQLFreeStmt() を 呼び出しても、ステートメント属性はリセットされません。
ステートメント属性によっては、データ・ソースが ValuePtr で指定されている 値をサポートしない場合、似たような値での置き換えをサポートするものがあります。 そのような場合、 DB2 CLI は SQL_SUCCESS_WITH_INFO および SQLSTATE 01S02 (オプション値が変更された) を戻します。 例えば、属性が SQL_ATTR_CONCURRENCY で、 ValuePtr が SQL_CONCUR_ROWVER であり、データ・ソースがそれをサポート しない場合、DB2 CLI は SQL_CONCUR_VALUES を置き換えて SQL_SUCCESS_WITH_INFO を戻します。 置き換えられた値を判別するには、 アプリケーションで SQLGetStmtAttr() を呼び出します。 ValuePtr に設定する情報の形式は、指定された属性によって変わります。
SQLSetStmtAttr() は、属性情報を次の 2 つ (ヌル終了文字ストリング または 32 ビット整数値) の形式のいずれかで受け入れます。それぞれの形式は、属性の説明のところで述べられています。 この形式は、SQLGetStmtAttr() でそれぞれの属性ごとに戻される情報に適用されます。 SQLSetStmtAttr() の ValuePtr 引き数が指す文字ストリングの 長さは StringLength です。
DB2 Everyplace はダーティー・ビットを使用してレコードに対して行われた変更を追跡します。
ダーティー・ビットの動作は SQL_ATTR_DELETE_MODE、
SQL_ATTR_READ_MODE、SQL_ATTR_DIRTYBIT_SET_MODE ステートメント属性の影響を受けます。
次の表は、あるレコードに対して特定のデータベース操作が行われた後の
ダーティー・ビットの状態を示しています。この表では、SQL_ATTR_DIRTYBIT_SET_MODE パラメーターが、
システムによって保守されるダーティー・ビットを持つ SQL_DIRTYBIT_SET_BY_SYSTEM に設定されていると想定しています。
表 83. DB2 Everyplace ダーティー・ビットの状態
ダーティー・ビットの値は、表の $dirty 列を照会して入手します。例えば、以下のステートメントは ダーティー・ビットと PHONEBOOK 表の NAME 列を戻します。
SELECT $dirty, NAME from PHONEBOOK
ダーティー・ビットの 値は以下のようになります。
表 84. DB2 Everyplace ダーティー・ビット値
説明 |
ダーティー・ビット値
|
---|---|
未変更レコード (CLEAN) | 0 |
削除済みレコード (DELETE) | 1 |
挿入済みレコード (INSERT) | 2 |
更新済みレコード (UPDATE) | 3 |
ステートメント属性
現在定義されている属性は以下のとおりです。
ステートメント・ハンドルは両方向スクロール・カーソルを必要としません。 アプリケーションがこのハンドルで SQLFetchScroll() を呼び出した場合、 FetchOrientation() の唯一の有効な値は SQL_FETCH_NEXT です。 これはデフォルトです。
ステートメント・ハンドルは両方向スクロール・カーソルを必要とします。 SQLFetchScroll() を呼び出す場合、カーソルを順次モード以外のモードで配置すること ができるように、アプリケーションは FetchOrientation の有効な値を指定します。
他のカーソルの書き込みアクティビティーにより、現行のカーソルが未定義の影響を受けます。 これはデフォルトです。
他のカーソルの書き込みアクティビティーによる、現行のカーソルへの影響はありません。
このオプションをオープン・カーソルに指定することはできません。
これはシステム・デフォルトです。削除 SQL ステートメントが実行されると、 レコードは「delete」とだけマークされます。そのレコード内容は 、SQL_READ_INCLUDE_MARKED_DELETE が設定されている場合、引き続き読み取ることができます。
SQL の DELETE ステートメントは、レコードのダーティー・ビットとは無関係に、WHERE 文節の条件を満たすレコードを物理的に削除します。
例えば、ダーティー・ビットの状況を無視してレコードを物理的に除去するには、 以下の構文を使用します。
SQLSetStmtAttr (stmt, SQL_ATTR_DELETE_MODE, SQL_DELETE_PHYSICAL_REMOVE, 0)
次に、以下の SQL ステートメントを実行して、X が 0 に等しくないすべてのレコードを表から削除します。
DELETE T WHERE X<>0
これはシステム・デフォルトです。挿入、更新、または削除されたレコードは、 それぞれ、INSERT、UPDATE、または DELETE に設定されたダーティー・ビットを持ちます。 SQL_DIRTYBIT_SET_BY_SYSTEM が設定されている場合、 $dirty 列の UPDATE は許可されていません。
レコードの挿入、更新、または削除の際のダーティー・ビットの設定は、アプリケーションが行います。 各操作の意味は以下のとおりです。
UPDATE T SET $dirty=0 WHERE $dirty>0
例えば、レコードのダーティー・ビットをクリーンにするには、以下のステートメントを使用します。
SQLSetStmtAttr (stmt, SQL_ATTR_DIRTYBIT_SET_MODE, SQL_DIRTYBIT_SET_BY_APPLICATION, 0)
次に、以下の SQL ステートメントを実行します。
UPDATE T SET $DIRTY=0 WHERE $DIRTY>0
一般的に、エンド・ユーザーによるデータベース更新のトラッキングにダーティー・ビットが必要とされないときは、アプリケーションで SQL_DIRTYBIT_SET_BY_APPLICATION を設定できます。
これはシステム・デフォルトです。ダーティー・ビットが「delete」に設定されている すべてのレコードが SQL から隠されます。
これを設定すると、ダーティー・ビットが DELETE に設定されたレコードが、SQL の SELECT ステートメントから可視の状態になります。 アプリケーションは、レコードのダーティー・ビットを調べることによって、 アプリケーションの削除済みレコードとその他のレコードを区別することができます。
例えば、ダーティー・ビットが DELETE とマークされたレコードを含め、 ダーティー・ビットが設定されているすべてのレコードを読み取るには、 以下のステートメントを使用します。
SQLSetStmtAttr (stmt, SQL_ATTR_READ_MODE, SQL_READ_INCLUDE_MARKED_DELETE, 0)
次に、以下の SQL ステートメントを実行して、すべてのレコードを検索します。
SELECT * FROM T WHERE $dirty<>0
このオプションをオープン・カーソルに指定することはできません。
戻りコード
診断
SQLSTATE | 説明 | 解説 |
---|---|---|
24000 | カーソル状態が無効。 | カーソルがすでにこのステートメント・ハンドルでオープンされている。 |
HY001 | メモリーの割り振りの失敗。 | DB2 CLI が、関数の実行または完了のサポートに必要なメモリーを 割り当てることができない。 |
HY010 | 関数のシーケンス・エラー。 | 実行時データ (SQLPrepare() または SQLExecDirect()) の操作中に、
関数が呼び出された。
BEGIN COMPOUND および END COMPOUND SQL 操作中に、関数が呼び出された。 |
HY014 | ハンドル数の限界に到達済み。 | 内部リソースが原因で、DB2 CLI がハンドルを割り当てることができない。 |
HY090 | 無効なストリング長またはバッファー長。 | 名前の長さ引き数のいずれかの値が、ゼロより小であるが、SQL_NTS と等しくない。 |
制約事項
なし。
関連した解説