4-4嵌入式SQL
tags:数据库
为什么会有嵌入式SQL
标准的SQL是非过程化的查询语言,就具有操作统一,面向集合,功能丰富,使用简单等多项优点,但和程序设计语言相比,高度非过程花的优点也造成了它的一个缺点:缺少流程控制能力,难以实现应用业务中的逻辑空值.SQL编程技术可以有效克服SQL语言实现复杂应用方面的不足.提高应用系统和数据库管理系统之间的互操作性.
应用系统中使用sql编程的主要方式
- 嵌入式SQL
- 过程化SQL
- 存储过程和自定义函数
- 开放数据库互连
- JDBC等等
嵌入式SQL处理过程
嵌入式SQL是将SQL语句潜入程序设计语言中,被嵌入的程序设计语言,如C++,JAVA等称为宿主语言,简称主语言.
嵌入式SQL,数据库管理系统一般采用预编译方法处理,即由数据库管理系统的预处理程序对源程序进行扫描,识别出嵌入式SQL语句,把它们转换成主语言调用语句,以使主语言编译程序能识别它们,然后由主语言的编译程序将纯的主语言程序编译成目标码.
在嵌入式SQL中,为了能够快速区分SQL语言与主语言语句,所有SQL语句都必须加前缀.C语言的语法格式为:
EXEC SQL <SQL语句>
嵌入式SQL语句和主语言之间的通信
数据库工作单元域源程序之间的主要通信内容
- 向主语言传递SQL语句的执行状态信息,使主语言能够据此信息空值程序流程,主要用SQL通信区实现.
- 主语言向SQL语句提供参数,主要用主变量实现.
- 将SQL语句查询数据库的结果交给主语言处理,主要使用主变量和游标来实现.
SQL通信区
SQL语句执行后,系统要反馈给应用程序若干信息,主要包括描述系统当前工作状态和运行环境的各种数据.这些信息将送到SQL通信区中,应用程序从SQL通信区中取出这些状态信息,据此决定接下来执行的语句.
SQL通信区在应用程序中用EXEC SQL INCLUDE SQLCA
定义.SQL通信区中有一个变量SQLCODE,用来存放每次执行SQL语句后返回的代码.
每次程序执行完一条SQL语句之后都应该测试一下SQLCODE的值,以了解该SQL语句执行情况并作相应处理.
主变量
嵌入式SQL语句中可以使用主语言程序变量输入或者输出数据.SQL语句中使用的主语言程序变量简称为主变量.
一个主变量可以附带一个任选的指示变量.指示变量是一个整形变量,可以用来指示所指主变量的值或者条件.指示变量可以指示输入主变量是否为空值,可以检测输出主变量是否为空值或者值是否被截断.
游标
SQL是面向集合淡定,一条SQL语句可以产生或者处理多条记录,然而主语言是面向记录的,一组主变量一次只能存放一条记录.所以仅使用主变量并不能完全满足SQL语句向应用程序输出数据的要求,为此嵌入式SQ引入了游标的概念,用游标协调这两种不同的处理方式.
游标是系统为用户开设的一个数据管冲去,存放SQL语句的执行结果,每个游标区都有一个名字.用户可以通过游标逐一获取记录并赋值给主变量,交由主语言进一步处理.
建立和关闭数据库连接
嵌入式SSQL程序要访问数据库必须先连接数据库,关系数据库管理系统根据用户信息对链接请求进行合法性验证,只有通过了身份验证才能建立一个可用的合法链接.
建立数据库链接:
EXEC SQL CONNECT TO target[AS connection-name][User user-name]
关闭数据库链接:
EXEC SQL DISCONNECT[connection]
程序示例
EXEC SQL BEGIN DECLARE SECTION; /*主变量说明开始*/
char HSname[20];
char NEWname[20];
EXEC SQL END DECLARE SECTION; /*主变量声明结束*/
long SQLCODE;
EXEC SQL INCLUDE SQLCODE; /*定义SQL通信区*/
int main()
{
...
EXEC SQL CONNECT TO TEST@localhost:54321 USER"SYSTEM"/"MANAGER";/*连接到数据库TEST*/
EXEC SQL DECLARE SX CURSOR FOR /*定义游标SX*/
select * form student; /*SX对应的语句*/
EXEC SQL OPEN SX; /*打开游标,指向查询结果的第一行*/
for(;;)
{
EXEC SQL FETCH SX INTO: HSname/*推进游标,将当前数据放入主变量*/
}
if(SQLCA.SQLCODE!=0) break;/*利用SQLCA中状态信息判断何时退出循环*/
EXEC SQL UPDATE student set Sname =:NEWname
where current of sx; /*对当前游标指向的学生年龄进行更新*/
EXEC SQL CLOSE SX; /*关闭游标不再和查询结果对应*/
EXEC SQL COMMIT WORK; /*提交更新结果*/
EXEC SQL DISCONNECT TEST;/*断开数据库链接*/
}
打开游标
用open打开游标,打开游标实际上是执行相应的select语句,把结果放到缓冲区中.这时游标处于活动状态,指针指向查询结果集中的第一条记录.
推进游标
EXECSQL FETCH<游标名>
INTO <主变量>[<指示变量>][,<主变量>[<指示变量>]]...
fetch语句把游标指针向前推荐一条记录,同时将缓冲区中的当前记录取出来送至主变量供主语言进一步处理.