- 1、本文档共20页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第十章
ESQL/C中单记录的检索和查询
本章讲述使用SELECT语句进行单个记录的检索。
上面是交互式SELECT语句的一般语法。例如,在DBACCESS中,就使用该语法。你马上就会看到,在C代码中嵌入使用只是略有不同。
SELECT 说明TableList中列出的表的哪些字段要投影到结果表中。 FROM 说明投影操作所基于的源表,可以是基表或视图。 WHERE 如果有的话,说明过滤条件和连接条件,即从TableList列出的对象中检索出的记录要满足的条件。 GROUP BY 说明对记录分组时使用的字段。 HAVING 如果有的话,说明字段,用于GROUP BY子句产生的中间表。 ORDER BY 如果有的话,说明字段,用于主次排序。 INTO TEMP 如果有的话,说明临时表,用于存放结果。
SELECT通常产生一个包含有多条记录的表,称之为结果表。
例子 讨论 1 从表customer中选择三个字段:fname、lname和phone,选择所有的记录,结果不排序。 2 从表order中选择所有的字段,这是由星号指明的。选择所有的记录,结果不排序。 3 选择zipcode和phone的头三个字符。选择所有的记录;结果按区号降序排列,对于相同的区号,按zipcode升序排列。 4 从表orders中选择所有的字段,但是,选择的记录要满足条件:字段backlog的值是(y(,字段ship_instruct的值非空。 5 选择字段order_num和count(*)—每个定单的项目数。(必须按order_num字段分组,这样才可以统计每个定单的项目数。)
SELECT通常产生一个包含有多条记录的表,称之为结果表。但是,C的应用程序自己无法一次处理多个记录。所以,必须在SQL的一次处理一个集合的方式和C的应用程序一次处理一条记录的方式之间架起某种桥梁。
数据库服务器、ESQL/C函数库和sqlhdr.h头文件提供了称为游标(cursor)的机制,架起了这座桥梁。
游标是一个SQL对象,但仅对嵌入式的SQL起作用。可以把游标想象成一个提供指针功能的对象,可以提供它来访问集合中的多个记录。游标将在其它章节详细讨论。
当结果表仅包含有一条记录时,我们把产生该表的SELEC语句称为单记录SELECT语句。单记录SELECT语句常常用来验证一个值是否存在或查找一个给定值或相关值。
在上面的例子中,因为SELECT#1有一个基于主键(manu_code是厂家的唯一标识,在该字段上有一个值唯一的索引)的过滤条件,SELECT语句仅返回一条记录,如果存在有记录的话。
如果存在这样的一条记录,SQLCODE的值为0。
如果不存在这样的一条记录,SQLCODE的值为SQLNOTFOUND。
如果SELECT语句返回多个记录,如SELECT#2语句,SQLCODE的值为负,表明产生错误。
当ESQL/C程序中嵌入一条单记录SELECT语句时,而且没有使用INTO TEMP子句,则必须在内存中分配一个输出区域用来存放检索得到的记录。可以通过INTO子句来指定这样的一个区域。
当使用INTO子句时,则不能使用INTO TEMP子句。这两条子句是不相容的;当使用嵌入的SELECT语句时,必须要么使用这个子句,要么使用另一个子句。毕竟,必须指定一个地方来存放结果,要么是内存中的一块区域,要么是磁盘上的一个临时表。
数据存放到宿主变量时按位置次序,即选择字段列表的第一项同第一个宿主变量相关联,第二项同第二个变量相关联,如此类推。
同所选择字段列表的项数相比较,当在INTO子句中列出了太多或太少的宿主变量时,数据库服务器报告有问题发生—
ANSI兼容 SQLERROR
非ANSI兼容 SQLWARNING(sqlwarn3被设置)
当数据库不能把SQL数据转换成接收宿主变量的类型时,返回SQLERROR。
当没有记录能满足过滤条件,服务器返回SQLNOTFOUND。
上面的例子产生几点疑惑,如果SELECT语句确实返回了一条记录,但是,如果检索的值有一个或多个为空值或被截断,则会怎样?
两种情形都很特别,出现的情形我们称之为数据异常。
当可能产生数据异常时,应当提供指示变量(indicator variable)。这类的变量是一般的C变量,同宿主变量一起使用。当数据库服务器检索到SQL空值或截断一些字符数据时,使用指示变量来指明发生数据异常。
在使用指示变量之前,必须为esql声明它们。例如,这些变量的声明可以当作指示变量—
$short NameInd;
$char AddressInd;
$string ZipInd[5];
指示变量可以是除了DATETIME和INTERVAL之外的任何类型。但是,通常把指示变量声明
您可能关注的文档
最近下载
- 中华民族大家庭课件.pptx
- 大型混凝土墙体胶合板模板免钻孔支拆施工工法.doc VIP
- 新兴产业投资集团全面推行末等调整或不胜任退出机制管理办法.doc VIP
- GB-T 451.3-2002 纸和纸板厚度的测定.pdf
- 22J403-1 楼梯 栏杆 栏板一 (1).docx VIP
- 车辆租用加油合同范本8篇.docx
- 年产30万吨原铝的电解车间设计 .docx
- 2025年交管12123 APP驾驶证学法减分题库和答案(共300题)【2025年新版交规题库】.docx
- 车库耐磨地面空鼓、裂缝防治分析32页PPT.ppt VIP
- 公司管理人员竞争上岗、末等调整和不胜任退出实施办法.pdf VIP
文档评论(0)