SQL查询语言对数据库查询功能是很强的,写SQL查询语句比用一般编程语言编码实现相同的查询要简单得多。但是在有些情况下仍然需要使用一般通用编程语言如PASCAL、C语言等。这是因为SQL语言是非过程化语言,有些查询要求必须通过程序过程实现,包括与用户交互、查询的特殊输出及对数据表中数据较为复杂的处理等。
为此,可将SQL语句嵌入到一般通用编程语言程序中去,SQL语句负责对数据库中数据的提取及操作,它所提取的数据逐行提交给程序,程序中其他语句负责数据的处理和传递。SQL标准定义了许多语言的嵌入式SQL,例PASCAL、PL/1、Fortran、C和Cobol。 SQL语句嵌入的语言称为宿主语言。宿主语言中使用的SQL结构称为嵌入式SQL。
一个使用嵌入式SQL的程序在执行前, 一般要进行两次编译。首先预编译, 嵌入的SQL请求被宿主语言的声明及允许运行时访问数据库的过程所代替。 然后由宿主语言编译且得到执行代码。为使预处理能识别嵌入式SQL语句,在SQL语句前加上“EXEC SQL”标记。
嵌入C或Pascal的查询语句格式为:
EXEC SQL SELECT 目标列INTO:变量 FROM 基本表[或视图][WHERE条件表达式]…
其中主变量为宿主语言程序的变量,前面加“:”作为标识, 以和SQL变量相区分。
例如查找学号为S1的学生姓名、性别、出生年份放到变量xm1,xb1,csnf1中,语句为:EXEC SQL SELECT 姓名,性别,出生年份 INTO :xm1,:xb1,:csnf1 FROM 学生 WHERE 学生号=‘S1’
一般宿主语言执行一次只处理一个元组,而在实际问题中,查询结果是多个元组,则要使用游标。
例如下面一段程序:
EXEC SQL DECLARE C CURSOR FOR SELECT 姓名,性别,出生年份 FROM 学生;
EXEC SQL OPEN C;
LOOP
EXEC SQL FETCH C INTO :xm1,:xb1,:csnf1;
PRINT xm1,xb1,csnf1;
GO TO LOOP
上例中第一句从学生表中选取姓名、性别、出生年份三列形成结果表,并定义游标C。“ OPEN C”激活游标,使C指向第一条记录。在LOOP的循环体内FETCH语句将C所记录的值赋给主变量xm1,xb1,csnf1。宿主语言语句PRINT对取出值进行处理。
循环返回命令GO TO LOOP使上述两句重复执行, 并将游标顺次指向第二行,第三行…直到表的末尾,此时FETEH语句将关闭游标。
嵌入式SQL简介
(1)概念 SQL语言提供了两种不同的使用方式: 一种是在终端交互式方式下使用独立语言由用户在交互环境下运行。另一种是将SQL语言嵌入到某种高级语言中使用,利用高级语言的过程性结构弥补SQL语言在实现复杂应用方面的不足。称为嵌入式SQL(Embedded SQL)。 嵌入SQL的高级语言称为主语言或宿主语言。 PL/1、COBOL、FORTRAN、C语言等可以做为嵌入SQL的高级语言。 | |
一般来讲:在终端交互方式下使用的SQL语句也可用在应用程序中,但是,这两种方式细节上会有许多差别,在程序设计的环境下,SQL语句要做某些必要的扩充。
(2)关于宿主语言的编译 | |
详细信息… | |
DBMS采用两种方法处理宿主型数据库语言SQL,一种是预编译,另一种是修改和扩充主语言使之能处理SQL语句。 目前采用较多的是预编译的方法。即由DBMS的预处理程序对源程序进行扫描,识别出SQL语句,把它们转换成主语言调用语句,以使主语言编译程序能识别它,最后由主语言的编译程序将整个源程序编译成目标码。 更详细的讨论将在第十一章的语言处理。
| |
(3)嵌入式SQL的一般形式 | |
EXEC SQL <SQL语句> ; 说明: *) 其中SQL语句的结束标志则随主语言的不同而不同,例如在PL/1和C中以分号(;)结束,在COBOL中以END-EXEC结束。 | |
举例: | |
详细信息… | |
如下一条交互形式的SQL语句: | |
*) 嵌入SQL语句根据其作用的不同,可分为可执行语句和说明性语句两类。可执行语句又分为数据定义、数据控制、数据操纵三种。 |