- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
6在INFORMIX-ESQL/C中使用简单变量
第六章
在INFORMIX-ESQL/C中
使用简单变量
本章讲解如何使用C变量来保存简单的SQL数据,即字符和数值。
使用C变量来保存复杂的SQL数据将在其它的章节里详细讨论。下面列出来的是复杂的SQL数据类型:
VARCHAR
DECIMAL 和 MONEY
DATETIME 和 INTERVAL
BYTE 和 TEXT
宿主变量存放SQL数据。正因如此,必须定义兼容的类型来存放SQL数据。
当数据从内存中写到数据库中时,数据库服务器把数据从C的数据类型转换成SQL的数据类型,当把数据从数据库中读到内存中时,Informix把数据从SQL的数据类型转换成C的数据类型。由用户负责定义适当类型的宿主变量。
上图列出了SQL的数据类型和C的数据类型之间的隐含的关系。如果没有象上面这样来定义宿主变量,数据库服务器将尝试自动转换(如果转换有意义的话)。
例如,这里举出了两种这样的情形,数据库服务器试图把一种数据类型转换成另一种类型:
在WHERE字句中,把字符字段同整数相比较,如下:
where zipcode 90000
在算术表达式中不同类型的值一起运算,如下:
set unit_price = unit_price * ( 1 + $PercentLf )
在这类的表达式中,所有的值在运算之前转换成decimal类型。
INFORMIX-SQL/C使用DECIMAL类型来进行算术表达式中的所有的运算,由结果变量的类型来决定要存储或打印的结果的格式。
表达式中所有的值,如果不是DECIMAL类型,则转换成DECIMAL类型,而且,运算的结果是DECIMAL类型。上图中列出了这类表达式里的值在进行转换后的精度和格式。
如果表达式中的某个值是浮点decimal数,则结果是浮点decimal数。
当结果类型导致精度丢失时,ESQSL/C返回一个错误。
当把数据从一种类型转换成另一种类型时,数据库服务器可能会遇到问题,从而产生警告或错误信息。
当把数据转换成字符类型时,可能遇到的唯一问题是接收区太小,这样会产生一个警告。下面就是产生警告信息的两个例子:
一个字段定义为char(5),而用户试图插入字符串“Heritage Furniture”。在本例中,字符串被截断,字段存放的字符串为“Herit”。
一个字段定义为char(5),而用户试图插入六位数字的整数940852。此处,该数字被忽略,字段中存放的是由五个星号组成的字符串。
当把数据转换成某些数值类型时,可能遇到的唯一问题是有效数字的丢失,这样就会导致产生一个错误。下面就是产生错误信息的两个例子:
一个字段定义为DATE类型,而用户试图把获取的一个日期值存放到一个短整型的宿主变量中。
一个字段存放的是邮政编码,定义为类型char(5),用户试图把获取到的邮编值“94085”存放到一个短整型的宿主变量中。
在这两种产生错误的情形里,都是接收区太小。如果进行数据转换的话,将会丢失有效数字。所以,两个宿主变量存放的都是未定义值。
存贮到磁盘上时,如果SQL字符值的长度比分配的空间要短,则使用空格来填充。
CHAR宿主变量接受以连续空格结尾的SQL数据,并在数组的末尾加上一个空值作为结束符。为避免数据被截断,定义时类型的长度要比SQL数据的长度大一。
ESQL/C可以定义指向字符串的指针,但是,它们作为宿主变量时,不能指向单个字符。所有字符类型的数据,除一个例外,都当作以空值结尾的数组。例如,定义单个字符变量或只有一个元素的字符数组:
$char AnswerLc; $char AnswerLc[1];
数据库服务器返回值时,以空值结束字符串,这样可能重写邻近的内存。同时,当它从用户程序接收值时,查找作为结束符的空值。
所以,字符指针指向的空间必须足够大,以存放所需要的数据。该代码段示例了指向字符的指针的正确用法:
$char *BufLcp[ARRAY]; BufLcp = calloc(ARRAY,2);
stcopy(“y”,BufLcp[0]);
$update orders ... where backlog = $BufLcp[0];
当使用字符指针来从SELECT语句接收数据,预编译器给出一个警告,而且,数据可能被截断。
除了CHAR和*CHAR,INFORMIX-ESQL/C提供另两种数据类型:STRING和FIXCHAR。还有另一种字符类型VARCHAR,因为它是一种复杂类型,将在别的章节讨论。
STRING类型在加上空值结束符时,截断结尾的空格。为避免截断数据,把该类型的长度定义为比SQL数据的长度大一,以容纳空值。
FIXCHAR同CHAR一样,除了不加上结尾的空值来结束字符串。为避免截断数据,把该类型的长度定义为同SQL数据的长度一样。
通常使
文档评论(0)