网站大量收购独家精品文档,联系QQ:2885784924

10.ESQL/C中单记录的检索和查询.doc

  1. 1、本文档共20页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 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之外的任何类型。但是,通常把指示变量声明

文档评论(0)

xcs88858 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

版权声明书
用户编号:8130065136000003

1亿VIP精品文档

相关文档