重点与难点:数据库语言嵌入到高级语言中使用需要解决的问题—过程及其思维
交互式SQL语言有很多优点:
记录集合操作
非过程性操作:指出要做什么,而不需指出怎样做
一条语句就可实现复杂查询的结果
然而,交互式SQL本身也有很多局限… …
因此,高级语言+SQL语言
既继承高级语言的过程控制性
又结合SQL语言的复杂结果集操作的非过程性
同时又为数据库操作者提供安全可靠的操作方式:通过应用程序进行操作
嵌入式SQL语言
将SQL语言嵌入到某一种高级语言中使用
这种高级语言,如C/C++, Java, PowerBuilder等,又称宿主语言(Host Language)
嵌入在宿主语言中的SQL与前面介绍的交互式SQL有一些不同的操作方式
在嵌入式SQL语句中可以出现宿主语言语句所使用的变量:
exec sql select Sname, Sage into :vSname, :vSage from Student where Sname= :specName;
这些变量需要特殊的声明:
exec sql begin declare section;
char vSname[10], specName[10]=“张三”;
int vSage;
exec sql end declare section;
变量声明和赋值中,要注意:
宿主程序的字符串变量长度应比字符型字段的长度多1个。因宿主程序的字符串尾部多一个终止符为‘\0‘,而程序中用双引号来描述。
宿主程序变量类型与数据库字段类型之间有些是有差异的,有些DBMS可支持自动转换,有些不能。
程序与数据库的连接和断开
在嵌入式SQL程序执行之前,首先要与数据库进行连接
不同DBMS,具体连接语句的语法略有差异
SQL标准中建议的连接语法为:
execsql connecttotarget-server asconnect-name useruser-name;
或
execsql connecttodefault;
Oracle中数据库连接:
execsql connect:user_name identified by :user_pwd;
DB2 UDB中数据库连接:
execsql connecttomydb user:user_name using:user_pwd;
在嵌入式SQL程序执行之后,需要与数据库断开连接
SQL标准中建议的断开连接的语法为:
exec sql disconnect connect-name;
或
exec sql disconnect current;
Oracle中断开连接:
exec sql commit release;
或
exec sql rollback release;
DB2 UDB中断开连接:
exec sql connect reset;
exec sql disconnect current;
SQL执行的提交与撤消
SQL语句在执行过程中,必须有提交和撤消语句才能确认其操作结果
SQL执行的提交:
execsql commitwork;
SQL执行的撤消**:
execsql rollbackwork;
为此,很多DBMS都设计了捆绑提交/撤消与断开连接在一起的语句,以保证在断开连接之前使用户确认提交或撤消先前的工作,例如Oracle中:
execsql commitrelease;
或
execsql rollbackrelease;
事务:
注意:在嵌入式SQL程序中,任何一条数据库操纵语句(如execsqlselect等)都会引发一个新事务的开始,只要该程序当前没有正在处理的事务。而事务的结束是需要应用程序员通过commit或rollback确认的。因此BeginTransaction和EndTransaction两行语句是不需要的。
事务的特性: ACID
原子性Atomicity : DBMS能够保证事务的一组更新操作是原子不可分的,即对DB而言,要么全做,要么全不做
一致性Consistency: DBMS保证事务的操作状态是正确的,符合一致性的操作规则,它是进一步由隔离性来保证的
隔离性Isolation: DBMS保证并发执行的多个事务之间互相不受影响。例如两个事务T1和T2, 即使并发执行,也相当于或者先执行了T1,再执行T2;或者先执行了T2, 再执行T1。
持久性Durability: DBMS保证已提交事务的影响是持久的,被撤销事务的影响是可恢复的。
换句话说:具有ACID特性的若干数据库基本操作的组合体被称为事务。
重点与难点:怎样在高级语言中处理数据集—游标的使用技巧
单行结果处理与多行结果处理的差异(Into子句与游标(Cursor))
游标(Cursor)的使用需要先定义、再打开(执行)、接着一条接一条处理,最后再关闭
exec sql declare cur_student cursor for
select Sno, Sname, Sclass from Student where Sclass=‘035101’ ;
exec sql open cur_student;
exec sql fetch cur_student into :vSno, :vSname, :vSclass;
… …
exec sql close cur_student;
游标可以定义一次,多次打开(多次执行),多次关闭
ODBC支持的可滚动Cursor
标准的游标始终是自开始向结束方向移动的,每fetch一次,向结束方向移动一次;一条记录只能被访问一次;再次访问该记录只能关闭游标后重新打开
ODBC(OpenDataBase Connectivity)是一种跨DBMS的DB操作平台,它在应用程序与实际的DBMS之间提供了一种通用接口
许多实际的DBMS并不支持可滚动游标,但通过ODBC可以使用该功能
可滚动游标是可使游标指针在记录集之间灵活移动、使每条记录可以反复被访问的一种游标
NEXT向结束方向移动一条; PRIOR向开始方向移动一条;FIRST回到第一条;LAST移动到最后一条;ABSOLUTvalue_spec定向检索指定位置的行,value_spec由1至当前记录集最大值;RELATIVEvalue_spec相对当前记录向前或向后移动,value_spec为正数向结束方向移动,为负数向开始方向移动
可滚动游标移动时需判断是否到结束位置,或到起始位置
一种是查找删除(与交互式DELETE语句相同),一种是定位删除
EXEC SQL DELETE FROM tablename [corr_name]
WHERE search_condition | WHERE CURRENT OF cursor_name;
一种是查找更新(与交互式Update语句相同),一种是定位更新
EXEC SQL UPDATE tablename [corr_name]
SET columnname = expr [, columnname = expr …]
[ WHERE search_condition ] | WHERE CURRENT OF cursor_name
重点与难点:错误捕获机制—设置错误陷阱与SQLCA的作用与使用
状态,是嵌入式SQL语句的执行状态,尤其指一些出错状态;有时程序需要知道这些状态并对这些状态进行处理
嵌入式 SQL程序中,状态捕获及处理有三部分构成:
状态捕获语句:exec sql whenever condition action;
Whenever语句的作用是设置一个“条件陷阱”, 该条语句会对其后面的所有由Exec SQL语句所引起的对数据库系统的调用自动检查它是否满足条件(由condition指出)
如果满足condition, 则要采取一些动作(由action指出)
典型DBMS系统记录状态信息的三种方法: