《数据厍设计与开发》讲义 3.数据库应用程序体系结构 数据库系统是指在计算机系统中引入数 据库后的系统,般由数据库、数据库管 理系统、应用系统、DBA、用户组成 ·本章介绍数据库应用程序的数据访问与 数据库应用系统的体系结构 3.1嵌入式SQ 3.2事务处理技术 3.3数据库应用系统体系结构 3.4中间件 家邮电大学物你学院 部明80080
北京邮电大学软件学院 郭文明 2003.06 《数据库设计与开发》讲义 3. 数据库应用程序体系结构 • 数据库系统是指在计算机系统中引入数 据库后的系统,一般由数据库、数据库管 理系统、应用系统、DBA、用户组成。 • 本章介绍数据库应用程序的数据访问与 数据库应用系统的体系结构。 3.1嵌入式SQL 3.2事务处理技术 3.3数据库应用系统体系结构 3.4中间件
《数据厍设计与开发》讲义 3.1嵌入式SQL 为什么使用嵌入式SQL? 有些数据访问任务对于交互式的非过程的SQL是无 法完成的任务 使用交互式SQL,必须知道表名、列名并且能够写 出符合语法的SQL语句 实际的应用系统是非常复杂的,数据库访问只是其 中一个部件。有些动作如与用户交互、图形化显示 数据等只能用高级语言实现。 嵌入到过程性主语言中使用的SQL称为嵌入式 SQL。主语言可以是C或Java(不一定是 Windows环境)也可以是 Visual basic, Delphi ( Windows环境)等。 ORACLE的Pro*C即是使用嵌入式SQL的平台。 家邮电大学物你学院 部明80080
北京邮电大学软件学院 郭文明 2003.06 《数据库设计与开发》讲义 3.1 嵌入式SQL • 为什么使用嵌入式SQL? —有些数据访问任务对于交互式的非过程的SQL是无 法完成的任务。 —使用交互式SQL,必须知道表名、列名并且能够写 出符合语法的SQL语句。 —实际的应用系统是非常复杂的,数据库访问只是其 中一个部件。有些动作如与用户交互、图形化显示 数据等只能用高级语言实现。 • 嵌入到过程性主语言中使用的SQL称为嵌入式 SQL 。 主 语 言 可 以 是 C 或 Java( 不 一 定 是 Windows环境).也可以是Visual Basic, Delphi (Windows环境)等。 • ORACLE的Pro*C即是使用嵌入式SQL的平台
《数据厍设计与开发》讲义 3.1嵌入式SQL 把SL嵌入主语言使用时必须解决的三个问题: 1.区分SQL语句与主语言语句,用 EXEC SQL开始 2.数据库工作单元和程序工作单元之间的通信 SQL语句可以使用主语言的程序变量(简称主 变量)这些变量名前加冒号(:)作标志,以区别于 字段名。这些变量由 BEGIN DECLARE SECTION与 END DECLARE SECTION语句之间说明 主语言中不能引用数据库中的字段变量 SQL语句执行后,系统要反馈给应用程序若干 信息,这些信息送到SQL的通信区 SQLCA。 SQLCA 用语句 EXEC SQL INCLUDE加以定义。 3.一个SQL语句原则上可产生或处理一组记录, 而主语言一次只能处理一个记录,为此必须协调 两种处理方式。这是用游标来解决的 家邮电大学物你学院 部明80080
北京邮电大学软件学院 郭文明 2003.06 《数据库设计与开发》讲义 3.1 嵌入式SQL • 把SQL嵌入主语言使用时必须解决的三个问题: 1.区分 SQL语句与主语言语句,用EXEC SQL开始. 2.数据库工作单元和程序工作单元之间的通信. SQL语句可以使用主语言的程序变量(简称主 变量),这些变量名前加冒号(:)作标志,以区别于 字段名。这些变量由BEGIN DECLARE SECTION与 END DECLARE SECTION语句之间说明. 主语言中不能引用数据库中的字段变量. SQL语句执行后,系统要反馈给应用程序若干 信息,这些信息送到SQL的通信区SQLCA。SQLCA 用语句EXEC SQL INCLUDE加以定义。 3.一个SQL语句原则上可产生或处理一组记录, 而主语言一次只能处理一个记录,为此必须协调 两种处理方式。这是用游标来解决的
《数据厍设计与开发》讲义 3.1嵌入式SQL 嵌入式SQL的执行 预处理器把嵌入的S①L语句从主程 主语言+嵌入 序命令中分离出来,转换成相应 SL 的主语言语句.例 预处理 1UNIX环境下,程序员创建包含 SQL的 main bc 的源程序 2 Oracle程序员调用预编译器: 主语言+函数调用 proc Iname-main pc 生成 main. c,其中SQL语句被纯c 主语言编译器 语句( Orcale运行期库函数)替换 3.主语言编译 主语言执行程序 cc- c main. c,生成 main. o目标文件 4.连编生成可执行文件 家邮电大学物你学院 部明80080
北京邮电大学软件学院 郭文明 2003.06 《数据库设计与开发》讲义 3.1 嵌入式SQL 主语言 + 嵌入 SQL 预处理 主语言 + 函数调用 主语言编译器 主语言执行程序 预处理器把嵌入的SQL语句从主程 序命令中分离出来,转换成相应 的主语言语句. 例: 1.UNIX环境下,程序员创建包含 SQL的main.pc的源程序. 2.Oracle程序员调用预编译器: proc iname=main.pc 生成main.c,其中SQL语句被纯c 语句(Orcale运行期库函数)替换. 3.主语言编译 cc -c main.c,生成main.o目标文件. 4. 连编生成可执行文件. • 嵌入式SQL的执行
《数据厍设计与开发》讲义 3.1.1C语言中嵌入式SQL #include =0) #include"prompt. h exec sql include sqlca,/*声明通讯区* exec sql select cname, discnt char cid prompt[=“请输入顾客号:”; into cust name. cust disct int main() from customers where cid= cust id xec sql commit work exec sql begin declare section; printf(客名:%s折扣率:%5.1fn” har cust id[5],cust name[ 14 cust name, cust disct) foat cust disct continue char user name[20],user ped[20] notfound:pin(没找到%s,继续Ⅶn, cust id exec sql end declare section }/*根据输入的顾客I查询顾客信息* /*声明变量* exec sql commit release;/*正常释放连接* exec sql whenever sqlerror goto report error:I return 0 exec sql whenever not found goto notfound /*出错处理*/ report error strcpyluser name, mytest) print dberroro;/*出错信息*/ strcpyuser pwd, test") exec sql rollback release;/释放连接* exec sql connect:user name return 1 identified by user pwd;/*连接* 家邮电大学物你学院 部明80080
北京邮电大学软件学院 郭文明 2003.06 《数据库设计与开发》讲义 3.1.1 C语言中嵌入式SQL #include #include “prompt.h” exec sql include sqlca; /*声明通讯区*/ char cid_prompt[]=“请输入顾客号:”; int main( ) { exec sql begin declare section; char cust_id[5],cust_name[14]; float cust_discnt; char user_name[20],user_ped[20]; exec sql end declare section; /*声明变量*/ exec sql whenever sqlerror goto report_error; exec sql whenever not found goto notfound; /*出错处理*/ strcpy(user_name,”mytest”); strcpy(user_pwd,”test”); exec sql connect :user_name identified by :user_pwd; /*连接*/ while((prompt(cid_prompt,1,cust_id,4))>=0) { exec sql select cname,discnt into :cust_name,:cust_discnt from customers where cid=:cust_id; exec sql commit work; printf(“顾客名: %s 折扣率: %5.1f\n”, cust_name,cust_discnt); continue; notfound: printf(“没找到 %s,继续\n”,cust_id); } /*根据输入的顾客ID查询顾客信息*/ exec sql commit release; /*正常释放连接*/ return 0; report_error: print_dberror(); /*出错信息*/ exec sql rollback release; /*释放连接*/ return 1; }
《数据厍设计与开发》讲义 3.1.1C语言中嵌入式SQL 区分SQL语句与C语言语句 嵌入的SQL语句以 EXEC SQL开始,以分号(;)结束。 FF exec sql select came disct into: cust name, cust disct from customers where cid= cust id 嵌入SQL语句与C语言之间的数据传递 宿主变量(宿主变量出现于SQL语句中时,前面加(:) 以区别列名) C变量既可以用在C语句中,也可用在SQL语句中, 用来在两者之间传递数据 家邮电大学物你学院 部明80080
北京邮电大学软件学院 郭文明 2003.06 《数据库设计与开发》讲义 3.1.1 C语言中嵌入式SQL • 区分SQL语句与C语言语句 嵌入的SQL语句以EXEC SQL开始,以分号(;)结束。 例:exec sql select came,discnt into :cust_name,:cust_discnt from customers where cid=:cust_id; • 嵌入SQL语句与C语言之间的数据传递 宿主变量(宿主变量出现于SQL语句中时,前面加(:) 以区别列名) C变量既可以用在C语句中,也可用在SQL语句中, 用来在两者之间传递数据
《数据厍设计与开发》讲义 3.1.1C语言中嵌入式SQL 宿主变量的声明 在嵌入式SQL语句中使用宿主变量,必须先声明它们 声明为通常的C变量,并将其放在下列标识语句之间, EXEC SQL BEGIN DECLARE SECTION EXEC SQL END DECLARE SECTION 1651: exec sql begin declare section char cust_ id[5] =co01 char cust name[14/: float cust disct exec sql end declare section; 家邮电大学物你学院 部明80080
北京邮电大学软件学院 郭文明 2003.06 《数据库设计与开发》讲义 3.1.1 C语言中嵌入式SQL • 宿主变量的声明 在嵌入式SQL语句中使用宿主变量,必须先声明它们: 声明为通常的C变量,并将其放在下列标识语句之间, EXEC SQL BEGIN DECLARE SECTION EXEC SQL END DECLARE SECTION 例: exec sql begin declare section; char cust_id[5]=‘c001’; char cust_name[14]; float cust_discnt; exec sql end declare section;
《数据厍设计与开发》讲义 3.1.1C语言中嵌入式SQL 在SQL中建立连接和释放连接 在一个嵌入式SQL程序开始,程序面临着和交互式用户 同样的问题:怎样与数据库建立连接. 例: exec sql begin declare section;/*声明变量* char user_name[10,user__ped[ 10], exec sql end declare section; strcpy( user name,' mytest);/*变量赋值*/ strcpy (user_pwd test; exec sql connect user_name identified by: user_pwd;/* Oracle连接*/ 例: exec sql commit release;/* Oracle断开连接*/ exec sql roll back release;/* Oracle断开连接* 家邮电大学物你学院 部明80080
北京邮电大学软件学院 郭文明 2003.06 《数据库设计与开发》讲义 3.1.1 C语言中嵌入式SQL • 在SQL中建立连接和释放连接 在一个嵌入式SQL程序开始,程序面临着和交互式用户 同样的问题:怎样与数据库建立连接. 例: exec sql begin declare section; /*声明变量*/ char user_name[10],user_ped[10]; exec sql end declare section; strcpy(user_name,’mytest’); /*变量赋值*/ strcpy(user_pwd,’test’); exec sql connect :user_name identified by :user_pwd; /*Oracle连接*/ 例:exec sql commit release;/*Oracle断开连接*/ exec sql rollback release;/*Oracle断开连接*/
《数据厍设计与开发》讲义 3.1.2游标 ·SQL与主语言之间操作方式的协调 SQL:一次一集 C语言:一次一记录。 游标:在査询结果的记录集合中移动的指针。 若一个SQL语句返回单个元组,则不用游标 若一个SQL语句返回多个元组,则使用游标 不需要游标的数据操作 结果是一个元组的 selec语句 exec sql select came, disct into: cust name, cust disct from customers where cid= cust id 家邮电大学物你学院 部明80080
北京邮电大学软件学院 郭文明 2003.06 《数据库设计与开发》讲义 3.1.2 游标 • SQL与主语言之间操作方式的协调 SQL:一次一集合。 C语言:一次一记录。 – 游标:在查询结果的记录集合中移动的指针。 若一个SQL语句返回单个元组,则不用游标。 若一个SQL语句返回多个元组,则使用游标。 – 不需要游标的数据操作 • 结果是一个元组的select语句 exec sql select came,discnt into :cust_name,:cust_discnt from customers where cid=:cust_id;
《数据厍设计与开发》讲义 3.1.2游标 需要游标的数据操作 当 select语句的结果中包含多个元组时,使用游标可 以逐个存取这些元组。 活动集: select语句返回的元组的集合 当前行:活动集中当前处理的那一行。游标即是指 向当前行的指针。 游标分类 滚动游标:游标的位置可以来回移动,可在活动 集中取任意元组。 非滚动游标:只能在活动集中顺序地取下一个元 组 更新游标:数据库对游标指向的当前行加锁,当 程序读下一行数据时,本行数据解锁,下一行数 据加锁 家邮电大学物你学院 部明80080
北京邮电大学软件学院 郭文明 2003.06 《数据库设计与开发》讲义 3.1.2 游标 – 需要游标的数据操作 当select语句的结果中包含多个元组时,使用游标可 以逐个存取这些元组。 活动集:select语句返回的元组的集合。 当前行:活动集中当前处理的那一行。游标即是指 向当前行的指针。 游标分类: • 滚动游标:游标的位置可以来回移动,可在活动 集中取任意元组。 • 非滚动游标:只能在活动集中顺序地取下一个元 组。 • 更新游标:数据库对游标指向的当前行加锁,当 程序读下一行数据时,本行数据解锁,下一行数 据加锁