嵌入式SQL介绍

原创 2011年01月22日 22:13:00

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语句,并处理成宿主语言的过程调用语句;然后再用宿主语言的编译程序把源程序编译成目标程序。

相关文章推荐

用友校招offer总结

2017年9月17号晚上六点,我拿到了用友集团的offer这是个值得高兴和记录的时刻。这是我校招的第一个offer,我想随便写点东西纪念一下。宣讲会9月14号的样子,从学校就业网上看见了用友集团要来招...
  • th1996
  • th1996
  • 2017年09月19日 22:06
  • 165

常用Map实现类对比

翻译人员: 铁锚 翻译时间: 2013年12月12日 原文链接: HashMap vs. TreeMap vs. Hashtable vs. LinkedHashMap Map 是最...
  • renfufei
  • renfufei
  • 2013年12月12日 19:40
  • 12137

嵌入式SQL与主语言的通信

将SQL嵌入到高级语言中混合编程,程序中会含有两种不同计算模型的语句:  (1)SQL语句:描述性的面向集合的语句;负责操纵数据库  (2)高级语言语句:过程性的面向记录的语句;负责控制程序流程。...
  • herobox
  • herobox
  • 2012年06月28日 11:00
  • 1057

4-4嵌入式SQL

4-4嵌入式SQLtags:数据库为什么会有嵌入式SQL 标准的SQL是非过程化的查询语言,就具有操作统一,面向集合,功能丰富,使用简单等多项优点,但和程序设计语言相比,高度非过程花的优点也造成了...

嵌入式SQL

在C语言程序代码中直接嵌入SQL语句,使数据库编程变得非常简单明了,而且嵌入式SQL是一种标准,代码不需要很多的修改就能移植到支持嵌入式SQL的数据库系统上去,但这同时也是一个缺点,许多数据库系统不提...

嵌入式SQL应用

visual studio下嵌入数据库,并利用c/c++进行代码的编写
  • sysuzyc
  • sysuzyc
  • 2016年10月19日 23:10
  • 108

iOS开发:数据库管理系统 :SQL语句 与 SQLite嵌入式数据库

SQL是Structured Query Language(结构化查询语言)的缩写。SQL是专为数据库而建立的操作命令集,是一种功能齐全的数据库语言。 1、数据库的创建与增、删、改、查: 首先...

DB2数据库嵌入式SQL开发

1.1 DB2应用程序开发概述 1.1.1    程序结构 DB2应用程序包括以下几个部分: 1.声明和初始化变量 2.连接到数据库 3.执行一个或者多个事务 4.与数据库断开连接 5.结束程序 一个...

71、嵌入式SQL与主语言的通信

将SQL嵌入到高级语言中混合编程,程序中会含有两种不同计算模型的语句:  (1)SQL语句:描述性的面向集合的语句;负责操纵数据库  (2)高级语言语句:过程性的面向记录的语句;负责控制程序流程。...
  • shRootm
  • shRootm
  • 2012年03月06日 10:52
  • 351

DB2数据库、事务控制语言、系统控制语言、函数、嵌入式SQL(SQLJ)

事务控制语言     1.事务提交命令: Commit; 2.事务回退命令: Rollback;  系统控制语言 1.         取消自动提交:       Update comma...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:嵌入式SQL介绍
举报原因:
原因补充:

(最多只允许输入30个字)