Chinaunix首页 | 论坛 | 博客
  • 博客访问: 5520787
  • 博文数量: 763
  • 博客积分: 12108
  • 博客等级: 上将
  • 技术积分: 15717
  • 用 户 组: 普通用户
  • 注册时间: 2007-09-28 21:21
个人简介

业精于勤,荒于嬉

文章分类

全部博文(763)

文章存档

2018年(6)

2017年(15)

2016年(2)

2015年(31)

2014年(14)

2013年(87)

2012年(75)

2011年(94)

2010年(190)

2009年(38)

2008年(183)

2007年(28)

分类: DB2/Informix

2008-04-27 19:39:58

ESQL/C的数据类型
一、 
1、SQL与C数据类型的对应 
简单类型 
SQL       C 
CHAR(n) char(n+1) 
CHARCTER(n) char * 
SMALLINT short int 
INTERGER 
INT long int 
SMALLFLOAT 
REAL float 
FLOAT 
DOUBLE PRECISIONdouble 
SERIAL long int 
DATE long int 
复杂类型 
SQL C 
DECIMAL 
DEC NUMERIC dec_t or struct decimal 
MONEY dec_t or struct decimal 
DATETIME dtime_t or struct dtime 
INREVER intrvl_t or struct intrvl 
VARCHAR varchar or string 

2、数据类型转换 

转换类型 转换后 
FLOAT DECIMAL(16) 
SMALLFLOAT DECIMAL(8) 
INTERGER DECIMAL(10,0) 
SAMLLINT DECIMAL(5,0) 

二、数据类型的转换函数 
(一)有关CHAR类型的函数 
1、以空值结尾的串的操作函数 
rdownshift(char *s) 把一个字符串中的所有字母转换成小写形式。 
rupshift(char *s) 把一个字符串中的所有字母转换成大写形式。 
stcat(char *s, char *dest) 把一个字符串同另一个字符串相连接。 
stcmpr(char *s1, char *s2) 比较两个字符串。 
stcopy(char *from, char *to) 把一个字符串拷贝到另一个字符串。 
stleng(char *string) 统计字符串的长度。 

2、定长串的操作函数 
bycmpr(char byte1, byte2, rpt len) 比较两组连续的字节内存块。 
bycopy(char *from, char *to, int len) 把一块内存的内容拷贝到另一块内存。 
byfill(char *to, int len, char ch) 用字符填充指定的内存块。 
byleng(char from, int count) 统计有效字符的数目。有效字符是指字符串去除了末尾空格所剩的字符。 

3、字符串操作函数 
ldchar(char *from, int num, char *to) 拷贝定长串到空值结尾的串。 
stchar(char *from, char *to, int num) 拷贝空值结尾的串到定长串。 

4、字符串函数简单数值转换 
rstod(char *str, double *dblval) 把以空值结束的字符串转换成C的double型 
rstoi(char *str, int *intval) 把以空值结束的字符串转换成C的int类型。 
rstol(char *str, long *lngval) 把以空值结束的字符串转换成C的long类型。 


(二)DATE类型的函数 
1、创建内部日期 
rdefmtdate(long *jdate, char *frmt char *str) 生成具有确定格式的日期字符串。(str字符串和fmt必须按月、日、年的同一顺序) 
返回代码: 
0操作成功。 
-1204在str参数中有非法的月份。 
-1206在str参数中有非法的日期。 
-1209由于str中没有包含年、月、日各部分间的定界符,str的长 
度必须准确定义为6或8个字节长。 
-1212fmt中没有包含年、月、日部分。 
fmt和str的有效组合 
fmt str 
“mmddyy” “DEC 25th 1997” 
“mmm.dd.yyyy” “dec 25 1997” 
“mmm.dd.yyyy” “DEC-25-1997” 
“mmm.dd.yyyy” “12251997” 
“mmm.dd.yyyy” “12/25/1997” 
“yy/mm/dd” “97/12/25” 
“yy/mm/dd” “1997,December, 25th" 
“yy/mm/dd” “In the year 1997, the month of December, its 25th day” 
“dd-mm-yy” “This 25th day of December, 1997” 
rmdyjul(short mdy[3], long *jdate) 用三个短整数生成一个内部日期这三个整数是有关年、月、日的数字值。(年必须以完整的形式表达) 
返回代码: 
0操作成功。 
-1204在mdy[2]中有非法年份。 
-1205在mdy[1]中有非法月份。 
-1206在mdy[0]中有非法日期。 

rstrdate(char *str, long *jdate) 将一个字符串日期转换成一内部格式的日期。 
rtoday(long *jdate) 从系统日期创建一个内部日期值。 

2、从内部日期转换成其他类型 
rfmtdate(ling jdate, char *fmt, char *str) 从内部格式的日期类型值创建格式化的字符串。 
返回代码: 
0操作成功。 
-1210内部日期不能被转换成月-日-年格式。 
-1211程序存储溢出,即存储分配错误。 

rjulmdy(long jdate, short mdy[3]) 从一个内部日期生成一个含有3个短整数的数组对应内部日期的月、日、年。 

rdatestr(long jdate, char *str) 从一个内部日期值创建缺省的日期字符串。 

rdayofweek(long jdate) 给定一内部格式表示的日期,此函数返回所对应的星期中的某一天。 

rleapyear(int year) 用来判断给定的年份是否为闰年。 
返回值: 
TRUE(1) 是闰年 
FALSE(0) 不是闰年 


(三)简单数值类型的格式化函数 
rfmtdouble(double dbval, char *fmt, char *str) 将双精度格式化为指定的模板格式。 
rfmtlong(double longval, char *fmt, char *str) 将长整型值格式化为指定的模板格式。 
可以构成格式模板串的字符: 
*以星号代替空格。 
&以0代替空格。 
#代表一个数字或空格的位置。 
<左调整,显示一个逗号,仅当左边有数字时才显示。 
.显示一个小数点,一个格式模板串只能有一个小数点。 
-显示负号,当数字为负的时候显示。 
+显示正号,当数字为正的时候显示。 
(显示一个负号,同(一起显示负值。 
)显示一个负号,同)一起显示负值。 
$显示美元符号。 


(四)处理空值的数值类型函数 
risnull(int type, char *cvar) 检查C变量是否为空值。 
rsetnull(int type, char *cvar) 给C变量置空值。 

(五)其他函数 
typalign(int pos, int type) 返回一具有指定数据类型变量的下一个位置。 
rtypmsize(int sqltype, int sqllen) 返回你必须分配在存储单元中的指定的C或RDSQLD的字节数。 
rtyname(int sqltype) 返回一包含指定RDSQL类型名的以空结尾的串。 
rtypwidth(int sqltype, intsqllen) 返回一具有RDSQL类型的值转换为一字符类型时避免截取所需的最小字符数。 


ESQL/C数据类型的进一步说明 

一、DECIMAL数据类型的使用 
1、DECIMAL函数——把C的数据类型转换为DECIMAL值 
deccvasc(char *from, int len, dec_t *to) 把ASCII字符串转换成DECIMAL值。 
返回值: 
0转换成功 
-1200数字太大,上溢。 
-1201数字太小,下溢。 
-1213存在非数值字符。 
-1216存在错误指数。 
注意事项: 
(1)字符串的前导空格被忽略。 
(2)字符串可以有前导符号“+”或“-”。 
(3)字符串可以包含e或E的指数形式,指数前可带符号“+”或“-”。 

deccvint(int from, dec_t *to) 把C的整数转化成DECIMAL值。 
deccvlong(long from, dec_t *to) 把C的长整数转化成DECIMAL值。 
deccvdbl(double from, dec_t *to) 把C的双精度值转化成DECIMAL值。 


2、DECIMAL函数——把DECIMAL值转换成字符型 
dectoasc(dec_t *from, char *to, int len, int rt) 把DECIMAL值转换成ASCII字符串。 
说明: 
len串缓冲区字节的最大长度。 
rt表示十进制小数右边十进制的位数。 
注意事项: 
(1)rt=-1,则十进制位的个数有*from的十进制值决定。 
(2)如果此数不适合长度len的字符串,则该函数将这个数转换为指数表示的形式。如果仍不适合,则串用“*”号填满。如果数的长度短于串长,则右对齐且左部用空格填充。 

dececvt(dec_t *from, int ndgt, int *decpt, int *sign) 将一十进制数转换成以空格结束的具有指定个数的字符串,且返回此字符串的指针。 

decfcvt(dec_t *from, int ndgt, int *decpt, int *sign) 将一十进制数转换成以空格结束、小数点右边具有指定位数的字符串,且返回此字符串的指针。 

rfmtdec(dec_t *from, char *format, char *to) 将DECIMAL值转换成格式化的字符串。 

3、DECIMAL函数——把DECIMAL值转换成数值型 
dectoint(dec_t *from, int *to); 
dectolong(dec_t *from, long *to); 
dectodbl(dec_t *from, double *to) 

4、DECIMAL函数——算术运算 
decadd(dec_t *op1, dec_t *op2, dec_t *result); 
decsub(dec_t *op1, dec_t *op2, dec_t *result); 
decmul(dec_t *op1, dec_t *op2, dec_t *result); 
decdiv(dec_t *op1, dec_t *op2, dec_t *result); 
返回代码: 
0操作成功 
-1200操作产生上溢 
-1201操作产生下溢 
-1202试图用零作除数 

5、DECIMAL函数——DECIMAL操作 
deccmp(dec_t *dec1, dec_t *dec2); 
返回值: 
-1dec10dec1=dec2 
1dec1>dec2 
DECUNKNOW有一个是空值 

deccopy(dec_t *dec1, dec_t *dec2); 
decround(dec_t *dec1, int scale); 
dectrunc(dec_t *dec1, int scale); 

二 、DATETIME和INTERVAL使用方式及实例 
1、概述 
DATETIME数据类型存放时间,时间由以下部分组成:YEAR,MONTH,DAY,HOUR,MINUTE,SECOND和秒的FRACTION(n)。 
INTERVAL数据类型存放时间间隔,组成部分同上。 

定义宿主变量: 
DATETIME LargestQulifier TO SmallQulifier 
INTERVAL LargestQulifier TO SmallQulifier 
限定词: 
YEAR,MONTH,DAY,HOUR,MINUTE,SECOND,FRACTION(n) 
也可以不指明修饰符,直接定义。 

2、DATETIME和INTERVAL宏及转换函数 
在头文件datetime.h中定义了8个名字和5个宏,可以在操作DATETIME和INTERVAL值时使用它们。 
名字 
TU_YEAR用于YEAR修饰符域的名字 
TU_MONTH 
TU_HOUR 
TU_DAY 
TU_MINUTE 
TU_SECOND 
TU_FRAC用于开始的fraction修饰符域的名字 
TU_Fn用于结束的fraction(n)修饰符域的名字(n=1~5) 
宏 
TU_LEN(q) 
TU_START(q) 
TU_END(q) 
TU_DTENCODE(s,e) 
TU_IENCODE(p,s,e) 

3、DATETIME和字符串之间的转换函数 
dtcvasc(char *from, dtime_t *to)把ANSI兼容的字符串转换为DATETIME值 
dtcvfmtasc(char *from, char *fmt, dtime_t *to) 把格式化的字符串转换为DATETIME值。 
dttoasc(char *from, dtime_t *to) 
dttofmtasc(char *from, dtime_t *to, int len, char *fmt) 
4、操作DATETIME值的函数 
dtcurrent(dtime *to) 把当前日期和时间赋给一个DATETIME变量。 
dtextent(dtime_t *from, dtime *to) 拷贝DATETIME值,使用的是不同的修饰符。 

5、INTERVAL转换函数 
incvasc(char *from, intrvl_t *to)把ANSI兼容的字符串转换为INTERVAL值 
incvfmtasc(char *from, char *fmt, intrvl_t *to) 把格式化的字符串转换为INTERVAL值。 
intoasc(char *from, intrvl_t *to) 
intofmtasc(char *from, intrvl_t *to, int len, char *fmt) 

6、提供DATETIME和INTERVAL算术操作的函数 
rdtaddinv(dec_t *dt, int dg, dec_t *in, int iq, dec_t *sum) 把一个INTERVAL值加到一个DATETIME值上。 
rdtsub(det_t *dt2, int dq2, dec_t *dt1, int dq1, dec_t *dt0, int dq0) 求两个DATETIME值的差。 

7、DATE类型和DATETIME类型之间的转换 
DATE→DATETIME 
;定义一个带有修饰符“year to day”的DATETIME变量 
;使用rfmtdate()函数把DATE值转换为一个字符串,使用的模板是yyyy-mm-dd 
;使用dtcvasc()函数把字符串转换成DATETIME类型变量的值。 
;如果需要的话,可以使用dtextend()函数来调整DATETIME的修饰符。 

DATETIME→DATE 
;使用dtextend()函数把DATETIME的修饰符调整为“year to day”。 
;使用dttoasc()函数以模板yyyy-mm-dd创建一个字符串。 
;使用rdefmtdate()函数以模板yyyy-mm-dd把字符串转换为一个DATE值。 

8、有关DATETIME和INTERVAL值的其他运算 
rinvtodec(dec_t *v, int q, dec_t *dec) 把INTERVAL或DATETIME类型的值转换成DECIMAL类型 
redectoinv(dec_t *dec, dec_t *v, int q) 把DECIMAL值转换成INTERVAL或DATETIME类型值
阅读(2089) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~