普通用户必须通过数据库应用程序来使用
特别复杂的检索结果难以用一条交互式SQL语句完成,此时需要结合高级语言中经常出现的顺序,分支和循环结构帮助处理
嵌入式SQL是将SQL嵌入到某一种高级语言之中,如C/C++,Java等 这种高级语言被称为宿主语言
交互式: select Sname,Sage from Student Where Sname=’张三';
嵌入式(此文宿主语言为C): exec sql select Sname,Sage into :vSname.:vSage from Student where Sname="张三";
在嵌入式SQl程序执行之前,首先要与数据库进行连接
连接:exec sql connect to target-server as connect-name user user-name ;
or exec sql connect to default;
在嵌入式SQL程序执行之后,需要和数据库断开连接
断开连接:exec sql disconnect connect-name;
or exec sql disconnect current;
变量声明:
exec sql begin declare section;
char vSname[10],specName[10]="张三"
int vSage;
exec sql end declare section;
变量使用:变量可传递给SQL语句的where等字句,以便SQL语言能够按照指定的要求进行检索
exec sql select Sname,Sage into :vSname.:vSage from Student where Sname=:specName;
SQL语句在执行过程中,必须有提交和撤销语句才能确认其操作结果
提交: exec sql commit work
撤销: exec sql rollback work
定义:事务是一个存取或改变数据库内容的程序的一次执行,或者说一条或多条SQL语句的一次执行被看做一个事务,一般由应用程序员提出,有开始和结束,结束前需要提交或撤销
事务的特性:
检索单行结果,可以讲结果直接传送到宿主程序的变量中
exec sql select [ALL|DISTINCT] expression [,expression...]
INTO host-variable,[host-variable,...]
From tableref [corr_name][,tableref[corr_name]...]
Where search_condition;
eg:exec sql select Sname,Sage into :vSname.:vSage from Student where Sname=:specName;
游标是指向某检索记录集的指针,通过这个指针的移动,每次读一行,处理一行,再读一行,直到处理完毕
读一行的操作是通过Fetch..into实现的,每一次Fetch,都是先向下移动指针,然后再读取,记录集有结束表示EOF,用来标记后面已经没有记录了
游标的使用需要先定义,再打开,接着一条一条处理,最后关闭
Cursor的定义:
EXEC SQL DECLARE cursor_name CURSOR FOR
Subquery
[ORDER BY result_column [ASC|DESC][,result_column...]]
[FOR [READ ONLY |UPDATE [OF columnname[,columnname....]]]]
eg:
exec sql declare cur_student cursor for
select Sno ,Sname,Sclass from Student where Sclass=:vClass
order by Sno
for read only;
Cursor的打开和关闭
打开: exec sql open cursor_name;
关闭: exec sql close cursor_name;
Cursor的数据读取
exec sql fetch cursor_name
into host-variable,[host-variable,...]
eg:exec sql fetch cur_student into :vSno,:vSname,:vsAGE
查找删除:exec sql delete from tablename [corr_name] where search_condition
eg:exec sql delete from customers c where c.city='Harbin' and not exists (select * from orders o where o.cid=c.cid)
定位删除:exec sql delete form tablename [corr_name] where current of cursor_name
eg:
exec sql declare delcust cursor for
select cid from customers c where c.city='harbin' and not exists(select * from orders o where o.cid=c.cid)
for update of cid;
exec sql open delcust
while(TRUE){
exec sql fetch delcust into :cust_id;
exec sql delete from customers where current of delcust;
}
查找删除:exec sql update tablename [corr_name] SET columname= expr [,columname=expr...] where search_condition
eg:exec sql update student s set sclass='035102' where s.sclass=''034101
定位删除:exec sql update tablename [corr_name] SET columname= expr [,columname=expr...] where current of cursor_name
eg:
exec sql declare stud cursor for
select * from student s where s.class='034101'
for update of sclass;
exec sql open stud
while(TRUE){
exec sql fetch stud into :vSno,:vSname,:vSclass;
exec sql update student set sclass='035102' where current of stud;
}
插入:exec sql insert into tablename [(columnname[,columnname,...])] [values (expr[,expr,...])|subqurey]
eg:exec sql into student (sno,sname,sclass) values('03510128','张三',‘035101’)
状态:是指嵌入式SQL语句的执行状态,尤其指一些出错状态,有时程序需要知道这些状态并对这些状态进行处理
状态捕获及处理由三部分构成
exec sql include sqlca
,其中SQLCA是一个已被声明过的具有C语言的结构形式的内存信息区,其中的成员变量用来记录SQL语句的执行状态,便于宿主程序读取与处理exec sql whenever condition action;
该语句会对气候所有由exec sql语句所引起的对数据库系统的调用自动检查它是否满足条件,condition包括 sqlerror;not found;sqlwarning ,action包括continue;goto;stop;do|call,状态捕获语句Whenever的作用范围是其后的所有exec sql 语句,直到程序中出现另一条相同条件的whenever为止report_error:exec sqlroollback;
静态SQL:SQL语句在程序中已经按要求写好,只需要把一些参数通过变量传送给嵌入式SQL语句即可
eg:
SpecName='张三';
exec sql select Sno,Sname,Sclass into :vSno,:vSname,:vSclass from Student where Sname=:SpecName;
动态SQL:SQL语言可以在程序中动态构造,形成一个字符串,然后再交给DBMS执行,交给DBMS执行时仍然可以传递变量
#include
exec sql include sqlca;
exec sql begin declare section;
char user_name="Scott"; char user_pwd[]="tiger";
char sqltext[]="delete from customers where cid=\'c006\'";
exec sql end declare section;
int main()
{
exec sql whenever sqlerror goto report_error;
exec sql connect :user_name identified by :user_pwd;
exec sql execute immediate :sqltext;
exec sql commit release: return 0;
report_error:print_dberror(); exec sql rollback release :return 1;
}
动态SQL的两种执行方式:
1. 立即执行语句(构造的字符串SQL内部没有变量参数):运行时编译并执行 exec sql execute immediate:host-variable;
2. Prepare-Execute-Using语句(构造的字符串内部有变量参数):Prepare语句先编译,编译后的SQL语句允许动态参数,Execute语句执行,用using语句将动态参数传送给编译好的Sql语句
exec sql prepare sql_temp from :host-variable;
-----
exec sql execute sql_temp using :cond-variable;
定义:ODBC是一种标准—不同语言的应用程序与不同数据库服务器之间通讯的标准
实现:是一组API,应用程序通过调用ODBC API ,可以实现与数据服务器的连接,向数据库服务器发送SQL命令,一条一条的提取数据库检索结果中的元组传送给应用程序的变量,具体的DBMS提供一套驱动程序,即Driver库函数,供ODBC调用,以便实现数据库与应用系统的连接。
应用程序与数据库连接:
ODBC应用前,需要确认具体的DBMS Driver b被安装到ODBC环境中,当应用程序调用ODBC API时,ODBC API会调用具体DBMS Driver 库函数 ,DBMS Driver 库函数则与数据库服务器通讯,执行相应的请求动作并返回检索结果
JDBC是一组Java版的应用程序接口API,提供了Java应用程序与数据库服务器的连接与通讯能力