• 美文
  • 文章
  • 散文
  • 日记
  • 诗歌
  • 小说
  • 故事
  • 句子
  • 作文
  • 签名
  • 祝福语
  • 情书
  • 范文
  • 读后感
  • 文学百科
  • 当前位置: 柠檬阅读网 > 故事 > 正文

    【DB2嵌入式静态SQL应用与实践】 嵌入式Linux应用与开发实践

    时间:2019-05-07 03:33:04 来源:柠檬阅读网 本文已影响 柠檬阅读网手机站

      摘要:随着计算机技术的飞速发展,DB2以其具有的通用性与高效运行的巨大优势渗透到各行各业中,面对越来越大的数据信息处理这一问题,如何提高效率、避免庞大的数据库系统被重复编译,增强应用时的可维护性,使得数据库对每条SQL语句可以先择最优的运行。以下从理论出发,结合例程,阐述了静态SQL的应用。
      关键词:嵌入式;静态SQL;游标
      中图分类号:TP311文献标识码:A文章编号:1009-3044(2012)12-2667-04
      DB2 Embedded Static SQL Application and Practice
      CHEN Jing-yan
      (Medical College of Shantou University, Shantou 515041, China)
      Abstract:With the rapid development of computer technology, with the DB2 for its versatility and efficient operation of the great advan tages of penetration into all walks of life, in the face of increasing data and information to deal with this issue, how to improve efficiency, to avoid a huge databaserepeat the compilation, and enhance the maintainability of the application, making the database for each SQL state ment, you can choose the optimal operation. The following from the theory, combined with the routine, described the application of static SQL.
      Key words:embedded; static SQL; cursor
      1概述
      一个嵌入式SQL应用程序文件就是一个含有SQL语句,且带有特殊扩展名的文该文件。在开始进行嵌入式SQL应用程序开发前,首先需要了解如何把这样一个文件转化成宿主语言编译器可以识别和处理的格式,如何同数据库服务器进行交互、对数据进行查询修改和删除等操作,以及如何构建可执行的程序,文章源代码均用C语言。
      2构建嵌入式SQL应用程序过程
      建立一个嵌入式SQL应用程序前,我们应对其用发中常用的基本概今有一定了解,其具体步骤分为:
      2.1开发环境
      使用文本编辑器或者集成开发环境(IDE)编辑源文件。
      2.2预编译
      在程序文件编辑完成后,应预编译每个连接到数据库的源程序文件。无论是嵌入式静态SQL还是嵌入式动态SQL,都需要先进行预编译,并绑定到特定的数据库。它将源文件中的SQL语句注释掉,并把SQL语句替换成DB2运行时的API调用,这些API调用是源语言编译器能够理解的函数调用,预编工作由预编译器来完成。
      预编译命令:
      Precompile filename [参数名可用数值]…
      PREP filename [参数名可用数值]…
      如创建一个默认名为test.c的新C源文件,同时会生成一个名为test.bnd的绑定文件。其在DB2窗口下执行命令为:
      DB2 PREP test.sqc BINDFILE
      常用参数列表如表1。
      2.3编译
      使用主语主编译修改后的源文件,以及其他不包含SQL语句文件。
      2.4链接
      将编译生成的目标文件与DB2链接到主语言库,从而产生一个可执行的文件。
      
      2.5绑定
      创建程序句过程中,数据库管理器在执行程序时会调用这些程序包,为执行提供访问数据策略与路径。在预编译时指定PACKAGE选项隐含的完成;或者用BIND命令通过预编译产生的绑定文件显性的完成。
      BIND其绑定命令格式为:
      BIND filename [参数名数值]…
      例如将名为test.bnd绑定到数据库中,其在DB2窗口下执行命令为:
      DB2 BIND test.bnd
      预编译为每一个需要独立预编译的源代码模块创建一个程序包。如果有4个源文件,这4个源文件都需要预编译,那么就要创建4个程序包或者4个绑定文件。默认方式是,每一个程序包的名字与后缀.bnd的源文件名字相同,但只包含前8个字符。如果新建的程序包名字与已存在于数据库中的程序包名称相同,新的程序包将替换原先存在的程序包,要显性的指定一个不同的程序包名称,必须执行PREK命令时使用PACKAGE USING选项。
      3嵌入式静态SQL
      3.1静态SQL程序的结构与特点
      静态SQL是指嵌入在宿主语言中的SQL语名在预编译时完全知道。其特点如下:
      1)SQL语句直接嵌入到宿主编程语言,程序需要预编译处理这些嵌入的SQL语句
      2)SQL语句在程序被编译时已知,涉及的数据库对象已存在
      3)SQL语句在程序运行前被编译
      4)SQL语句的编译结果在DB2的目录(catalog)中持久化保存运行时仅读取目录(catalog)
      5)SQL语句的优化是根据编译时的数据库统计信息进行的,不能完全反映运行时的情况
      6)对SQL语句所访问的数据对象的权限检查是在绑定时进行的权限控制的粒度是包(package,一组SQL语句的编译结果),用户仅需要访问包的权限
      7)如果SQL语句中的对象被修改,如DDL执行,整个包都需要重新绑定
      3.2宿主变量声明与使用
      通常方法声明的变量不能被SQL语句直接引用,以另一种特殊的方式在宿主语言程序模块中声明,必须在BEGIN DECLARE SECTION和END DECLARE SECTION程序段中定义。以下程序显示了在C语言中声明宿主变量的例子:
      EXEC SQL BEGIN DECLARE SECTION;
      short mgt_level=100,age=30;
      double bonus;
      char char1;
      char emp_name[16];
      short nul_ind;
      EXEC SQL END DECLARE SECTION;
      引用宿言变量的程序:
      EXEC SQL FETCH cursor1 INTO :bonus;
      printf("bonus=%f\n",bonus);
      3.3指示符变量的定义与使用
      与宿主变量定义方法相同,在BEGIN DECLARE SECTION和END DECLARE SECTION之间定义。并且数据类型与SQL数据类型SMALLINT对应,在C语言中为short类型。在INSERT语句句用宿主变量,其需要嵌入的SQL语句为:
      INSERT INTO TEMPTABLE(EMPNO,LASTNAME)
      VALUES(‘000190’,‘JACK’)
      又如: EXEC SQL INSERT INTO TEMPTABLE(EMPNO,LASTNAME)
      VALUES(:empno, :name);
      第一条SQL语句可以在CLP中发出,它也可以嵌入到应用程序中,但是它每一次只能插入一行值,如果要插入不同的值就要重新输入,程序过程也要修改。第二条SQL语句只能嵌入在程序中,每一次执行需要用户通过其他代码指定新值给宿主变量empno和name,宿主变的量的作用是将用户指定的值传递给VALUES子句。可以实现输入多行值。
      宿主变量使用方法如下例子: CREATE TABLE TEMPTABLE( EMPNO CHAR(6) NOT NULL,
      LASTNAME VARCHAR(2) NOT NULL, JOBCODE CHAR(2),
      WORKDEPT CHAR(3), NOT NULL,
      PHONENO CHAR(10))
      EXEC SQL
      SELECT JOBCODE, WORKDEPT, PHONENO
      INTO :jc:jci, :dpt, :pho:phoi
      FORM TEMPTABLE WHERE EMPNO=:ID;
      3.4游标的定义与使用
      与宿主变量定义方法相同,在BEGIN DECLARE SECTION和END DECLARE SECTION之间定义。一个应用程序可以有多个游标,但第个游标都要有自己的DECLARE,CURSOR,OPEN,FETCH和CLOSE语句集;处理一个游标涉及到以下几个步骤。
      1)使用DECLARE CURSOR语句声明一个游标。
      2)使用OPEN语句执行查询和创建结果表。
      3)使用FETCH语句每次提取一行结果。
      4)使用DELETE或UPDATE语句处理行(如果需要)。5)使用CLOSE语句关闭游标。
      DECLARE和静态SELECT语句关联
      EXEC SQL DECLARE C1 CURSOR FOR SELECT PNAME,DEPT FROM STAFF WHERE JOB=:host var
      3.5构建嵌入式静态SQL应用程序
      下面通过例程演示了静态SQL语句的使用,实现至多一行的查询,程序查询语句通过SELECT INTO来执行,然后将这数据赋予程序中指定的宿主变量。一条SELECT INTO语句必须只能返回一行或者0行,如果结果集多于一行,就会产生一个错误(SQL CODE -811,SQLSTATE 21000)。
      #include#include#include#include
      #include#include "sqlca.h"#ifdef DB268K
      #
      int main(int argc, char *argv[])
      { EXEC SQL BEGIN DECLARE SECTION; char user_name[18];
      char user_id[12];
      char user_pswd[18];
      EXEC SQL END DECLARE SECTION;
      printf("Sample Cprogram: STATIC\n");
      if(argc==1)
      {
      EXEC SQL CONNECT TO sample;
      CHECKERR ("CONNECT TO SAMPLE");}
      else if (argc==3)
      {strcpy (user_id, argv[1]);
      Strcpy (user_pswd, argv[2] );
      EXEC SQL CONNECT TO SAMPLE USER :user_id using :user_pswd;
      CHECKERR("CONNECT TO SAMPLE");
      }
      Else
      {printf("\nUSAGE: static [user_id user_pswd]\n\n); Return 1;}
      EXEC SQL SELECT FIRSTNME INTO :user_name
      FROM employee
      WHERE LASTNAME=’JOHNSON’; CHECKERR("SELECT statement");
      printf ("First name=%s\n",user_name); EXEC SQL CONNECT RESET;
      CHECKERR("CONNECT RESET");
      RETURN 0;
      }
      4结论
      针对嵌入式静态SQL应用与开发,在通常情况下:程序需要处理SQL语句频率较高,压力大或SQL语句较为简单且已知不变的,可以选用静态SQL开发;目前,商业DB2应用程序采用的大多是静态SQL,特点是一次BIND,多次稳定运行,省去了数据库每次寻找ACCESS PATH的OVER HEAD,并且,如果环境迁移,只须重新BIND,而不需要重新编译应用程序或该产品配置。
      参考文献:
      [1]管松,肖振春,张建伟,等.DB2 V9/9.5高级应用开发[M].北京:电子工业出版社,2009.
      [2]刘耸柏.DB2入门与提高[M].北京:清华大学出版社,2002.
      [3]Roger E.Sanders.DB2通用数据库API开发人员指南[M].杨正洪,译.北京:电子工业出版社,2001.

    相关热词搜索: 静态 嵌入式 实践 DB2

    • 文学百科
    • 故事大全
    • 优美句子
    • 范文
    • 美文
    • 散文
    • 小说文章