`

示例:交互式 SQL 和等价的 DB2 UDB CLI 函数调用

    博客分类:
  • DB2
阅读更多

示例:交互式 SQL 和等价的 DB2 UDB CLI 函数调用

此示例显示交互式 SQL 语句的执行,并遵循编写 DB2 UDB CLI 应用程序中描述的流程。

有关代码示例的信息,请参阅代码免责信息

 

/*************************************************************************
** file = typical.c
**
** Example of executing interactive SQL statements, displaying result sets
** and simple transaction management.
**
**  Functions used:
**
**        SQLAllocConnect      SQLFreeConnect
**        SQLAllocEnv          SQLFreeEnv
**        SQLAllocStmt         SQLFreeStmt
**        SQLConnect           SQLDisconnect
**
**        SQLBindCol           SQLFetch
**        SQLDescribeCol       SQLNumResultCols
**        SQLError             SQLRowCount
**        SQLExecDirect        SQLTransact
**
**************************************************************************/
 
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include "sqlcli.h"
 
#define MAX_STMT_LEN 255
#define  MAXCOLS   100
 
#define  max(a,b) (a > b ? a : b)
 
int initialize(SQLHENV *henv,
              SQLHDBC *hdbc);
 
int process_stmt(SQLHENV    henv,
                 SQLHDBC        hdbc,
                 SQLCHAR        *sqlstr);
 
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);
 
void display_results(SQLHSTMT hstmt,
                     SQLSMALLINT nresultcols);
 
/*******************************************************************
** main
** - initialize
** - start a transaction
**   - get statement
**   - another statement?
** - COMMIT or ROLLBACK
** - another transaction?
** - terminate
*******************************************************************/
int main()
{
    SQLHENV         henv;
    SQLHDBC     hdbc;
    SQLCHAR     sqlstmt[MAX_STMT_LEN + 1]="";
    SQLCHAR     sqltrans[sizeof("ROLLBACK")];
    SQLRETURN       rc;
 
    rc = initialize(&henv, &hdbc);
    if (rc == SQL_ERROR) return(terminate(henv, hdbc));
 
    printf("Enter an SQL statement to start a transaction(or 'q' to Quit):\n");
        gets(sqlstmt);
 
    while (sqlstmt[0] !='q')
    {
        while (sqlstmt[0] != 'q')
        {   rc = process_stmt(henv, hdbc, sqlstmt);
            if (rc == SQL_ERROR) return(SQL_ERROR);
            printf("Enter an SQL statement(or 'q' to Quit):\n");
        gets(sqlstmt);
        }
 
        printf("Enter 'c' to COMMIT or 'r' to ROLLBACK the transaction\n");
        fgets(sqltrans, sizeof("ROLLBACK"), stdin);
 
        if (sqltrans[0] == 'c')
        {
          rc = SQLTransact (henv, hdbc, SQL_COMMIT);
          if (rc == SQL_SUCCESS)
            printf ("Transaction commit was successful\n");
            else
        check_error (henv, hdbc, SQL_NULL_HSTMT, rc);
        }
 
        if (sqltrans[0] == 'r')
        {
          rc = SQLTransact (henv, hdbc, SQL_ROLLBACK);
          if (rc == SQL_SUCCESS)
            printf ("Transaction roll back was successful\n");
            else
        check_error (henv, hdbc, SQL_NULL_HSTMT, rc);
        }
 
        printf("Enter an SQL statement to start a transaction or 'q' to quit\n");
        gets(sqlstmt);
    }
 
        terminate(henv, hdbc);
 
            return (SQL_SUCCESS);
}/* end main */
 
/*******************************************************************
** process_stmt
** - allocates a statement handle
** - executes the statement
** - determines the type of statement
**   - if there are no result columns, therefore non-select statement
**      - if rowcount > 0, assume statement was UPDATE, INSERT, DELETE
**   else
**      - assume a DDL, or Grant/Revoke statement
**   else
**      - must be a select statement.
**      - display results
** - frees the statement handle
*******************************************************************/
 
int process_stmt (SQLHENV    henv,
                       SQLHDBC        hdbc,
                  SQLCHAR    *sqlstr)
{
SQLHSTMT        hstmt;
SQLSMALLINT     nresultcols;
SQLINTEGER      rowcount;
    SQLRETURN       rc;
 
 
    SQLAllocStmt (hdbc, &hstmt);       /* allocate a statement handle */
 
    /* execute the SQL statement in "sqlstr"    */
 
    rc = SQLExecDirect (hstmt, sqlstr, SQL_NTS);
        if (rc != SQL_SUCCESS)
        if (rc == SQL_NO_DATA_FOUND) {
            printf("\nStatement executed without error, however,\n");
            printf("no data was found or modified\n");
            return (SQL_SUCCESS);
        }
            else
           check_error (henv, hdbc, hstmt, rc);
 
    SQLRowCount (hstmt, &rowcount);
    rc = SQLNumResultCols (hstmt, &nresultcols);
        if (rc != SQL_SUCCESS)
           check_error (henv, hdbc, hstmt, rc);
 
    /* determine statement type */
    if (nresultcols == 0) /* statement is not a select statement */
    {
        if (rowcount > 0 ) /* assume statement is UPDATE, INSERT, DELETE */
        {
            printf ("Statement executed, %ld rows affected\n", rowcount);
        }
      else  /* assume statement is GRANT, REVOKE or a DLL statement */
        {
              printf ("Statement completed successful\n");
        }
    }
    else /* display the result set */
    {
        display_results(hstmt, nresultcols);
    } /* end determine statement type */
 
    SQLFreeStmt (hstmt, SQL_DROP );       /* free statement handle */
 
    return (0);
}/* end process_stmt */
 
/*******************************************************************
** initialize
**  - allocate environment handle
**  - allocate connection handle
**  - prompt for server, user id, & password
**  - connect to server
*******************************************************************/
 
int initialize(SQLHENV *henv,
              SQLHDBC *hdbc)
{
SQLCHAR     server[18],
            uid[10],
            pwd[10];
    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);
    }
}/* 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, SQL_NULL_HDBC, SQL_NULL_HSTMT);
 
}/* end terminate */
 
/*******************************************************************
** display_results - displays the selected character fields
**
**  - for each column
**      - get column name
**      - bind column
**  - display column headings
**  - fetch each row
**      - if value truncated, build error message
**      - if column null, set value to "NULL"
**      - display row
**      - print truncation message
**  - free local storage
**
*******************************************************************/
void display_results(SQLHSTMT hstmt,
                SQLSMALLINT nresultcols)
{
SQLCHAR         colname[32];
SQLSMALLINT     coltype[MAXCOLS];
SQLSMALLINT     colnamelen;
SQLSMALLINT     nullable;
SQLINTEGER      collen[MAXCOLS];
SQLSMALLINT     scale;
SQLINTEGER      outlen[MAXCOLS];
SQLCHAR *       data[MAXCOLS];
SQLCHAR         errmsg[256];
    SQLRETURN       rc;
SQLINTEGER      i;
SQLINTEGER      displaysize;
 
        for (i = 0; i < nresultcols; i++)
    {
        SQLDescribeCol (hstmt, i+1, colname, sizeof (colname),
        &colnamelen, &coltype[i], &collen[i], &scale, &nullable);
 
        /* get display length for column */
        SQLColAttributes (hstmt, i+1, SQL_DESC_PRECISION, NULL, 0     ,
            NULL, &displaysize);
 
        /* set column length to max of display length, and column name
           length.  Plus one byte for null terminator       */
        collen[i] = max(displaysize, collen[i]);
        collen[i] = max(collen[i], strlen((char *) colname) ) + 1;
 
        printf ("%-*.*s", collen[i], collen[i], colname);
 
        /* allocate memory to bind column                             */
        data[i] = (SQLCHAR *) malloc (collen[i]);
 
        /* bind columns to program vars, converting all types to CHAR */
        SQLBindCol (hstmt, i+1, SQL_C_CHAR, data[i], collen[i], &outlen[i]);
    }
    printf("\n");
 
    /* display result rows                                            */
    while ((rc = SQLFetch (hstmt)) != SQL_NO_DATA_FOUND)
    {
        errmsg[0] = '\0';
        for (i = 0; i < nresultcols; i++)
        {
            /* Build a truncation message for any columns truncated */
            if (outlen[i] >= collen[i])
            {    sprintf ((char *) errmsg + strlen ((char *) errmsg),
                          "%d chars truncated, col %d\n",
                           outlen[i]-collen[i]+1, i+1);
            }
            if (outlen[i] == SQL_NULL_DATA)
                printf ("%-*.*s", collen[i], collen[i], "NULL");
            else
                printf ("%-*.*s", collen[i], collen[i], data[i]);
        } /* for all columns in this row  */
 
        printf ("\n%s", errmsg);  /* print any truncation messages    */
    } /* while rows to fetch */
 
    /* free data buffers                                              */
        for (i = 0; i < nresultcols; i++)
    {
        free (data[i]);
    }
 
}/* end display_results
 
/*******************************************************************
** SUPPORT FUNCTIONS
**  - print_error   - call SQLError(), display SQLSTATE and message
**  - check_error     - call print_error
**                    - check severity of Return Code
**                    - rollback & exit if error, continue if warning
*******************************************************************/
 
/*******************************************************************/
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;
}
 
/*******************************************************************/
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);
 
}
 

分享到:
评论

相关推荐

    微软环境DB2 UDB 7.1开发指南

    2. **SQL语法与编程**:深入讲解SQL语言在DB2 UDB中的应用,包括DML(数据操纵语言)、DDL(数据定义语言)和DCL(数据控制语言),以及PL/SQL过程语言的使用。 3. **JDBC与ODBC连接**:解释如何通过Java JDBC驱动...

    db2调自定义函数(小例)

    本文将深入探讨如何在DB2中创建和调用自定义函数,通过具体的示例代码,展示这一过程的关键步骤。 ### 创建自定义函数:理论与实践 在DB2中创建自定义函数涉及以下几个关键步骤: 1. **编写源代码**:首先,你...

    DB2 UDB SQL入门

    `db2`命令行实用程序提供了丰富的交互式和非交互式选项,如`db2 connect`, `db2 select`, `db2 runstats`等。 通过阅读《DB2 UDB SQL入门》这本书,读者将能够掌握DB2 UDB的基础知识,熟练运用SQL进行数据库操作,...

    IBM DB2 UDB 词汇表.zip

    2. **SQL(Structured Query Language)**:SQL是用于管理关系数据库的标准语言,DB2 UDB完全支持SQL,包括DDL(数据定义语言)用于创建和修改数据库结构,DML(数据操纵语言)用于插入、更新和删除数据,以及DCL...

    DB2 UDB SQL语句的生命周期.pdf

    文章通过解释什么是包、什么是段条目,以及它们如何交互,揭示了DB2 UDB处理SQL语句的内部机制。用户提交的SQL请求在被DB2 UDB处理时,首先会关联到一个包,然后根据包的结构信息进行SQL语句的编译和执行。编译和...

    MySQL to DB2 UDB Conversion Guide

    综上所述,本文档不仅详细介绍了DB2 UDB的基本概念和技术特点,还提供了从MySQL到DB2 UDB的迁移规划、实施步骤以及实际案例分析等内容。通过阅读本文档,用户可以系统地了解整个迁移过程,并能够顺利完成迁移工作。

    DB2 LUW to UDB400 v3

    - DB2 LUW 和 UDB400 在 SQL 语言元素的支持上可能存在差异。 - 移植过程中需要审查现有的 SQL 语句,并评估它们在 UDB400 上的兼容性。 - 如果存在不兼容的问题,可能需要调整 SQL 语句或者寻找其他方法来实现相同...

    DB2 UDB 珍贵资料

    3. SQL支持:DB2 UDB完全支持SQL标准,包括DML(数据操纵语言)、DDL(数据定义语言)和DCL(数据控制语言),使得用户可以通过SQL语句进行数据查询、插入、更新和删除等操作。 4. 安全性:DB2 UDB提供了一套完善的...

    DB2 UDB V9.1 SQL Cookbook

    - **数据转换**:探讨如何利用SQL函数和操作符进行数据转换,以满足特定需求。 - **数据汇总与聚合**:讲解如何使用聚合函数(如SUM、AVG、COUNT等)对数据进行汇总统计。 ##### 3. 存储过程编写 - **基本概念**:...

    DB2 UDB 9.1 For AIX 安装指南

    DB2 Universal Database (UDB) 9.1 for AIX 是一款在IBM AIX操作系统上运行的关系型数据库管理系统,提供了高级的数据管理和分析功能。这篇安装指南详细介绍了在AIX环境下安装和配置DB2 UDB v9.1的全过程,适合具有...

    DB2 UDB 编程及存储过程

    最后,第四部分(Vol 4)可能讨论了更高级的主题,如触发器、自定义函数和存储过程的安全性。这可能包括权限管理,确保只有授权的用户能够访问和修改特定的存储过程。此外,还可能涉及到性能优化,如索引策略、查询...

    了解用户和组账户与DB2 UDB的交互

    DB2 UDB安全模型主要包括两部分:身份验证和授权。身份验证就是使用安全机制验证所提供用户ID和口令的过程。用户和组身份验证由DB2 UDB外部的设施管理,比如操作系统、域控制器或者Kerberos安全系统。这和其他数据库...

    DB2 UDB 内存模型

    理解DB2 UDB的内存模型对于数据库管理员和开发人员来说至关重要,因为它直接影响到数据库的响应速度和系统资源的利用效率。 DB2 UDB的内存结构主要由以下几个关键组件构成: 1. **数据缓冲池(Buffer Pool)**:这...

    DB2 UDB培训资料

    DB2 Universal Database(UDB)是IBM公司推出的一款企业级关系型数据库管理系统,广泛应用于大型企业和组织。本培训资料详尽地涵盖了DB2 UDB的关键概念、操作和管理技巧,旨在帮助学习者全面掌握这款强大的数据库...

    分布式 DB2 UDB 服务器对比

    作者 Paul Zikopoulos 通过一个对比列表,让读者可以轻松地理解分布式 IBM:registered: DB2:registered: Universal Database:trade_mark: (DB2 UDB) 服务器家族各成员之间,在基本许可规则、功能以及特性等方面的...

    IBM DB2 UDB for AS400 SQL Programming

    根据给定的信息,本文将详细解释“IBM DB2 UDB for AS400 SQL Programming”的核心概念和技术要点,包括但不限于数据库结构、SQL语句类型、SQL对象等方面。 ### 关于DB2 UDB for AS400 SQL编程 IBM DB2 Universal ...

    DB2 UDB V8.2 Express: 初始配置和经验法则

    DB2 Universal Database (UDB) Express Edition 是针对中小企业的关系数据库管理系统(Relational ...DB2 UDB Express 运行于 Linux 和 Windows 之上,至多可支持两个处理器和一些特性,具备自调优和自配置功能。

    db2 sql手册2

    - **交互式调用**:在命令行或图形界面工具中直接输入SQL语句进行执行。 ##### 3. SQL控制语句 - **ALLOCATE CURSOR**:创建游标,以便能够逐行访问查询结果。 - **ALTER BUFFERPOOL**:调整缓冲池大小和其他参数,...

Global site tag (gtag.js) - Google Analytics