SQLFetch-访存下一行
SQLFetch() 将光标前进到结果集的下一行,并检索任何绑定的列。
SQLFetch() 可用于将数据直接接收到您使用 SQLBindCol()指定的变量中,或者可以通过调用 SQLGetData()在访存后单独接收列。 如果在绑定列时指示了转换,那么在调用 SQLFetch() 时也会执行数据转换。
语法
SQLRETURN SQLFetch (SQLHSTMT hstmt); 函数自变量
| 数据类型 | 自变量/参数 | 使用 | 描述 |
|---|---|---|---|
| SQLHSTMT | hstmt | 输入 | 语句句柄 |
用法
仅当 hstmt 上最近处理的语句是 SELECT 时,才能调用 SQLFetch() 。
与 SQLBindCol() 绑定的应用程序变量数不得超过结果集中的列数; 否则 SQLFetch() 将失败。
如果尚未调用 SQLBindCol() 来绑定任何列,那么 SQLFetch() 不会将数据返回到应用程序,而只是将光标前进。 在这种情况下,可以单独调用 SQLGetData() 以获取所有列。 当 SQLFetch() 将光标前进到下一行时,将废弃未绑定列中的数据。
如果任何绑定变量的大小不足以保存 SQLFetch()返回的数据,那么数据将被截断。 如果字符数据被截断,并且 SQLSetEnvAttr() 属性 SQL_ATTR_TRUNCATION_RTNC 设置为 SQL_TRUE,则 CLI 返回代码 SQL_SUCCESS_WITH_INFO,同时返回表示截断的 SQLSTATE。 请注意,对于 SQL_ATTR_TRUNCATION_RTNC ,缺省值为 SQL_FALSE。 此外,在字符数据截断的情况下, SQLBindCol() deferred output 自变量 pcbValue 包含从 数据源检索的列数据的实际长度。 应用程序应比较输出长度和输入长度(SQLBindCol() 中的 pcbValue 和 cbValueMax 参数),以确定哪些字符列被截断。
如果截断涉及小数点右边的数字,那么不会报告数字数据类型的截断。 如果小数点左侧发生截断,那么将返回错误 (请参阅诊断部分)。
图形数据类型的截断与字符数据类型相同。 rgbValue缓冲区将被填充到小于或等于 SQLBindCol() 中指定的 cbValueMax的最接近的两个字节的倍数。 Db2 for i CLI 和应用程序之间传输的图形数据永远不会以空值结束。
从结果集中检索到所有行时,或者不需要其余行时,应调用 SQLFreeStmt() 以关闭游标并废弃其余数据和关联资源。
返回码
- SQL_SUCCESS
- sql_success_with_info
- SQL_ERROR
- sql_invalid_handle
- sql_noo_data_found
如果结果集中没有任何行,或者先前的 SQLFetch() 调用已访存结果集中的所有行,那么将返回 SQL_NO_DATA_FOUND。
诊断
| SQLSTATE | 描述 | 说明 |
|---|---|---|
| 01004 | 数据已截断 | 针对一个或多个列返回的数据将被截断。 字符串值向右截断。 (如果未发生错误,那么将返回 SQL_SUCCESS_WITH_INFO。) |
| HY001 | 内存分配失败 | 驱动程序无法分配支持功能处理或完成所需的内存。 |
| HY010 | 函数顺序错误 | 指定的 hstmt 未处于已处理状态。 在不首先调用 SQLExecute 或 SQLExecDirect的情况下调用该函数。 |
| HY013 * | 内存管理问题 | 驱动程序无法访问支持处理或完成功能所需的内存。 |
| HY021 | 内部描述符无效 | 无法寻址或分配内部描述符,或者它包含无效的值。 |
示例
/*************************************************************************
** file = fetch.c
**
** Example of executing an SQL statement.
** SQLBindCol & SQLFetch is used to retrieve data from the result set
** directly into application storage.
**
** Functions used:
**
** SQLAllocConnect SQLFreeConnect
** SQLAllocEnv SQLFreeEnv
** SQLAllocStmt SQLFreeStmt
** SQLConnect SQLDisconnect
**
** SQLBindCol SQLFetch
** SQLTransact SQLExecDirect
** SQLError
**
**************************************************************************/
#include <stdio.h>
#include <string.h>
#include "sqlcli.h"
#define MAX_STMT_LEN 255
int initialize(SQLHENV *henv,
SQLHDBC *hdbc);
int terminate(SQLHENV henv,
SQLHDBC hdbc);
int print_error (SQLHENV henv,
SQLHDBC hdbc,
SQLHSTMT hstmt);
int check_error (SQLHENV henv,
SQLHDBC hdbc,
SQLHSTMT hstmt,
SQLRETURN frc);
/*******************************************************************
** main
** - initialize
** - terminate
*******************************************************************/
int main()
{
SQLHENV henv;
SQLHDBC hdbc;
SQLCHAR sqlstmt[MAX_STMT_LEN + 1]="";
SQLRETURN rc;
rc = initialize(&henv, &hdbc);
if (rc == SQL_ERROR) return(terminate(henv, hdbc));
{SQLHSTMT hstmt;
SQLCHAR sqlstmt[]="SELECT deptname, location from org where division = 'Eastern'";
SQLCHAR deptname[15],
location[14];
SQLINTEGER rlength;
rc = SQLAllocStmt(hdbc, &hstmt);
if (rc != SQL_SUCCESS )
check_error (henv, hdbc, SQL_NULL_HSTMT, rc);
rc = SQLExecDirect(hstmt, sqlstmt, SQL_NTS);
if (rc != SQL_SUCCESS )
check_error (henv, hdbc, hstmt, rc);
rc = SQLBindCol(hstmt, 1, SQL_CHAR, (SQLPOINTER) deptname, 15,
&rlength);
if (rc != SQL_SUCCESS )
check_error (henv, hdbc, hstmt, rc);
rc = SQLBindCol(hstmt, 2, SQL_CHAR, (SQLPOINTER) location, 14,
&rlength);
if (rc != SQL_SUCCESS )
check_error (henv, hdbc, hstmt, rc);
printf("Departments in Eastern division:\n");
printf("DEPTNAME Location\n");
printf("-------------- -------------\n");
while ((rc = SQLFetch(hstmt)) == SQL_SUCCESS)
{
printf("%-14.14s %-13.13s \n", deptname, location);
}
if (rc != SQL_NO_DATA_FOUND )
check_error (henv, hdbc, hstmt, rc);
rc = SQLFreeStmt(hstmt, SQL_DROP);
if (rc != SQL_SUCCESS )
check_error (henv, hdbc, SQL_NULL_HSTMT, rc);
}
rc = SQLTransact(henv, hdbc, SQL_COMMIT);
if (rc != SQL_SUCCESS )
check_error (henv, hdbc, SQL_NULL_HSTMT, rc);
terminate(henv, hdbc);
return (0);
}/* end main */
/*******************************************************************
** initialize
** - allocate environment handle
** - allocate connection handle
** - prompt for server, user id, & password
** - connect to server
*******************************************************************/
int initialize(SQLHENV *henv,
SQLHDBC *hdbc)
{
SQLCHAR server[SQL_MAX_DSN_LENGTH],
uid[30],
pwd[30];
SQLRETURN rc;
rc = SQLAllocEnv (henv); /* allocate an environment handle */
if (rc != SQL_SUCCESS )
check_error (*henv, *hdbc, SQL_NULL_HSTMT, rc);
rc = SQLAllocConnect (*henv, hdbc); /* allocate a connection handle */
if (rc != SQL_SUCCESS )
check_error (*henv, *hdbc, SQL_NULL_HSTMT, rc);
printf("Enter Server Name:\n");
gets(server);
printf("Enter User Name:\n");
gets(uid);
printf("Enter Password Name:\n");
gets(pwd);
if (uid[0] == '\0')
{ rc = SQLConnect (*hdbc, server, SQL_NTS, NULL, SQL_NTS, NULL, SQL_NTS);
if (rc != SQL_SUCCESS )
check_error (*henv, *hdbc, SQL_NULL_HSTMT, rc);
}
else
{ rc = SQLConnect (*hdbc, server, SQL_NTS, uid, SQL_NTS, pwd, SQL_NTS);
if (rc != SQL_SUCCESS )
check_error (*henv, *hdbc, SQL_NULL_HSTMT, rc);
}
return(SQL_SUCCESS);
}/* end initialize */
/*******************************************************************
** terminate
** - disconnect
** - free connection handle
** - free environment handle
*******************************************************************/
int terminate(SQLHENV henv,
SQLHDBC hdbc)
{
SQLRETURN rc;
rc = SQLDisconnect (hdbc); /* disconnect from database */
if (rc != SQL_SUCCESS )
print_error (henv, hdbc, SQL_NULL_HSTMT);
rc = SQLFreeConnect (hdbc); /* free connection handle */
if (rc != SQL_SUCCESS )
print_error (henv, hdbc, SQL_NULL_HSTMT);
rc = SQLFreeEnv (henv); /* free environment handle */
if (rc != SQL_SUCCESS )
print_error (henv, hdbc, SQL_NULL_HSTMT);
return(rc);
}/* end terminate */
/*******************************************************************
** - print_error - call SQLError(), display SQLSTATE and message
*******************************************************************/
int print_error (SQLHENV henv,
SQLHDBC hdbc,
SQLHSTMT hstmt)
{
SQLCHAR buffer[SQL_MAX_MESSAGE_LENGTH + 1];
SQLCHAR sqlstate[SQL_SQLSTATE_SIZE + 1];
SQLINTEGER sqlcode;
SQLSMALLINT length;
while ( SQLError(henv, hdbc, hstmt, sqlstate, &sqlcode, buffer,
SQL_MAX_MESSAGE_LENGTH + 1, &length) == SQL_SUCCESS )
{
printf("\n **** ERROR *****\n");
printf(" SQLSTATE: %s\n", sqlstate);
printf("Native Error Code: %ld\n", sqlcode);
printf("%s \n", buffer);
};
return ( SQL_ERROR);
} /* end print_error */
/*******************************************************************
** - check_error - call print_error(), checks severity of return code
*******************************************************************/
int check_error (SQLHENV henv,
SQLHDBC hdbc,
SQLHSTMT hstmt,
SQLRETURN frc)
{
SQLRETURN rc;
print_error(henv, hdbc, hstmt);
switch (frc){
case SQL_SUCCESS : break;
case SQL_ERROR :
case SQL_INVALID_HANDLE:
printf("\n ** FATAL ERROR, Attempting to rollback transaction **\n");
rc = SQLTransact(henv, hdbc, SQL_ROLLBACK);
if (rc != SQL_SUCCESS)
printf("Rollback Failed, Exiting application\n");
else
printf("Rollback Successful, Exiting application\n");
terminate(henv, hdbc);
exit(frc);
break;
case SQL_SUCCESS_WITH_INFO :
printf("\n ** Warning Message, application continuing\n");
break;
case SQL_NO_DATA_FOUND :
printf("\n ** No Data Found ** \n");
break;
default :
printf("\n ** Invalid Return Code ** \n");
printf(" ** Attempting to rollback transaction **\n");
SQLTransact(henv, hdbc, SQL_ROLLBACK);
terminate(henv, hdbc);
exit(frc);
break;
}
return(SQL_SUCCESS);
} /* end check_error */