DB2 V10.1 for Linux, UNIX, and Windows

使用 C 语言的嵌入式 SQL 应用程序模板

系统向您提供了一个样本嵌入式 SQL 应用程序,以测试嵌入式 SQL 开发环境及帮助您了解嵌入式 SQL 应用程序的基本结构。

嵌入式 SQL 应用程序必须具有以下结构:

以下源代码演示使用 C 编写的嵌入式 SQL 应用程序的基本结构。

样本程序:template.sqc
       #include <stdio.h>                                                  1
       #include <stdlib.h>
       #include <string.h>
       #include <sqlenv.h>
       #include <sqlutil.h>                                               

      EXEC SQL BEGIN DECLARE SECTION;                                      2
        short id;
        char name[10];
        short dept;
        double salary;
        char hostVarStmtDyn[50];
      EXEC SQL END DECLARE SECTION;                                        

      int main()                                                           
       { 
         int rc = 0;                                                       3
         EXEC SQL INCLUDE SQLCA;                                           4

         /* 连接到数据库 */
         printf("\n Connecting to database...");
         EXEC SQL CONNECT TO "sample";                                     5
         if (SQLCODE  <0)                                                  6
         {
            printf("\nConnect Error:  SQLCODE = 
            goto connect_reset;
         }
         else
         {
            printf("\n Connected to database.\n");
         }
         
         /* 使用静态 SQL 来执行 SQL 语句(查询);将单一结果行的值复制到主变量 */
         EXEC SQL SELECT id, name, dept, salary                            7
                 INTO :id, :name, :dept, :salary
                 FROM staff WHERE id = 310;
         if (SQLCODE  <0)                                                  6 
         {
            printf("Select Error:  SQLCODE = 
         }
         else
         {
            /* 将主变量值打印到标准输出 */
            printf("\n Executing a static SQL query statement, searching for 
               \n the id value equal to 310\n");
            printf("\n ID   Name        DEPT       Salary\n");
            printf(" 
         }
         
         strcpy(hostVarStmtDyn, "UPDATE staff 
                                SET salary = salary + 1000 
                                WHERE dept = ?");
         /* 使用主变量和动态 SQL 来执行 SQL 语句(操作)*/
         EXEC SQL PREPARE StmtDyn FROM :hostVarStmtDyn;
         if (SQLCODE  <0)                                                  6
         {
            printf("Prepare Error:  SQLCODE = 
         }
         else
         {
            EXEC SQL EXECUTE StmtDyn USING :dept;                          8
         }
         if (SQLCODE  <0)                                                  6
         {
            printf("Execute Error:  SQLCODE = 
         }
     
         /* 使用静态 SQL 和游标来读取已更新的行 */
         EXEC SQL DECLARE posCur1 CURSOR FOR 
            SELECT id, name, dept, salary 
            FROM staff WHERE id = 310;
         if (SQLCODE  <0)                                                 6
         {
            printf("Declare Error:  SQLCODE = 
         }
         EXEC SQL OPEN posCur1;
         EXEC SQL FETCH posCur1 INTO :id, :name, :dept, :salary ;         9
         if (SQLCODE  <0)                                                 6
         {
            printf("Fetch Error:  SQLCODE = 
         }
         else
         {
            printf(" Executing an dynamic SQL statement, updating the 
                     \n salary value for the id equal to 310\n");
            printf("\n ID   Name        DEPT       Salary\n");
            printf(" 
         }
         
         EXEC SQL CLOSE posCur1;
         
         /* 落实事务 */
         printf("\n  Commit the transaction.\n");
         EXEC SQL COMMIT;                                                 10
         if (SQLCODE  <0)                                                 6
         {
            printf("Error:  SQLCODE =  
         }
         
         /* 与数据库断开连接 */
         connect_reset :
            EXEC SQL CONNECT RESET;                                       11
            if (SQLCODE  <0)                                              6
            {
               printf("Connection Error:  SQLCODE = 
            }
         return 0;
        } /* 结束 main */
     

有关样本程序:template.sqc 的注释:

注解 描述
1 包含文件:此伪指令将一个文件包括到源应用程序中。
2 声明节:声明主变量,这些主变量用于存放 C 应用程序的 SQL 语句中引用的值。
3 局部变量声明:此块声明要在应用程序中使用的局部变量。这些变量不是主变量。
4 包括 SQLCA 结构:执行每个 SQL 语句后,都将更新 SQLCA 结构。此模板应用程序使用某些 SQLCA 字段进行错误处理。
5 连接到数据库:使用数据库的初始步骤是,与该数据库建立连接。这里,通过执行 SQL 语句 CONNECT 来建立连接。
6 错误处理:检查是否已发生错误。
7 执行查询:通过执行此 SQL 语句,将表所返回的数据赋予主变量。在执行 SQL 语句后使用的 C 代码将主变量中的值打印到标准输出。
8 执行操作:执行此 SQL 语句将更新表中由部门编号标识的一组行。准备过程 (EXEC SQL PREPARE StmtDyn FROM :hostVarStmtDyn;) 是一个步骤,此步骤将主变量值(例如此语句中引用的主变量值)与所要执行的 SQL 语句绑定。
9 执行操作:在此行以及上一行中,此应用程序在静态 SQL 中使用游标来选择表中的信息并打印数据。在声明并打开游标之后,提取数据,最后关闭该游标。
10 落实事务:COMMIT 语句将工作单元中进行的数据库更改最终化。
11 最后,必须删除数据库连接。