SQLFetch-访存下一行

SQLFetch() 将光标前进到结果集的下一行,并检索任何绑定的列。

SQLFetch() 可用于将数据直接接收到您使用 SQLBindCol()指定的变量中,或者可以通过调用 SQLGetData()在访存后单独接收列。 如果在绑定列时指示了转换,那么在调用 SQLFetch() 时也会执行数据转换。

语法

SQLRETURN SQLFetch (SQLHSTMT    hstmt);

函数自变量

表 1. SQLFetch 参数
数据类型 自变量/参数 使用 描述
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() 中的 pcbValuecbValueMax 参数),以确定哪些字符列被截断。

如果截断涉及小数点右边的数字,那么不会报告数字数据类型的截断。 如果小数点左侧发生截断,那么将返回错误 (请参阅诊断部分)。

图形数据类型的截断与字符数据类型相同。 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。

诊断

表 2。 SQLFetch SQLSTAT
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 */

引用