AnIntroductiontoDatabaseSystem数据库系统概论AnIntroductiontoDatabaseSystem第三章关系数据库标准语言SQL(续4)AnIntroductiontoDatabaseSystem第三章关系数据库标准语言SQL3.1SQL概述3.2数据定义3.3查询3.4数据更新3.5视图3.6数据控制3.7嵌入式SQL3.8小结AnIntroductiontoDatabaseSystem3.7嵌入式SQLSQL语言提供了两种不同的使用方式:交互式嵌入式为什么要引入嵌入式SQLSQL语言是非过程性语言事务处理应用需要高级语言这两种方式细节上有差别,在程序设计的环境下,SQL语句要做某些必要的扩充AnIntroductiontoDatabaseSystem3.7.1嵌入式SQL的一般形式为了区分SQL语句与主语言语句,需要:前缀:EXECSQL结束标志:随主语言的不同而不同以C为主语言的嵌入式SQL语句的一般形式EXECSQLSQL语句;例:EXECSQLDROPTABLEStudent;以COBOL作为主语言的嵌入式SQL语句的一般形式EXECSQLSQL语句END-EXEC例:EXECSQLDROPTABLEStudentEND-EXECAnIntroductiontoDatabaseSystemDBMS处理宿主型数据库语言SQL的方法预编译修改和扩充主语言使之能处理SQL语句AnIntroductiontoDatabaseSystem预编译1.由DBMS的预处理程序对源程序进行扫描,识别出SQL语句2.把它们转换成主语言调用语句,以使主语言编译程序能识别它3.最后由主语言的编译程序将整个源程序编译成目标码。AnIntroductiontoDatabaseSystem嵌入SQL语句说明性语句嵌入SQL语句数据定义可执行语句数据控制数据操纵允许出现可执行的高级语言语句的地方,都可以写可执行SQL语句允许出现说明语句的地方,都可以写说明性SQL语句AnIntroductiontoDatabaseSystem3.7.2嵌入式SQL语句与主语言之间的通信将SQL嵌入到高级语言中混合编程,程序中会含有两种不同计算模型的语句SQL语句描述性的面向集合的语句负责操纵数据库高级语言语句过程性的面向记录的语句负责控制程序流程AnIntroductiontoDatabaseSystem工作单元之间的通信方式1.SQL通信区向主语言传递SQL语句的执行状态信息主语言能够据此控制程序流程2.主变量1)主语言向SQL语句提供参数2)将SQL语句查询数据库的结果交主语言进一步处理3.游标解决集合性操作语言与过程性操作语言的不匹配AnIntroductiontoDatabaseSystem1.SQL通信区SQLCA:SQLCommunicationAreaSQLCA是一个数据结构SQLCA的用途SQL语句执行后,DBMS反馈给应用程序信息描述系统当前工作状态描述运行环境这些信息将送到SQL通信区SQLCA中应用程序从SQLCA中取出这些状态信息,据此决定接下来执行的语句AnIntroductiontoDatabaseSystemSQLCA的内容与所执行的SQL语句有关与该SQL语句的执行情况有关例:在执行删除语句DELETE后,不同的执行情况,SQLCA中有不同的信息:违反数据保护规则,操作拒绝没有满足条件的行,一行也没有删除成功删除,并有删除的行数无条件删除警告信息由于各种原因,执行出错AnIntroductiontoDatabaseSystemSQLCA的使用方法定义SQLCA用EXECSQLINCLUDESQLCA加以定义使用SQLCASQLCA中有一个存放每次执行SQL语句后返回代码的变量SQLCODE如果SQLCODE等于预定义的常量SUCCESS,则表示SQL语句成功,否则表示出错应用程序每执行完一条SQL语句之后都应该测试一下SQLCODE的值,以了解该SQL语句执行情况并做相应处理AnIntroductiontoDatabaseSystem2.主变量什么是主变量嵌入式SQL语句中可以使用主语言的程序变量来输入或输出数据在SQL语句中使用的主语言程序变量简称为主变量(HostVariable)AnIntroductiontoDatabaseSystem主变量(续)主变量的类型输入主变量由应用程序对其赋值,SQL语句引用输出主变量由SQL语句赋值或设置状态信息,返回给应用程序一个主变量有可能既是输入主变量又是输出主变量AnIntroductiontoDatabaseSystem主变量(续)主变量的用途输入主变量指定向数据库中插入的数据将数据库中的数据修改为指定值指定执行的操作指定WHERE子句或HAVING子句中的条件输出主变量获取SQL语句的结果数据获取SQL语句的执行状态AnIntroductiontoDatabaseSystem主变量(续)指示变量一个主变量可以附带一个指示变量(IndicatorVariable)什么是指示变量整型变量用来“指示”所指主变量的值或条件指示变量的用途输入主变量可以利用指示变量赋空值输出主变量可以利用指示变量检测出是否空值,值是否被截断AnIntroductiontoDatabaseSystem主变量(续)在SQL语句中使用主变量和指示变量的方法1)说明主变量和指示变量BEGINDECLARESECTION..................(说明主变量和指示变量).........ENDDECLARESECTIONAnIntroductiontoDatabaseSystem主变量(续)2)使用主变量说明之后的主变量可以在SQL语句中任何一个能够使用表达式的地方出现为了与数据库对象名(表名、视图名、列名等)区别,SQL语句中的主变量名前要加冒号(:)作为标志AnIntroductiontoDatabaseSystem主变量(续)3)使用指示变量指示变量前也必须加冒号标志必须紧跟在所指主变量之后AnIntroductiontoDatabaseSystem主变量(续)在SQL语句之外(主语言语句中)使用主变量和指示变量的方法可以直接引用,不必加冒号AnIntroductiontoDatabaseSystem3.游标(cursor)为什么要使用游标SQL语言与主语言具有不同数据处理方式SQL语言是面向集合的,一条SQL语句原则上可以产生或处理多条记录AnIntroductiontoDatabaseSystem游标(续)主语言是面向记录的,一组主变量一次只能存放一条记录仅使用主变量并不能完全满足SQL语句向应用程序输出数据的要求嵌入式SQL引入了游标的概念,用来协调这两种不同的处理方式AnIntroductiontoDatabaseSystem游标(续)什么是游标游标是系统为用户开设的一个数据缓冲区,存放SQL语句的执行结果每个游标区都有一个名字用户可以用SQL语句逐一从游标中获取记录,并赋给主变量,交由主语言进一步处理AnIntroductiontoDatabaseSystem嵌入式SQL语句与主语言之间的通信(续)小结在嵌入式SQL中,SQL语句与主语言语句分工非常明确SQL语句:直接与数据库打交道主语言语句1.控制程序流程2.对SQL语句的执行结果做进一步加工处理AnIntroductiontoDatabaseSystem嵌入式SQL语句与主语言之间的通信(续)SQL语句用主变量从主语言中接收执行参数,操纵数据库SQL语句的执行状态由DBMS送至SQLCA中主语言程序从SQLCA中取出状态信息,据此决定下一步操作如果SQL语句从数据库中成功地检索出数据,则通过主变量传给主语言做进一步处理SQL语言和主语言的不同数据处理方式通过游标来协调AnIntroductiontoDatabaseSystem嵌入式SQL语句与主语言之间的通信(续)*例:带有嵌入式SQL的一小段C程序............EXECSQLINCLUDESQLCA;/*(1)定义SQL通信区*/EXECSQLBEGINDECLARESECTION;/*(2)说明主变量*/CHARtitle_id(7);CHARtitle(81);INTroyalty;EXECSQLENDDECLARESECTION;AnIntroductiontoDatabaseSystem嵌入式SQL语句与主语言之间的通信(续)main(){EXECSQLDECLAREC1CURSORFORSELECTtit_id,tit,royFROMtitles;/*(3)游标操作(定义游标)*//*从titles表中查询tit_id,tit,roy*/EXECSQLOPENC1;/*(4)游标操作(打开游标)*/AnIntroductiontoDatabaseSystem嵌入式SQL语句与主语言之间的通信(续)for(;;){EXECSQLFETCHC1INTO:title_id,:title,:royalty;/*(5)游标操作(将当前数据放入主变量并推进游标指针)*/if(sqlca.sqlcodeSUCCESS)/*(6)利用SQLCA中的状态信息决定何时退出循环*/break;printf(TitleID:%s,Royalty:%d,:title_id,:royalty);printf(Title:%s,:title);/*打印查询结果*/}EXECSQLCLOSEC1;/*(7)游标操作(关闭游标)*/}AnIntroductiontoDatabaseSystem3.7嵌入式SQL3.7.1嵌入式SQL的一般形式3.7.2嵌入式SQL语句与主语言之间的通信3.7.3不用游标的SQL语句3.7.4使用游标的SQL语句3.7.5动态SQL简介AnIntroductiontoDatabaseSystem3.7.3不用游标的SQL语句不用游标的SQL语句的种类说明性语句数据定义语句数据控制语句查询结果为单记录的SELECT语句非CURRENT形式的UPDATE语句非CURRENT形式的DELETE语句INSERT语句AnIntroductiontoDatabaseSystem一、说明性语句说明性语句是专为在嵌入式SQL中说明主变量、SQLCA等而设置的说明主变量1.EXECSQLBEGINDECLARESECTION;2.EXECSQLENDDECLARESECTION;这两条语句必须配对出现,相当于一个括号,两条语句中间是主变量的说明说明SQLCA3.EXECSQLINCLUDESQLCAAnIntroductiontoDatabaseSystem二、数据定义语句例1建立一个“学生”表StudentEXECSQLCREATETABLEStudent(SnoCHAR(5)NOTNULLUNIQUE,SnameCHAR(20),SsexCHAR(1),SageINT,SdeptCHAR(15));AnIntroductiontoDatabaseSystem数据定义语句(续)数据定义语句中不允许使用主变量例:下列语句是错误的EXECSQLDROPTABLE:table_name;AnIntroductiontoDatabaseSystem三、数据控制语句例2把查询Student表权限授给用户U1EXECSQLGRANTSELECTONTABLEStudentTOU1;AnIntroductiontoDatabaseSystem四、查询结果为单记录的SELECT语句语句格式EXECSQLSELECT[ALL|DISTINCT]目标列表达式[,目标列表达式]...INTO主变量[指示变量