规范: | 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() 删除该语句之前,语句属性保持有效。调用 SQLFreeStmt() 时,如果指定了 SQL_CLOSE、SQL_UNBIND 或 SQL_RESET_PARAMS 选项,则不会将语句属性复位。
如果数据源不支持 ValuePtr 中指定的值,则某些语句属性支持类似值的替换。在这样的情况下,DB2 CLI 返回 SQL_SUCCESS_WITH_INFO 和 SQLSTATE 01S02(选项值已更改)。例如,如果 Attribute 是 SQL_ATTR_CONCURRENCY,ValuePtr 是 SQL_CONCUR_ROWVER,而数据源不支持这一点,则 DB2 CLI 替换 SQL_CONCUR_VALUES 并返回 SQL_SUCCESS_WITH_INFO。要确定替换的值,应用程序调用 SQLGetStmtAttr()。用 ValuePtr 设置的信息格式取决于指定的 Attribute。
SQLSetStmtAttr() 接受两种不同格式之一的属性信息: null 终止的字符串或 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。
通过查询表的 $dirty 列能够获得脏位的值。例如,以下语句返回脏位和电话簿表的 NAME 列:
SELECT $dirty, NAME from PHONEBOOK
脏位可以有以下值。
描述 |
脏位值
|
---|---|
未更改记录 (CLEAN) | 0 |
已删除记录 (DELETE) | 1 |
已插入记录 (INSERT) | 2 |
已更新记录 (UPDATE) | 3 |
语句属性
当前定义的属性显示如下。
语句句柄上不需要可滚动游标。 如果应用程序在此句柄上调用 SQLFetchScroll(),则 FetchOrientation() 的唯一有效值是 SQL_FETCH_NEXT。 这是缺省值。
该语句句柄上需要可滚动游标。当调用 SQLFetchScroll() 时,应用程序可以指定 FetchOrientation 的任何有效值,以便可以以除顺序方式以外的方式定位游标。
其它游标的写活动对当前游标具有未定义的影响。这是缺省值。
其它游标的写活动对当前游标没有影响。
不能对打开的游标指定此选项。
这是系统缺省值。在执行删除 SQL 语句时,记录仅被标记为“删除”。如果设置了 SQL_READ_INCLUDE_MARKED_DELETE,则该记录的内容仍然可读。
删除 SQL 语句会上物理上除去满足 WHERE 子句条件的记录,而不管其脏位如何。
例如,使用以下语法物理除去某些记录,而忽略其脏位的状态:
SQLSetStmtAttr (stmt, SQL_ATTR_DELETE_MODE, SQL_DELETE_PHYSICAL_REMOVE, 0)
然后执行以下 SQL 语句以从表 T 中删除 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。
这是系统缺省值。其脏位被设置为“删除”的所有记录将不为 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 | 字符串或缓冲区长度无效。 | 其中一个名称长度自变量的值小于 0,但不等于 SQL_NTS。 |
限制
无。
相关参考