《数据厍设计与开发》讲义 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 <stdio h while((prompt(cid prompt, 1, cust id, 4))>=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 <stdio.h> #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; }