建立数据库后就要开发应用系统了。本章讲解在应用系统中如何使用编程方法对数据库进行操纵的技术。
标准SQL是非过程化的查询语言,具有操作统一、面向集合、功能丰富、使用简单等多项优点。但和程序设计语言相比,高度非过程化的优点也造成了它的一个弱点:缺少流程控制能力,难以实现应用业务中的逻辑控制。SQL编程技术可以有效克服SQL语言实现复杂应用方面的不足,提高应用系统和数据库管理系统间的互操作性。
在应用系统中使用SQL编程来访问和管理数据库中数据的方式主要有:嵌入式SQL(Embedded SQL,ESQL)、过程化SQL(Procedural Language/SQL,PL/SQL)、存储过程和自定义函数、开放数据库互连(Open Data Base Connectivity, ODBC)、 OLE DB(Object Linking and Embedding DB)、Java数据库连接 (Java Data Base Connectivity,JDBC)等编程方式。本章中将讲解这些编程技术的概念和方法。
嵌入式SQL
本书第3章已经讲到,SQL的特点之一是在交互式和嵌入式两种不同的使用方式下,SQL的语法结构基本上是一致的。当然在程序设计环境下,SQL语句要做某些必要的扩充。
嵌入式SQL的处理过程
嵌入式SQL是将SQL语句嵌入程序设计语言中,被嵌入的程序设计语言,如C、C++、Java等称为宿主语言,简称主语言。
对嵌入式SQL,数据库管理系统一般采用预编译方法处理,即由数据库管理系统的预处理程序对源程序进行扫描,识别出嵌入式SQL语句,把它们转换成主语言调用语句,以使主语言编译程序能识别它们,然后由主语言的编译程序将纯的主语言程序编译成目标码。嵌入式SQL基本处理过程如下图所示。

在嵌入式SQL中,为了能够快速区分SQL语句与主语言语句,所有SQL语句都必须加前级。当主语言为C语言时,语法格式为
EXEC SQL <SQL 语句>;
我们使用这个语法格式。
如果主语言为Java,则嵌入式SQL称为SQLJ,语法格式为
#SQL {<SQL语句>};
嵌入式SQL语句与主语言之间的通信
将SQL嵌入到高级语言中混合编程,SQL语句负责操纵数据库,高级语言语句负责控制逻辑流程。这时程序中会含有两种不同计算模型的语句,它们之间应该如何通信呢?
数据库工作单元与源程序工作单元之间的通信主要包括:
(1)向主语言传递SQL语句的执行状态信息,使主语言能够据此信息控制程序流程,主要用SQL通信区(SQL Communication Area, SQLCA)实现。
(2)主语言向SQL语句提供参数,主要用主变量(host variable)实现。
(3)将SQL语句查询数据库的结果交主语言处理,主要用主变量和游标(cursor)实现。
①SQL通信区
SQL语句执行后,系统要反馈给应用程序若干信息,主要包括描述系统当前工作状态和运行环境的各种数据。这些信息将送到SQL通信区中,应用程序从SQL通信区中取出这些状态信息,据此决定接下来执行的语句。
SQL通信区在应用程序中用EXEC SQL INCLUDE SQLCA加以定义。SQL通信区中有一个变量SQLCODE,用来存放每次执行SQL语句后返回的代码。
应用程序每执行完一条SQL语句之后都应该测试一下SQLCODE的值,以了解该SQL语句执行情况并做相应处理。如果SQLCODE等于预定义的常量SUCCESS,则表示SQL语句成功,否则在SQLCODE存放错误代码。程序员可以根据错误代码查找问题。
②主变量
嵌入式SQL语句中可以使用主语言的程序变量来输入或输出数据。SQL语句中使用的主语言程序变量简称为主变量。主变量根据其作用的不同分为输入主变量和输出主变量。输入主变量由应用程序对其赋值,SQL语句引用;输出主变量由SQL语句对其赋值或设置状态信息,返回给应用程序。
一个主变量可以附带一个任选的指示变量(indicator variable)。指示变量是一个整型变量,用来“指示”所指主变量的值或条件。指示变量可以指示输入主变量是否为空值,可以检测输出主变量是否为空值,值是否被截断。
所有主变量和指示变量必须在SQL语句BEGIN DECLARE SECTION与END DECLARE SECTION之间进行说明。说明之后,主变量可以在 SQL 语句中任何一个能够使用表达式的地方出现,为了与数据库对象名(表名、视图名、列名等)区别,SQL语句中的主变量名和指示变量前要加冒号(:)作为标志。
③游标
SQL是面向集合的,一条SQL语句可以产生或处理多条记录;而主语言是面向记录的,一组主变量一次只能存放一条记录。所以仅使用主变量并不能完全满足SQL语句向应用程序输出数据的要求,为此嵌入式SQL引入了游标的概念,用游标来协调这两种不同的处理方式。
游标是系统为用户开设的一个数据缓冲区,存放SQL语句的执行结果,每个游标区都有一个名字。用户可以通过游标逐一获取记录并赋给主变量,交由主语言进一步处理。
④建立和关闭数据库连接
嵌入式SQL程序要访问数据库必须先连接数据库,关系数据库管理系统根据用户信息对连接请求进行合法性验证,只有通过了身份验证,才能建立一个可用的合法连接。
(1)建立数据库连接
建立连接的嵌入式SQL语句是
EXEC SQL CONNECT TO target [AS cormection-name] [USER user-name];
其中:
target是要连接的数据库服务器,它可以是一个常见的服务器标识串,如<dbname>@<hostname>:<port>,可以是包含服务器标识的SQL串常量,也可以是DEFAULT。
Connection-name是可选的连接名,连接名必须是一个有效的标识符,主要用来识别一个程序内同时建立的多个连接,如果在整个程序内只有一个连接,也可以不指定连接名。
如果程序运行过程中建立了多个连接,执行的所有数据库单元的工作都在该操作提交时所选择的当前连接上。程序运行过程中可以修改当前连接,对应的嵌入式SQL语句为:
EXEC SQL SET CONNECTION connection-name | DEFAULT;
(2)关闭数据库连接
当某个连接上的所有数据库操作完成后,应用程序应该主动释放所占用的连接资源。
关闭数据库连接的嵌入式SQL语句是:
EXEC SQL DISCONNECT [connection];
其中:
connection是EXEC SQL CONNECT所建立的数据库连接。
⑤程序实例
为了能够更好地理解有关概念,下面给出一个简单的嵌入式SQL编程实例。
【例1】依次检查某个系的学生记录,交互式更新某些学生年龄。
左右滑动或点击查看全图










