SQLFetchScroll - 取装行集并返回所有已绑定列的数据

用途

规范: DB2 CLI 5.0 ODBC 3.0

SQLFetchScroll() 从结果集取装指定的数据行集,并返回所有已绑定列的数据。可以使用绝对位置或相对位置指定行集。

语法

SQLRETURN   SQLFetchScroll  (
                SQLHSTMT             StatementHandle,
                  SQLSMALLINT       FetchOrientation,
                  SQLINTEGER        FetchOffset);
 

函数自变量

表 50. SQLFetchScroll 自变量

数据类型 自变量 使用 描述
SQLHSTMT StatementHandle 输入 语句句柄
SQLSMALLINT FetchOrientation 输入 取装类型:
  • SQL_FETCH_NEXT
  • SQL_FETCH_PRIOR
  • SQL_FETCH_FIRST
  • SQL_FETCH_LAST
  • SQL_FETCH_ABSOLUTE
  • SQL_FETCH_RELATIVE
SQLINTEGER FetchOffset 输入 要取装的行数。此自变量的解释取决于 FetchOrientation 自变量的值。

用法

SQLFetchScroll() 从结果集返回指定的行集。可用绝对位置或相对位置指定行集。仅当结果集存在时,才能调用 SQLFetchScroll() - 即, 在创建结果集的调用之后,而在该结果集上的游标关闭之前,才能调用。如果绑定了任何列,则返回这些列中的数据。如果应用程序指定了指向行状态数组或要在其中返回所取装行数的缓冲区的指针,则 SQLFetchScroll() 还返回此信息。对 SQLFetchScroll() 调用可以与对 SQLFetch() 调用混合在一起。

定位游标

当创建结果集时,游标定位在结果集开头的前面。SQLFetchScroll() 根据 FetchOrientationFetchOffset 自变量的值定位块游标,如以下列表所示。确定新行集开头的精确规则在下一节中说明。

FetchOrientation
含义

SQL_FETCH_NEXT
返回下一行集。这与调用 SQLFetch() 等效。SQLFetchScroll() 忽略 FetchOffset 的值。

SQL_FETCH_PRIOR
返回前一行集。SQLFetchScroll() 忽略 FetchOffset 的值。

SQL_FETCH_RELATIVE
返回自当前行集起始位置开始的行集 FetchOffset

SQL_FETCH_ABSOLUTE
返回从行 FetchOffset 开始的行集。

SQL_FETCH_FIRST
返回结果集中的第一个行集。SQLFetchScroll() 忽略 FetchOffset 的值。

SQL_FETCH_LAST
返回结果集中的最后一个完整行集。SQLFetchScroll() 忽略 FetchOffset 的值。

SQL_ATTR_ROW_ARRAY_SIZE 语句属性指定行集中的行数。如果 SQLFetchScroll() 取装的行集与结果集的末尾重叠,则 SQLFetchScroll() 返回部分行集。也就是说,如果 S + R - 1 大于 L,其中 S 是正在取装的行集的起始行,R 是行集大小,而 L 是结果集中的最后一行,则只有行集的前 L - S + 1 行有效。其余各行是空的,状态为 SQL_ROW_NOROW。

SQLFetchScroll() 返回后,行集游标定位在结果集的第一行。

游标定位规则

下列各节描述 FetchOrientation 的每个值的精确规则。这些规则使用下列表示法:

在起始点之前
块游标定位在结果集起始点前面。如果新行集的第一行在结果集的起始点之前,则 SQLFetchScroll() 返回 SQL_NO_DATA。

在末尾之后
块游标定位在结果集末尾之后。如果新行集的第一行在结果集的末尾之后,则 SQLFetchScroll() 返回 SQL_NO_DATA。

CurrRowsetStart
这是当前行集中第一行的编号。

LastResultRow
这是结果集中最后一行的编号。

RowsetSize
这是行集大小。

FetchOffset
这是 FetchOffset 自变量的值。

SQL_FETCH_NEXT 规则


表 51. SQL_FETCH_NEXT 规则:

条件 新行集的第一行
Before start 1
CurrRowsetStart + RowsetSize <= LastResultRow CurrRowsetStart + RowsetSize
CurrRowsetStart + RowsetSize > LastResultRow 在末尾之后
After end 在末尾之后

SQL_FETCH_PRIOR 规则


表 52. SQL_FETCH_PRIOR 规则:

条件 新行集的第一行
Before start 在起始点之前
CurrRowsetStart = 1 在起始点之前
1 < CurrRowsetStart <= RowsetSize 1a
CurrRowsetStart > RowsetSize CurrRowsetStart - RowsetSize
After end AND LastResultRow < RowsetSize 1a
After end AND LastResultRow >= RowsetSize LastResult - RowRowsetSize + 1

a
SQLFetchScroll() 返回 SQLSTATE 01S06 (试图在结果集返回第一个行集之前进行取装)和 SQL_SUCCESS_WITH_INFO。

SQL_FETCH_RELATIVE 规则


表 53. SQL_FETCH_RELATIVE 规则:

条件 新行集的第一行
(Before start AND FetchOffset > 0) OR (After end AND FetchOffset < 0) --a
Before start AND FetchOffset <= 0 在起始点之前
CurrRowsetStart = 1 AND FetchOffset < 0 在起始点之前
CurrRowsetStart > 1 AND CurrRowsetStart + FetchOffset < 1 AND |FetchOffset| > RowsetSize 在起始点之前
CurrRowsetStart > 1 AND CurrRowsetStart + FetchOffset < 1 AND |FetchOffset| <= RowsetSize 1b
1 <= CurrRowsetStart + FetchOffset <= LastResultRow CurrRowsetStart + FetchOffset
CurrRowsetStart + FetchOffset > LastResultRow 在末尾之后
After end AND FetchOffset >= 0 在末尾之后

a
SQLFetchScroll() 返回的结果集与调用它时将 FetchOrientation 设置为 SQL_FETCH_ABSOLUTE 时返回的行集相同。有关更多信息,请参阅『SQL_FETCH_ABSOLUTE』一节。

b
SQLFetchScroll() 返回 SQLSTATE 01S06 (试图在结果集返回第一个行集之前进行取装。)和 SQL_SUCCESS_WITH_INFO。

SQL_FETCH_ABSOLUTE 规则


表 54. SQL_FETCH_ABSOLUTE 规则:

条件 新行集的第一行
FetchOffset < 0 AND |FetchOffset| <= LastResultRow LastResultRow + FetchOffset + 1
FetchOffset < 0 AND |FetchOffset| > LastResultRow AND |FetchOffset| > RowsetSize 在起始点之前
FetchOffset < 0 AND |FetchOffset| > LastResultRow AND |FetchOffset| <= RowsetSize 1a
FetchOffset = 0 在起始点之前
1 <= FetchOffset <= LastResultRow FetchOffset
FetchOffset > LastResultRow 在末尾之后

a
SQLFetchScroll() 返回 SQLSTATE 01S06 (试图在结果集返回第一个行集之前进行取装。)和 SQL_SUCCESS_WITH_INFO。

SQL_FETCH_FIRST 规则


表 55. SQL_FETCH_FIRST 规则:

条件 新行集的第一行
任何 1

SQL_FETCH_LAST 规则


表 56. SQL_FETCH_LAST 规则:

条件 新行集的第一行
RowsetSize <= LastResultRow LastResultRow - RowsetSize + 1
RowsetSize > LastResultRow 1

返回绑定列中的数据

SQLFetchScroll() 返回绑定列中数据的方式与 SQLFetch() 相同。有关更多信息,请参阅SQLFetch - 取装下一行

如果未绑定任何列,则 SQLFetchScroll() 不返回数据,但将块游标移至指定的位置。对于 SQLFetch(),在这种情况下可以使用 SQLGetData() 来检索信息。

缓冲区地址

SQLFetchScroll() 使用 SQLFetch() 所使用的公式来确定数据的地址和长度/指示符缓冲区。有关更多信息,请参阅SQLBindCol - 将列绑定至应用程序变量

行状态数组

行状态数组用来返回行集中每一行的状态。此数组的地址使用 SQL_ATTR_ROW_STATUS_PTR 语句属性指定。此数组由应用程序分配,且必须具有 SQL_ATTR_ROW_ARRAY_SIZE 语句属性所指定的元素数目。它的值由 SQLFetch()SQLFetchScroll() 设置。如果 SQL_ATTR_ROW_STATUS_PTR 语句属性的值是空指针,则这些函数不返回行状态。

如果 SQLFetch()SQLFetchScroll() 未返回 SQL_SUCCESS 或 SQL_SUCCESS_WITH_INFO,则行状态数组缓冲区的内容未定义。

下列值在行状态数组中返回。

行状态数组值
描述

SQL_ROW_SUCCESS
成功取装了行。

SQL_ROW_SUCCESS_WITH_INFO
成功取装了行。但是返回了关于该行的警告。

SQL_ROW_ERROR
取装行时出错。

SQL_ROW_NOROW
行集与结果集的末尾重叠,未返回与行状态数组的此元素对应的行。

“取装的行”缓冲区

“取装的行”缓冲区用来返回取装的行数,包括那些因为在取装行时出错而未返回数据的行。这是在行状态数组中其值不是 SQL_ROW_NOROW 的那些行的数目。此缓冲区的地址使用 SQL_ATTR_ROWS_FETCHED_PTR 语句属性指定。此缓冲区由应用程序分配。它由 SQLFetch()SQLFetchScroll() 设置。如果 SQL_ATTR_ROWS_FETCHED_PTR 语句属性的值是空指针,则这些函数不返回取装的行数。要确定结果集中的当前行数,应用程序可以调用 SQLGetStmtAttr(),并指定 SQL_ATTR_ROW_NUMBER 属性。

如果 SQLFetch()SQLFetchScroll() 未返回 SQL_SUCCESS 或 SQL_SUCCESS_WITH_INFO,则“取装的行”缓冲区的内容未定义,返回 SQL_NO_DATA 时是一个例外,在这种情况下,“取装的行”缓冲区中的值设置为 0。

返回码

诊断

表 57. SQLFetchScroll SQLSTATE

SQLSTATE 描述 解释
01000 警告 参考消息。(函数返回 SQL_SUCCESS_WITH_INFO。)
01004 数据被截断。 对一个或多个列返回的数据被截断。字符串值或数值在右端被截断。(如果不出错,则返回 SQL_SUCCESS_WITH_INFO。)
01S06 试图在结果集返回第一个行集之前进行取装。 在当前位置在第一行之外,且 FetchOrientation 是 SQL_PRIOR,或 FetchOrientation 是 SQL_RELATIVE,而 FetchOffset 是负数时(其绝对值小于或等于当前 SQL_ATTR_ROW_ARRAY_SIZE),则请求的行集与结果集的起始点重叠。(函数返回 SQL_SUCCESS_WITH_INFO。)
07006 转换无效。 未能将数据值以有意义的方式转换为 SQLBindCol() 中的 fCType 所指定的数据类型。
22002 指定的输出或指示符缓冲区无效。 SQLBindCol()pcbValue 自变量指定的指针值是空指针,且相应列的值为空。报告 SQL_NULL_DATA 是没有意义的。
22003 数值超出范围。 对一个或多个绑定列返回数字值 (作为数字或字符串)会导致数字的整个部分(并非分数部分)被截断。
24000 游标状态无效。 StatementHandle 处于已执行状态,但没有任何结果集与 StatementHandle 相关联。
HY000 一般错误。 出错,该错误没有特定的 SQLSTATE。*MessageText 缓冲区中由 SQLGetDiagRec() 返回的错误消息描述该错误及其原因。
HY001 内存分配失败。 DB2 CLI 无法分配支持函数的执行或完成所需的内存。
HY010 函数顺序错误。 在对 StatementHandle 调用 SQLPrepare()SQLExecDirect() 之前调用了该函数。
HY106 取装类型超出范围。 对自变量 FetchOrientation 指定的值无效。

SQL_CURSOR_TYPE 语句属性的值是 SQL_CURSOR_FORWARD_ONLY,而 FetchOrientation 自变量的值不是 SQL_FETCH_NEXT。

HY107 行值超出范围。 用 SQL_ATTR_CURSOR_TYPE 语句属性指定的值是 SQL_CURSOR_KEYSET_DRIVEN,但用 SQL_ATTR_KEYSET_SIZE 语句属性指定的值大于 0 且小于用 SQL_ATTR_ROW_ARRAY_SIZE 语句属性指定的值。

限制

无。

相关参考