嵌入式SQL是一种将SQL语句直接写入C语言,COBOL,FORTRAN, Ada等编程语言的源代码中的方法。借此方法,可使得应用程序拥有了访问数据以及处理数据的能力。
以下是嵌入式sql基本处理过程:
嵌入式sql语句与主语言之间的通信
sql向主语言传递状态信息,是主语言能控制sql程序流程-sql通信区
主语言向sql提供变量-主变量
sql执行结果交给主语言处理-主变量,游标
sql通信区
SQL语句执行后,系统要反馈给应用程序若干信息,主要包括描述系统当前工作状态和运行环境的各种数据,这些信息将送到SQL通信区SQLCA中。应用程序从SQLCA中取出这些状态信息,据此决定接下来执行的语句。
SQLCA是一个数据结构,在应用程序中用EXEC SQL INCLUDE SQLCA加以定义。
SQLCA中有一个存放每次执行SQL语句后返回代码的变量SQLCODE。
应用程序每执行完一条SQL 语句之后都应该测试一下SQLCODE的值,以了解该SQL语句执行情况并做相应处理。
如果SQLCODE等于预定义的常量SUCCESS,则表示SQL语句成功,否则表示错误代码。
例如在执行删除语句DELETE后,根据不同的执行情况,SQLCA中有下列不同的信息:
·违反数据保护规则,操作拒绝
·没有满足条件的行,一行也没有删除
·成功删除,并有删除的行数(SQLCODE=SUCCESS)
·无条件删除警告信息
·由于各种原因,执行出错
主变量
ESQL语句中可以使用宿主语言的程序变量来输入或输出数据。
把在SQL语句中使用的主语言程序变量简称为宿主变量(Host Variable),或称主变量。主要用于嵌入式SQL与宿主语言之间的数据交流,根据作用的不同可将主变量分为输入变量和输出变量。负责对SQL操作输入参数值的主变量为输入主变量,负责接受SQL操作的返回值的主变量为输出主变量,如果返回值为NULL,将不置入主变量,因为宿主语言一般不能处理空值。
游标
主语言是面向记录的,一组主变量一次只能存放一条记录,仅使用主变量并不能完全满足SQL语句向应用程序输出数据的要求。利用游标来协调这两种不同的处理方式。在数据库开发过程中,当你检索的数据只是一条记录时,你所编写的事务语句代码往往使用SELECT INSERT 语句,需要用游标从某一结果集中逐一地读取一条记录。
不需要使用游标的情况:
- 查询结果为单条记录
这类语句不需要使用游标,只需要用INTO 子句指定存放查询结果的主变量
- 非current形式的增删改语句
在UPDATE的SET子句和WHERE子句中可以使用主变量,SET子句还可以使用指示变量
实例:
[例2] 根据学生号码查询学生信息。假设已经把要查询的学生的学号赋给了主变量givensno。 EXEC SQL SELECT Sno,Sname,Ssex,Sage,Sdept INTO :Hsno, : Hname ,:Hsex,:Hage,:Hdept FROM Student WHERE Sno=:givensno;
[例3] 将计算机系全体学生年龄置NULL值。 Sageid=-1; EXEC SQL UPDATE Student SET Sage=:Raise :Sageid WHERE Sdept= ‘CS‘; 将指示变量Sageid赋一个负值后,无论主变量Raise为何值,RDBMS都会将CS系所有学生的年龄置空值 。 等价于: EXEC SQL UPDATE Student SET Sage=NULL WHERE Sdept= ‘CS‘;
使用游标的sql语句
必须使用游标的SQL 语句
- 查询结果为多条记录的SELECT 语句
- CURRENT 形式的UPDATE 语句
- CURRENT 形式的DELETE 语句
CURRENT 形式的UPDATE 语句和DELETE 语句的用途是面向集合的操作,一次操作所有记录。如果只想修改或删除其中某个记录,用带游标的SELECT 语句查出所有满足条件的记录,从中进一步找出要修改或删除的记录,用CURRENT 形式的UPDATE 语句和DELETE 语句修改或删除之 。
注意:当游标定义中的SELECT 语句带有UNION 或ORDER BY 子句时,该SELECT 语句相当于定义了一个不可更新的视图,就不能使用CURRENT 形式的UPDATE 语句和DELETE 语句。