zoukankan      html  css  js  c++  java
  • DB2 9 运用开拓(733 测验)认证指南,第 4 部门: 嵌入式 SQL 编程(4)

    构建与 DB2 休止交互的运用程序
    developerWorks








    诊断和错误措置惩罚

    利用 WHENEVER 语句

    在后面,我们体会到 SQLCA 数据结构包孕每当执行 SQL 语句时由 DB2 Database Manager 更新的元素堆积。指派给该结构中 sqlcode 元素的值表示该 SQL 语句是执行乐成照样失败(值为 0 表示执行乐成,正值表示执行乐成但带有告诫,而负值表示发作了错误)。在执行 SQL 语句之后,嵌入式 SQL 运用程序至少应该赶快搜检所孕育发生的 sqlcode 值(平日称作 SQL 前往码)。若是 SQL 语句未能按预期执行,就应该看护用户发作了错误或告诫;此外,只需前提赞同,就应该给他们供应敷裕的诊断信息,以便他们定位并处理成就。

    正如您能想像到的,在执行每个 SQL 语句之后都搜检 SQL 前往码可以给运用程序增长额外的开支,尤其当运用程序包孕大批 SQL 语句时。可是,由于嵌入式 SQL 运用程序源代码文件中编写的每个 SQL 语句都必须由 SQL 预编译器来措置惩罚,所以可以让预编译器自动生成用以搜检 SQL 前往码的源代码。这是经由议定在源代码文件中嵌入一种或多种方式的 WHENEVER SQL 语句来完成的。

    WHENEVER 语句让预编译器生成源代码,用以在发作错误、告诫或短多数据时评价 SQL 前往码并转移到指定的标号。(若是未利用 WHENEVER 语句,默许举动是纰漏 SQL 前往码,似乎未曾碰到成就一样连续休止措置惩罚。)可以利用四种 WHENEVER 语句方式,其中三种 WHENEVER 语句鉴识用于搜检三种差异规范的错误/告诫状况,还有一种用于封闭错误搜检:

    • WHENEVER SQLERROR GOTO [Label]:指示预编译器生成源代码,用以在生成负的 sqlcode 值时评价 SQL 前往码并转移到指定标号。

    • WHENEVER SQLWARNING GOTO [Label]:指示预编译器生成源代码,用以在生成正的 sqlcode 值(除了值 100 之外)时评价 SQL 前往码并转移到指定标号。

    • WHENEVER NOT FOUND GOTO [Label]:指示预编译器生成源代码,用以在生成为 100sqlcode 值或为 02000sqlstate 值时评价 SQL 前往码并转移到指定标号。(100 值用来表示没有找到与指定的选择前提匹配的记录,大概曾经抵达了效果数据集的结尾。)

    • WHENEVER [SQLERROR | SQL WARNING | NOT FOUND] CONTINUE:指示预编译器纰漏 SQL 前往码,连续措置惩罚运用程序中的下一个指令。

    源代码文件可以包孕这四种方式的 WHENEVER 语句的随便组合,并且前三种方式的出现递次是可有可无的。可是,一旦利用了任一方式的 WHENEVER 语句,就将评价并响应地措置惩罚随后执行的完整绝对 SQL 语句的 SQL 前往码,直到运用程序终了或另一个 WHENEVER 语句更改该举动。

    清单 8 给出了一个用 C 编程说话编写的示例,它说清晰熟悉打听若何利用 WHENEVER 语句来捕捉和措置惩罚短多数据的错误:

    清单 8. 用 WHENEVER 语句措置惩罚错误

                         
    ...
    // Include The SQLCA Data Structure Variable
    EXEC SQL INCLUDE SQLCA;
    // Set Up Error Handler
    EXEC SQL WHENEVER NOT FOUND GOTO NOT_FOUND_HANDLER;
    // Connect To The Appropriate Database 
    EXEC SQL CONNECT TO sample USER db2admin USING ibmdb2;     
    // Execute A SELECT INTO SQL Statement (If A "DATA NOT FOUND" Situation Occurs, 
    // The Code Will Branch To The NOT_FOUND_HANDLER Label)
    EXEC SQL SELECT empno INTO :EmployeeNo 
        FROM rsanders.employee
        WHERE job = 'CODER';
    ...
    // Disable All Error Handling
    EXEC SQL WHENEVER NOT FOUND CONTINUE;
    // Prepare To Return To The Operating System
    goto EXIT;
    // Define A Generic "Data Not Found" Handler    
    NOT_FOUND_HANDLER:
        printf("NOT FOUND: SQL Code = %d\n", sqlca.sqlcode);
        EXEC SQL ROLLBACK;
        goto EXIT;
    EXIT:
    // Terminate The Database Connection
    EXEC SQL CONNECT RESET;
    // Return Control To The Operating System
    return(0);	
            


    遗憾的是,在利用 WHENEVER SQL 语句时所生成的代码依托于 GO TO 跳转,而不是经由议定调用/前往接口将控制转移到得当的错误措置惩罚段。因此,当将控制传达给用于措置惩罚错误和告诫的源代码时,运用程序既无法知道控制来自那里那边,也无法知道在精确措置惩罚错误或告诫之后,应将控制前往到那里那边。因此,在将控制传达给 WHENEVER 语句错误措置惩罚标号时,运用程序可以做的专一一件事就是显露生成的错误代码,回滚以后事务并将控制前往给操纵系统。





    回页首



    Get Error Message API

    除了其他对象之外,DB2 的大多数版本还包孕一组功用丰盛的称为经管 API(运用程序编程接口)的函数。这些 API 用来在 SQL 提供应 DB2 运用程序的数据存储、操纵和检索功用之外供应额外的效力。实际上,任何可以听下令行措置惩罚器经由议定执行 DB2 下令来执行的数据库操纵,都可以经由议定在运用程序中调用得当的经管 API 来执行。

    在每次执行 SQL 语句时,指派给 SQLCA 数据结构变量的 sqlcode 元素的值实际上都是一个编码数字。一个专门的经管 API 可以将这个编码数字转换成一个可以显露给用户的故意义的描述。该 API 被称为 Get Error Message API。在 C/C 低级编程说话源代码文件中,用于调用这个 API 的基本语法如下:

    sqlaintp (char          *pBuffer,
              short         sBufferSize,
              short         sLineWidth,
              struct sqlca  *pSQLCA);
    


    以下是其他低级编程说话源代码文件顶用来调用这个 API 的语法:

    sqlgintp (short         sBufferSize,
              short         sLineWidth,
              struct sqlca  *pSQLCA,
              char          *pBuffer);
    	


    让我们更具体地审查这个 API 语法中的各个成分:

    • pBuffer:指定 Get Error Message API 在内存中存储任何检索出的消息文本的位置。

    • sBufferSize:指定应将所检索的消息文本写入的内存缓冲区的巨细(以字节为单元)。

    • sLineWidth:指定在换行符之间一举消息文本可以包孕的最大字符数。值为 0 表示所前往的整个消息文本不带换行符。

    • pSQLCA:指定 SQLCA 数据结构变量在内存中的存储位置。

    每当调用 Get Error Message API 时,所供应的 SQLCA 数据结构变量的 sqlcode 元素中存储的值用来定位和检索一个消息文件中得当的错误消息文本,该消息文件是与 DB2 打包在一同的。清单 9 是一个用 C 编程说话编写的示例,它说清晰熟悉打听平日若何利用 Get Error Message API 取得和显露与所生成的 SQL 前往码相干联的消息。

    清单 9. 用 Get Error Message API 措置惩罚错误

                                 
    ...
    // Include The SQLCA Data Structure Variable
    EXEC SQL INCLUDE SQLCA;
    // Declare The Local Memory Variables
    long  RetCode = SQL_RC_OK;
    char  ErrorMsg[1024];
    ...
    // Perform Some SQL Operation    
    ...
    // If An Error Occurred, Obtain And Display Any Diagnostic Information Available
    if (sqlca.sqlcode != SQL_RC_OK)
    { 
        // Retrieve The Error Message Text For The Error Code Generated
        RetCode = sqlaintp(ErrorMsg, sizeof(ErrorMsg), 70, &sqlca);
        switch (RetCode)
        {
        case -1:
            printf("ERROR : Insufficient memory.\n");
            break;
        case -3:
            printf("ERROR : Message file is inaccessible.\n");
            break;
        case -5:
            printf("ERROR : Invalid SQLCA, bad buffer, ");
            printf("or bad buffer length specified.\n");
            break;
        default:
            printf("%s\n", ErrorMsg);
            break;
        }
    }
    ...	
    	


    正如在这个示例中看到的,在调用 Get Error Message API 时,它前往一个注解执行能否乐成的值。在这个示例中,搜检所孕育发生的前往码;若是出现了错误,将向用户前往一个消息以注解 API 为何失败。若是 API 乐成了,则将检索到的消息文本前往给用户。





    回页首



    SQLSTATE

    除了 SQL 前往码之外,DB2(以及其他相干数据库产物)还利用一组称为 SQLSTATE 的错误消息编码来为告诫和错误供应补偿诊断信息。SQLSTATE 是由字母数字构成的五个字符(字节)的字符串,其格局为 ccsss,其中 cc 表示错误消息类,而 sss 表示错误消息子类。与 SQL 前往码的值一样,每当执行 SQL 语句时,就将 SQLSTATE 的值写入所利用的 SQLCA 数据结构变量的一个元素(sqlstate 元素)中。并且,正如 Get Error Message API 可以将生成的任何 SQL 前往码值转换成故意义的描述一样,另一个 API —— Get SQLSTATE Message API —— 也可以将 SQLSTATE 值转换成故意义的描述。经由议定在嵌入式 SQL 运用程序中包孕其中一个 API(或两个均包孕),就可以在发作错误和/或告诫状况时,向最终用户前往故意义的信息。




    版权声明: 原创作品,赞同转载,转载时请务必以超链接方式标明文章 原始来由 、作者信息和本声明。不然将追查法律责任。

  • 相关阅读:
    暑假第五周报告
    读《大道至简》有感
    暑假第四周报告
    暑假第三周报告
    暑假第二周报告
    暑假第一周报告
    对15号夏壹队的TD信息通——teamfinal的使用体验
    Django易混淆问题
    MySQL常见问题
    Django框架的理解和使用的常见问题
  • 原文地址:https://www.cnblogs.com/zgqjymx/p/1972849.html
Copyright © 2011-2022 走看看