Posted on 2010-01-11 18:14
Prayer 阅读(3322)
评论(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