版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第八章数据库编程8.1存储过程8.2数据库访问技术8.3嵌入式SQLAnIntroductiontoDatabaseSystem第八章数据库编程8.1存储过程AnIntrodu8.3嵌入式SQLSQL语言提供了两种不同的使用方式:交互式嵌入式(embeddedSQL)为什么要引入嵌入式SQLSQL语言是非过程性语言事务处理应用需要高级语言这两种方式细节上有差别,在程序设计的环境下,SQL语句要做某些必要的扩充AnIntroductiontoDatabaseSystem8.3嵌入式SQLSQL语言提供了两种不同的使用方式:An8.3嵌入式SQL8.3.1嵌入式SQL的处理过程8.3.2嵌入式SQL语句与主语言之间的通信8.3.3动态SQL8.3.4小结AnIntroductiontoDatabaseSystem8.3嵌入式SQL8.3.1嵌入式SQL的处理过程AnI8.1.1嵌入式SQL的处理过程宿主语言嵌入式SQL是将SQL语句嵌入程序设计语言中,被嵌入的程序设计语言,如C、C++、Java,称为宿主语言,简称主语言。处理过程预编译方法AnIntroductiontoDatabaseSystem8.1.1嵌入式SQL的处理过程宿主语言AnIntrod嵌入式SQL的处理过程(续)为了区分SQL语句与主语言语句,所有SQL语句必须加前缀EXECSQL,以(;)结束:EXECSQL<SQL语句>;AnIntroductiontoDatabaseSystem嵌入式SQL的处理过程(续)为了区分SQL语句与主语言语句8.3嵌入式SQL8.3.1嵌入式SQL的处理过程8.3.2嵌入式SQL语句与主语言之间的通信8.3.3动态SQL8.3.4小结AnIntroductiontoDatabaseSystem8.3嵌入式SQL8.3.1嵌入式SQL的处理过程AnI嵌入式SQL语句分类AnIntroductiontoDatabaseSystem嵌入式SQL语句分类AnIntroductiontoD嵌入式SQL语句说明性部分(在C语言中)AnIntroductiontoDatabaseSystem嵌入式SQL语句说明性部分(在C语言中)AnIntrodu8.3.2嵌入式SQL语句与主语言之间的通信将SQL嵌入到高级语言中混合编程,程序中会含有两种不同计算模型的语句SQL语句描述性的面向集合的语句负责操纵数据库高级语言语句过程性的面向记录的语句负责控制程序流程它们之间应该如何通信?AnIntroductiontoDatabaseSystem8.3.2嵌入式SQL语句与主语言之间的通信将SQL嵌入到嵌入式SQL语句与主语言之间的通信(续)数据库工作单元与源程序工作单元之间的通信:1.SQL通信区向主语言传递SQL语句的执行状态信息使主语言能够据此控制程序流程2.宿主变量主语言向SQL语句提供参数将SQL语句查询数据库的结果交主语言进一步处理3.游标解决集合性操作语言与过程性操作语言的不匹配AnIntroductiontoDatabaseSystem嵌入式SQL语句与主语言之间的通信(续)数据库工作单元与源一、SQL通信区SQLCA:SQLCommunicationAreaSQLCA是一个数据结构SQLCA的用途SQL语句执行后,RDBMS反馈给应用程序信息描述系统当前工作状态描述运行环境这些信息将送到SQL通信区SQLCA中应用程序从SQLCA中取出这些状态信息,据此决定接下来执行的语句AnIntroductiontoDatabaseSystem一、SQL通信区SQLCA:SQLCommunicatiSQL通信区SQLCA使用方法:定义SQLCA
用EXECSQLINCLUDESQLCA定义使用SQLCASQLCA中有一个存放每次执行SQL语句后返回代码的变量SQLCODE如果SQLCODE等于预定义的常量SUCCESS,则表示SQL语句成功,否则表示出错应用程序每执行完一条SQL语句之后都应该测试一下SQLCODE的值,以了解该SQL语句执行情况并做相应处理AnIntroductiontoDatabaseSystemSQL通信区SQLCA使用方法:AnIntroductioSQL通信区小结AnIntroductiontoDatabaseSystemSQL通信区小结AnIntroductiontoDat二、宿主变量宿主变量嵌入式SQL语句中可以使用主语言的程序变量来输入或输出数据在SQL语句中使用的主语言程序变量简称为宿主变量(HostVariable)AnIntroductiontoDatabaseSystem二、宿主变量宿主变量AnIntroductionto宿主变量(续)
宿主变量的类型输入宿主变量输出宿主变量一个宿主变量有可能既是输入宿主变量又是输出宿主变量AnIntroductiontoDatabaseSystem宿主变量(续)宿主变量的类型AnIntroduction宿主变量(续)
指示变量:一个宿主变量可以附带一个指示变量(IndicatorVariable)什么是指示变量指示变量的用途AnIntroductiontoDatabaseSystem宿主变量(续)指示变量:AnIntroductiont宿主变量(续)
在SQL语句中使用宿主变量和指示变量的方法1)说明宿主变量和指示变量BEGINDECLARESECTION ......... .........(说明宿主变量和指示变量) .........ENDDECLARESECTIONAnIntroductiontoDatabaseSystem宿主变量(续)在SQL语句中使用宿主变量和指示变量的方法A宿主变量(续)[例1]AnIntroductiontoDatabaseSystem宿主变量(续)[例1]AnIntroductionto宿主变量(续)
2)使用宿主变量说明之后的宿主变量可以在SQL语句中任何一个能够使用表达式的地方出现为了与数据库对象名(表名、视图名、列名等)区别,SQL语句中的宿主变量名前要加冒号(:)作为标志3)使用指示变量指示变量前也必须加冒号标志必须紧跟在所指宿主变量之后AnIntroductiontoDatabaseSystem宿主变量(续)2)使用宿主变量AnIntroducti宿主变量(续)
在SQL语句之外(主语言语句中)使用宿主变量和指示变量的方法可以直接引用,不必加冒号AnIntroductiontoDatabaseSystem宿主变量(续)在SQL语句之外(主语言语句中)使用宿主变量三、游标(cursor)为什么要使用游标SQL语言与主语言具有不同数据处理方式SQL语言是面向集合的,一条SQL语句原则上可以产生或处理多条记录主语言是面向记录的,一组宿主变量一次只能存放一条记录仅使用宿主变量并不能完全满足SQL语句向应用程序输出数据的要求嵌入式SQL引入了游标的概念,用来协调这两种不同的处理方式AnIntroductiontoDatabaseSystem三、游标(cursor)为什么要使用游标AnIntrodu游标(续)游标游标是系统为用户开设的一个数据缓冲区,存放SQL语句的执行结果每个游标区都有一个名字用户可以用SQL语句逐一从游标中获取记录,并赋给宿主变量,交由主语言进一步处理AnIntroductiontoDatabaseSystem游标(续)游标AnIntroductiontoDat嵌入式SQL语句可执行部分嵌入式DDL,QL,DML,DCLConnect语句格式EXECSQLCONNECTTOtarget[ASconnection-name][USERuser-name];
target是要连接的数据库服务器:常见的服务器标识串,如<dbname>@<hostname>:<port>包含服务器标识的SQL串常量DEFAULTconnect-name是可选的连接名,连接必须是一个有效的标识符AnIntroductiontoDatabaseSystem嵌入式SQL语句可执行部分嵌入式DDL,QL,DML,DCL嵌入式SQL语句可执行部分(续)插入语句返回单个值的选择语句
AnIntroductiontoDatabaseSystem嵌入式SQL语句可执行部分(续)插入语句AnIntrodu嵌入式SQL语句可执行部分(续)返回一组值的选择语句AnIntroductiontoDatabaseSystem嵌入式SQL语句可执行部分(续)返回一组值的选择语句AnI嵌入式SQL语句可执行部分(续)返回一组值的选择语句AnIntroductiontoDatabaseSystem嵌入式SQL语句可执行部分(续)返回一组值的选择语句AnI嵌入式SQL语句可执行部分(续)返回一组值的选择语句AnIntroductiontoDatabaseSystem嵌入式SQL语句可执行部分(续)返回一组值的选择语句AnI返回一组值的选择语句[例2]AnIntroductiontoDatabaseSystem返回一组值的选择语句[例2]AnIntroduction程序实例[例3]依次检查某个系的学生记录,交互式更新某些学生年龄。EXECSQLBEGINDECLARESECTION;/*宿主变量说明开始*/ chardeptname[64]; charHSno[64]; charHSname[64]; charHSsex[64]; int HSage; int NEWAGE;EXECSQLENDDECLARESECTION;/*宿主变量说明结束*/EXECSQLINCLUDEsqlca;/*定义SQL通信区*/AnIntroductiontoDatabaseSystem程序实例[例3]依次检查某个系的学生记录,交互式更新某些学生intmain(void)/*C语言主程序开始*/{ int count=0; charyn;/*变量yn代表yes或no*/ printf("Pleasechoosethedepartmentname(CS/MA/IS):"); scanf("%s",deptname);/*为宿主变量deptname赋值*/ EXECSQLCONNECTTOTEST@localhost:54321USER"SYSTEM"/"MANAGER";/*连接数据库TEST*/ EXECSQLDECLARESXCURSORFOR/*定义游标*/ SELECTSno,Sname,Ssex,Sage/*SX对应语句的执行结果*/ FROMStudent WHERESDept=:deptname; EXECSQLOPENSX;/*打开游标SX便指向查询结果的第一行*/AnIntroductiontoDatabaseSystemintmain(void)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');
AnIntroductiontoDatabaseSystemfor(;;)
if(yn=='y'||yn=='Y')/*如果选择更新操作*/ { printf("INPUTNEWAGE:"); scanf("%d",&NEWAGE);/*用户输入新年龄到宿主变量中*/ EXECSQLUPDATEStudent /*嵌入式SQL*/ SETSage=:NEWAGE WHERECURRENTOFSX; }/*对当前游标指向的学生年龄进行更新*/}EXECSQLCLOSESX;/*关闭游标SX不再和查询结果对应*/ EXECSQLCOMMITWORK;/*提交更新*/ EXECSQLDISCONNECTTEST;/*断开数据库连接*/}AnIntroductiontoDatabaseSystem if(yn=='y'||yn=='Y')小结AnIntroductiontoDatabaseSystem小结AnIntroductiontoDatabase8.3嵌入式SQL8.3.1嵌入式SQL的处理过程8.3.2嵌入式SQL语句与主语言之间的通信8.3.3动态SQL8.3.4小结AnIntroductiontoDatabaseSystem8.3嵌入式SQL8.3.1嵌入式SQL的处理过程AnI8.3.3动态SQL静态嵌入式SQL静态嵌入式SQL语句能够满足一般要求无法满足要到执行时才能够确定要提交的SQL语句动态嵌入式SQL允许在程序运行过程中临时“组装”SQL语句支持动态组装SQL语句和动态参数两种形式AnIntroductiontoDatabaseSystem8.3.3动态SQL静态嵌入式SQLAnIntrodu动态SQL简介(续)一、使用SQL语句宿主变量(直接执行)二、动态参数三、查询类AnIntroductiontoDatabaseSystem动态SQL简介(续)一、使用SQL语句宿主变量(直接执行)一、使用SQL语句宿主变量AnIntroductiontoDatabaseSystem一、使用SQL语句宿主变量AnIntroductiont使用SQL语句宿主变量(续)[例4]创建基本表TESTEXECSQLBEGINDECLARESECTION;constchar*stmt="CREATETABLEtest(aint);";/*SQL语句宿主变量*/EXECSQLENDDECLARESECTION;......EXECSQLEXECUTEIMMEDIATE:stmt; /*执行语句*/AnIntroductiontoDatabaseSystem使用SQL语句宿主变量(续)[例4]创建基本表TESTA使用SQL语句宿主变量(续)[例5]AnIntroductiontoDatabaseSystem使用SQL语句宿主变量(续)[例5]AnIntroduct二、动态参数AnIntroductiontoDatabaseSystem二、动态参数AnIntroductiontoDatab动态参数(续)动态参数SQL语句中的可变元素使用参数符号(?)表示该位置的数据在运行时设定和宿主变量的区别动态参数的输入不是编译时完成绑定而是通过(prepare)语句准备宿主变量和执行(execute)时绑定数据或宿主变量来完成AnIntroductiontoDatabaseSystem动态参数(续)动态参数AnIntroductionto动态参数(续)使用动态参数的步骤: 1.声明SQL语句宿主变量。
2.准备SQL语句(PREPARE)。
EXECSQLPREPARE<语句名>FROM<SQL语句宿主变量>;
AnIntroductiontoDatabaseSystem动态参数(续)使用动态参数的步骤:AnIntroducti动态参数(续)使用动态参数的步骤(续):3.执行准备好的语句(EXECUTE)
EXECSQLEXECUTE<语句名>[INTO<宿主变量表>][USING< 宿主变量或常量>];AnIntroductiontoDatabaseSystem动态参数(续)使用动态参数的步骤(续):AnIntrodu动态参数(续)[例6]向TEST中插入元组。EXECSQLBEGINDECLARESECTION;constchar*stmt="INSERTINTOtestVALUES(?);";/*声明SQL宿主变量*/EXECSQLENDDECLARESECTION;......EXECSQLPREPAREmystmtFROM:stmt;/*准备语句*/......EXECSQLEXECUTEmystmtUSING100;/*执行语句*/EXECSQLEXECUTEmystmtUSING200;/*执行语句*/AnIntroductiontoDatabas
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 《营业税课件》课件
- 《统计调查技能模块》课件
- 《认识宝岛台湾》课件
- 《王老吉的市场营销》课件
- 《网页设计与鉴赏》课件
- 2025年中考语文文言文总复习-教师版-专题01:文言文阅读之理解实词含义(讲义)
- 鞋业生产线采购招标合同三篇
- 教育机构话务员工作总结
- 药品医疗器械销售心得分享
- 儿童感染科护理工作总结
- 四人合伙投资协议书范本
- 成都市农贸市场建设技术要求(2019年版)(完整版)
- 2024-2030年版中国IPVPN服务行业发展现状及投资商业模式分析报告
- 【7历期末】安徽省芜湖市弋江区2023~2024学年七年级上学期期末考试历史试卷(含解析)
- 北京市海淀区2021-2022学年第一学期四年级期末考试语文试卷(含答案)
- 2024-2030年中国企业大学行业运作模式发展规划分析报告
- 房地产激励培训
- 山东省济南市2023-2024学年高二上学期期末考试地理试题 附答案
- 期末复习试题1(试题)-2024-2025学年二年级上册数学北师大版
- 【MOOC】微型计算机原理与接口技术-南京邮电大学 中国大学慕课MOOC答案
- 违章建筑举报范文
评论
0/150
提交评论