Prayer

在一般中寻求卓越
posts - 1256, comments - 190, trackbacks - 0, articles - 0
  C++博客 :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理

嵌入式SQL介绍

Posted on 2010-01-11 18:14 Prayer 阅读(3282) 评论(0)  编辑 收藏 引用 所属分类: 数据库,SQL

SQL语言是基于关系数据模型的语言,而高级语言是基于整数、实数、字符、记录、数组等数据类型,因此两者之间尚有很大差别。如:SQL语句不能直接使用指针、数组等数据结构,而高级语言一般不能直接进行集合运算。为了能在宿主语言的
程序中嵌入SQL语句,必须做某些规定。
  本节主要介绍嵌入式SQL的一些使用规定和使用技术。
   SQL语言的使用有两种方式:
(1)在终端交互方式下独立使用的SQL称为交互式SQL。
(2)嵌入到程序设计语言中(即宿主语言)使用的SQL称为嵌入式SQL。
  

   嵌入式SQL须解决下列几个问题:

  (1)如何将嵌有SQL的宿主语言程序编译成可执行码(这是首要问题)。
  (2)宿主语言和DBMS之间如何传递数据和信息。
  (3)如何将查询结果赋值给宿主语言程序中的变量(通过游标语句)。
  (4)宿主语言与SQL之间数据类型的转换问题(按系统约定转换)。

  以SQL嵌入C为例,说明实现的一般方法。

   如何在C中嵌入SQL?通常是以“EXEC SQL”开始,以“;”结尾。
   SQL与C之间数据的传送通过宿主变量。(即SQL中可引用的C语言变量)
   在SQL语句中引用宿主变量时,为了区别数据库中变量,宿主变量前须加“:”,它可与数据库中变量同名。在宿主语言语句中,宿主变量可与其它变量一样使用,不须加冒号。当宿主变量的数据类型与数据库中不一致时,由系统按约定转换。

   在宿主变量中,有一个系统定义的特殊变量,叫SQLCA(SQL通信区)。它是全局变量。供应用程序与DBMS之间通信用。

   EXEC  SQL  INCLUDE  SQLCA

   SQLCA中有一个分量叫SQLCODE,可表示为:SQLCA.SQLCODE. 它是一个整数,供DBMS向应用程序报告SQL语句执行情况用。

   SQLCODE > 0 ,SQL已执行,但有异常;
   SQLCODE < 0 ,SQL没执行,有错误;
   SQLCODE = 0 ,执行成功, 无异常。
  注:SQLCODE的值与具体含义,不同系统有所区别。 

  允许在嵌入的SQL语句中引用宿主语言的程序变量,但有两条规定:
(1)引用时,这些变量前必须加“:”作为前缀,
以示与数据库中变量区别。
(2)这些“共享变量”有宿主语言的持续定义,并用SQL的DECLARE语句说明。

  例如,在C语言中说明共享变量:
   EXEC  SQL  BEGIN  DECLARE  SECTION;/说明语句开头
         CHAR   SNO [7];
         CHAR   GIVENSNO[7];
         CHAR   CNO[6];
         CHAR   GIVENCNO[6];
         FLOAT  GRADE;
         SHORT  GRADEI;/*GRADEI是GRADE的指示变量,两者必须连用
   EXEC  SQL  END DECLARE  SECTION;/*说明语句结束

   SQL的集合处理方式与宿主语言单记录处理方式的协调
   由于SQL语句可以处理一组记录,而宿主语言语句一次只能处理一个记录,因此需要游标机制,把集合操作转换成单记录方式。

  嵌入式SQL的可执行语句内容包括:嵌入式DDL、QL、DML、及DCL语句,进入数据库的CONNECT语句以及控制事务结束的语句。
   对于SQL DDL语句,只要加上前缀标识“EXEC SQL”和结束标识“;”(对C语言),就能嵌入在宿主语言程序中使用。而SQL DML语句在嵌入使用时,要注意是否使用了游标机制。
   可执行语句格式:
   EXEC SQL CONNECT :uid IDENTIFIED BY :pwd;
   这里uid、pwd为两个宿主变量;uid为用户标识符,pwd为用户的口令。执行CONNECT前由宿主语言程序赋值。只有当CONNECT语句执行成功后才能执行事务处理中的其它可执行语句。

   例:
   EXEC SQL INSERT INTO SC (SNO, CNO, GRADE )
                   VALUES (:SNO, :CNO, :GRADE);
   功能:将一个元组插入到表SC中。
   插入的元组由三个宿主变量构成,由宿主语言程序赋值。  

   例:
   EXEC SQL SELECT GRADE
           INTO :GRADE,:GRADEI
           FROM SC
           WHERE SNO=:GIVENSNO AND CNO=:GIVENCNO;

   功能:查询学生成绩。
   如查询结果只有一个元组,可将结果直接用INTO子句对有关的宿主变量直接赋值。
   如查询结果超过一个元组,需在程序中开辟一个区域,存放查询的结果。该区域及其相应的数据结构称为游标。然后逐个地取出每个元组给宿主变量赋值。   

嵌入式SQL的实现,有两种处理方式:


   (1)扩充宿主语言的编译程序,使之能处理SQL语句;
   (2)采用预处理方式。
    
   目前多数系统采用后一种方式。预处理方式是先用预处理程序对源程序进行扫描,识别出SQL语句,并处理成宿主语言的过程调用语句;然后再用宿主语言的编译程序把源程序编译成目标程序。

 


本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/prayforever/archive/2008/08/06/2778495.aspx


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理