AnIntroductiontoDatabaseSystem数据库系统概论AnIntroductiontoDatabaseSystem第八章数据库编程xx大学信息学院AnIntroductiontoDatabaseSystem第八章数据库编程8.1嵌入式SQL8.2过程化SQL8.3存储过程和函数8.4ODBC编程*8.5OLEDB*8.6JDBC编程8.7小结AnIntroductiontoDatabaseSystem8.1嵌入式SQLSQL语言提供了两种不同的使用方式交互式嵌入式为什么要引入嵌入式SQLSQL语言是非过程性语言事务处理应用需要高级语言这两种方式细节上有差别,在程序设计的环境下,SQL语句要做某些必要的扩充AnIntroductiontoDatabaseSystem8.1嵌入式SQL8.1.1嵌入式SQL的处理过程8.1.2嵌入式SQL语句与主语言之间的通信8.1.3不用游标的SQL语句8.1.4使用游标的SQL语句8.1.5动态SQLAnIntroductiontoDatabaseSystem8.1.1嵌入式SQL的处理过程主语言嵌入式SQL是将SQL语句嵌入程序设计语言中,被嵌入的程序设计语言,如C、C++、Java,称为宿主语言,简称主语言。处理过程预编译方法AnIntroductiontoDatabaseSystem嵌入式SQL的处理过程(续)关系数据库管理系统预处理程序转换嵌入式SQL语句为函数调用含嵌入式SQL语句的主语言程序转换后的主语言程序主语言编译程序编译处理目标语言程序AnIntroductiontoDatabaseSystem嵌入式SQL的处理过程(续)为了区分SQL语句与主语言语句,所有SQL语句必须加前缀EXECSQL,主语言为C语言时,语句格式:EXECSQLSQL语句;AnIntroductiontoDatabaseSystem8.1嵌入式SQL8.1.1嵌入式SQL的处理过程8.1.2嵌入式SQL语句与主语言之间的通信8.1.3不用游标的SQL语句8.1.4使用游标的SQL语句8.1.5动态SQLAnIntroductiontoDatabaseSystem8.1.2嵌入式SQL语句与主语言之间的通信将SQL嵌入到高级语言中混合编程,程序中会含有两种不同计算模型的语句SQL语句描述性的面向集合的语句负责操纵数据库高级语言语句过程性的面向记录的语句负责控制逻辑流程它们之间应该如何通信?AnIntroductiontoDatabaseSystem嵌入式SQL语句与主语言之间的通信(续)数据库工作单元与源程序工作单元之间的通信(1)向主语言传递SQL语句的执行状态信息,使主语言能够据此控制程序流程,主要用SQL通信区实现(2)主语言向SQL语句提供参数,主要用主变量实现(3)将SQL语句查询数据库的结果交主语言处理,主要用主变量和游标实现AnIntroductiontoDatabaseSystem1.SQL通信区SQLCA:SQLCommunicationAreaSQLCA是一个数据结构SQLCA的用途SQL语句执行后,系统反馈给应用程序信息描述系统当前工作状态描述运行环境这些信息将送到SQL通信区中应用程序从SQL通信区中取出这些状态信息,据此决定接下来执行的语句AnIntroductiontoDatabaseSystemSQL通信区(续)SQLCA使用方法定义SQLCA用EXECSQLINCLUDESQLCA定义使用SQLCASQLCA中有一个存放每次执行SQL语句后返回代码的变量SQLCODE如果SQLCODE等于预定义的常量SUCCESS,则表示SQL语句成功,否则表示出错应用程序每执行完一条SQL语句之后都应该测试一下SQLCODE的值,以了解该SQL语句执行情况并做相应处理AnIntroductiontoDatabaseSystem2.主变量主变量嵌入式SQL语句中可以使用主语言的程序变量来输入或输出数据在SQL语句中使用的主语言程序变量简称为主变量(HostVariable)AnIntroductiontoDatabaseSystem主变量(续)主变量的类型输入主变量由应用程序对其赋值,SQL语句引用输出主变量由SQL语句对其赋值或设置状态信息,返回给应用程序AnIntroductiontoDatabaseSystem主变量(续)指示变量是一个整型变量,用来“指示”所指主变量的值或条件一个主变量可以附带一个指示变量(IndicatorVariable)指示变量的用途指示输入主变量是否为空值检测输出变量是否为空值,值是否被截断AnIntroductiontoDatabaseSystem主变量(续)在SQL语句中使用主变量和指示变量的方法说明主变量和指示变量BEGINDECLARESECTION......(说明主变量和指示变量)...ENDDECLARESECTIONAnIntroductiontoDatabaseSystem主变量(续)在SQL语句中使用主变量和指示变量的方法(续)使用主变量说明之后的主变量可以在SQL语句中任何一个能够使用表达式的地方出现为了与数据库对象名(表名、视图名、列名等)区别,SQL语句中的主变量名前要加冒号(:)作为标志使用指示变量指示变量前也必须加冒号标志必须紧跟在所指主变量之后AnIntroductiontoDatabaseSystem主变量(续)在SQL语句之外(主语言语句中)使用主变量和指示变量的方法可以直接引用,不必加冒号AnIntroductiontoDatabaseSystem3.游标为什么要使用游标SQL语言与主语言具有不同数据处理方式SQL语言是面向集合的,一条SQL语句原则上可以产生或处理多条记录主语言是面向记录的,一组主变量一次只能存放一条记录仅使用主变量并不能完全满足SQL语句向应用程序输出数据的要求嵌入式SQL引入了游标的概念,用来协调这两种不同的处理方式AnIntroductiontoDatabaseSystem游标(续)游标游标是系统为用户开设的一个数据缓冲区,存放SQL语句的执行结果每个游标区都有一个名字用户可以用SQL语句逐一从游标中获取记录,并赋给主变量,交由主语言进一步处理AnIntroductiontoDatabaseSystem4.建立和关闭数据库连接(1)建立数据库连接EXECSQLCONNECTTOtarget[ASconnection-name][USERuser-name];target是要连接的数据库服务器常见的服务器标识串,如dbname@hostname:port包含服务器标识的SQL串常量DEFAULTAnIntroductiontoDatabaseSystem建立和关闭数据库连接(续)connect-name是可选的连接名,连接名必须是一个有效的标识符在整个程序内只有一个连接时可以不指定连接名程序运行过程中可以修改当前连接EXECSQLSETCONNECTIONconnection-name|DEFAULT;AnIntroductiontoDatabaseSystem建立和关闭数据库连接(续)(2)关闭数据库连接EXECSQLDISCONNECT[connection];AnIntroductiontoDatabaseSystem5.程序实例[例8.1]依次检查某个系的学生记录,交互式更新某些学生年龄。EXECSQLBEGINDECLARESECTION;/*主变量说明开始*/charDeptname[20];charHsno[9];charHsname[20];charHssex[2];intHSage;intNEWAGE;EXECSQLENDDECLARESECTION;/*主变量说明结束*/longSQLCODE;EXECSQLINCLUDESQLCA;/*定义SQL通信区*/AnIntroductiontoDatabaseSystem程序实例(续)intmain(void)/*C语言主程序开始*/{intcount=0;charyn;/*变量yn代表yes或no*/printf(Pleasechoosethedepartmentname(CS/MA/IS):);scanf(%s,deptname);/*为主变量deptname赋值*/EXECSQLCONNECTTOTEST@localhost:54321USERSYSTEM/MANAGER;/*连接数据库TEST*/EXECSQLDECLARESXCURSORFOR/*定义游标SX*/SELECTSno,Sname,Ssex,Sage/*SX对应的语句*/FROMStudentWHERESDept=:deptname;EXECSQLOPENSX;/*打开游标SX,指向查询结果的第一行*/AnIntroductiontoDatabaseSystem程序实例(续)for(;;)/*用循环结构逐条处理结果集中的记录*/{EXECSQLFETCHSXINTO:HSno,:Hsname,:HSsex,:HSage;/*推进游标,将当前数据放入主变量*/if(SQLCA.SQLCODE!=0)/*SQLCODE!=0,表示操作不成功*/break;/*利用SQLCA中的状态信息决定何时退出循环*/if(count++==0)/*如果是第一行的话,先打出行头*/printf(\n%-10s%-20s%-10s%-10s\n,Sno“,Sname“,Ssex,Sage);printf(%-10s%-20s%-10s%-10d\n“,HSno,Hsname,Hssex,HSage);/*打印查询结果*/printf(“UPDATEAGE(y/n)?”);/*询问用户是否要更新该学生的年龄*/do{scanf(%c,&yn);}while(yn!='N'&&yn!='n'&&yn!='Y'&&yn!='y');AnIntroductiontoDatabaseSystem程序实例(续)if(yn=='y'||yn=='Y')/*如果选择更新操作*/{printf(INPUTNEWAGE:);scanf(%d,&NEWAGE);/*用户输入新年龄到主变量中*/EXECSQLUPDATEStudent/*嵌入式SQL更新语句*/SETSage=:NEWAGEWHERECURRENTOFSX;}/*对当前游标指向的学生年龄进行更新*/}EXECSQLCLOSESX;/*关闭游标SX,不再和查询结果对应*/EXECSQLCOMMITWORK;/*提交更新*/EXECSQLDISCONNECTTEST;/*断开数据库连接*/}AnIntroductiontoDatabaseSystem8.1嵌入式SQL8.1.1嵌入式SQL的处理过程8.1.2嵌入式SQL语句与主语言之间的通信8.1.3不用游标的SQL语句8.1.4使用游标的SQL语句8.1.5动态SQLAnIntroductiontoDatabaseSystem8.1.3不用游标的SQL语句不用游标的SQL语句的种类说明性语句数据定义语句数据控制语句查询结果为单记录的SELECT语句非CURRENT形式的增删改语句AnIntroductiontoDatabaseSystem不用游标的SQL语句(续)1.查询结果为单记录的SELECT语句2.非CURRENT形式的增删改语句AnIntroductiontoDatabaseSystem1.查询结果为单记录的SELECT语句这类语句不需要使用游标,只需用INTO子句指定存放查询结果的主变量。[例8.2]根据学生号码查询学生信息。EXECSQLSELECTSno,Sname,Ssex,Sage,SdeptINTO:Hsno,:Hname,:Hsex,:Hag