- 論壇徽章:
- 0
|
ESQL/C的數(shù)據(jù)類型
1、SQL與C數(shù)據(jù)類型的對應
簡單類型
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、數(shù)據(jù)類型轉換
轉換類型 轉換后
FLOAT DECIMAL(16)
SMALLFLOAT DECIMAL(8)
INTERGER DECIMAL(10,0)
SAMLLINT DECIMAL(5,0)
二、數(shù)據(jù)類型的轉換函數(shù)
(一)有關CHAR類型的函數(shù)
1、以空值結尾的串的操作函數(shù)
rdownshift(char *s) 把一個字符串中的所有字母轉換成小寫形式。
rupshift(char *s) 把一個字符串中的所有字母轉換成大寫形式。
stcat(char *s, char *dest) 把一個字符串同另一個字符串相連接。
stcmpr(char *s1, char *s2) 比較兩個字符串。
stcopy(char *from, char *to) 把一個字符串拷貝到另一個字符串。
stleng(char *string) 統(tǒng)計字符串的長度。
2、定長串的操作函數(shù)
bycmpr(char byte1, byte2, rpt len) 比較兩組連續(xù)的字節(jié)內存塊。
bycopy(char *from, char *to, int len) 把一塊內存的內容拷貝到另一塊內存。
byfill(char *to, int len, char ch) 用字符填充指定的內存塊。
byleng(char from, int count) 統(tǒng)計有效字符的數(shù)目。有效字符是指字符串去除了末尾空格所剩的字符。
3、字符串操作函數(shù)
ldchar(char *from, int num, char *to) 拷貝定長串到空值結尾的串。
stchar(char *from, char *to, int num) 拷貝空值結尾的串到定長串。
4、字符串函數(shù)簡單數(shù)值轉換
rstod(char *str, double *dblval) 把以空值結束的字符串轉換成C的double型
rstoi(char *str, int *intval) 把以空值結束的字符串轉換成C的int類型。
rstol(char *str, long *lngval) 把以空值結束的字符串轉換成C的long類型。
(二)DATE類型的函數(shù)
1、創(chuàng)建內部日期
rdefmtdate(long *jdate, char *frmt char *str) 生成具有確定格式的日期字符串。(str字符串和fmt必須按月、日、年的同一順序)
返回代碼:
0操作成功。
-1204在str參數(shù)中有非法的月份。
-1206在str參數(shù)中有非法的日期。
-1209由于str中沒有包含年、月、日各部分間的定界符,str的長
度必須準確定義為6或8個字節(jié)長。
-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) 用三個短整數(shù)生成一個內部日期這三個整數(shù)是有關年、月、日的數(shù)字值。(年必須以完整的形式表達)
返回代碼:
0操作成功。
-1204在mdy[2]中有非法年份。
-1205在mdy[1]中有非法月份。
-1206在mdy[0]中有非法日期。
rstrdate(char *str, long *jdate) 將一個字符串日期轉換成一內部格式的日期。
rtoday(long *jdate) 從系統(tǒng)日期創(chuàng)建一個內部日期值。
2、從內部日期轉換成其他類型
rfmtdate(ling jdate, char *fmt, char *str) 從內部格式的日期類型值創(chuàng)建格式化的字符串。
返回代碼:
0操作成功。
-1210內部日期不能被轉換成月-日-年格式。
-1211程序存儲溢出,即存儲分配錯誤。
rjulmdy(long jdate, short mdy[3]) 從一個內部日期生成一個含有3個短整數(shù)的數(shù)組對應內部日期的月、日、年。
rdatestr(long jdate, char *str) 從一個內部日期值創(chuàng)建缺省的日期字符串。
rdayofweek(long jdate) 給定一內部格式表示的日期,此函數(shù)返回所對應的星期中的某一天。
rleapyear(int year) 用來判斷給定的年份是否為閏年。
返回值:
TRUE(1) 是閏年
FALSE(0) 不是閏年
(三)簡單數(shù)值類型的格式化函數(shù)
rfmtdouble(double dbval, char *fmt, char *str) 將雙精度格式化為指定的模板格式。
rfmtlong(double longval, char *fmt, char *str) 將長整型值格式化為指定的模板格式。
可以構成格式模板串的字符:
*以星號代替空格。
&以0代替空格。
#代表一個數(shù)字或空格的位置。
(四)處理空值的數(shù)值類型函數(shù)
risnull(int type, char *cvar) 檢查C變量是否為空值。
rsetnull(int type, char *cvar) 給C變量置空值。
(五)其他函數(shù)
typalign(int pos, int type) 返回一具有指定數(shù)據(jù)類型變量的下一個位置。
rtypmsize(int sqltype, int sqllen) 返回你必須分配在存儲單元中的指定的C或RDSQLD的字節(jié)數(shù)。
rtyname(int sqltype) 返回一包含指定RDSQL類型名的以空結尾的串。
rtypwidth(int sqltype, intsqllen) 返回一具有RDSQL類型的值轉換為一字符類型時避免截取所需的最小字符數(shù)。
ESQL/C數(shù)據(jù)類型的進一步說明
一、DECIMAL數(shù)據(jù)類型的使用
1、DECIMAL函數(shù)——把C的數(shù)據(jù)類型轉換為DECIMAL值
deccvasc(char *from, int len, dec_t *to) 把ASCII字符串轉換成DECIMAL值。
返回值:
0轉換成功
-1200數(shù)字太大,上溢。
-1201數(shù)字太小,下溢。
-1213存在非數(shù)值字符。
-1216存在錯誤指數(shù)。
注意事項:
(1)字符串的前導空格被忽略。
(2)字符串可以有前導符號“+”或“-”。
(3)字符串可以包含e或E的指數(shù)形式,指數(shù)前可帶符號“+”或“-”。
deccvint(int from, dec_t *to) 把C的整數(shù)轉化成DECIMAL值。
deccvlong(long from, dec_t *to) 把C的長整數(shù)轉化成DECIMAL值。
deccvdbl(double from, dec_t *to) 把C的雙精度值轉化成DECIMAL值。
2、DECIMAL函數(shù)——把DECIMAL值轉換成字符型
dectoasc(dec_t *from, char *to, int len, int rt) 把DECIMAL值轉換成ASCII字符串。
說明:
len串緩沖區(qū)字節(jié)的最大長度。
rt表示十進制小數(shù)右邊十進制的位數(shù)。
注意事項:
(1)rt=-1,則十進制位的個數(shù)有*from的十進制值決定。
(2)如果此數(shù)不適合長度len的字符串,則該函數(shù)將這個數(shù)轉換為指數(shù)表示的形式。如果仍不適合,則串用“*”號填滿。如果數(shù)的長度短于串長,則右對齊且左部用空格填充。
dececvt(dec_t *from, int ndgt, int *decpt, int *sign) 將一十進制數(shù)轉換成以空格結束的具有指定個數(shù)的字符串,且返回此字符串的指針。
decfcvt(dec_t *from, int ndgt, int *decpt, int *sign) 將一十進制數(shù)轉換成以空格結束、小數(shù)點右邊具有指定位數(shù)的字符串,且返回此字符串的指針。
rfmtdec(dec_t *from, char *format, char *to) 將DECIMAL值轉換成格式化的字符串。
3、DECIMAL函數(shù)——把DECIMAL值轉換成數(shù)值型
dectoint(dec_t *from, int *to);
dectolong(dec_t *from, long *to);
dectodbl(dec_t *from, double *to)
4、DECIMAL函數(shù)——算術運算
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試圖用零作除數(shù)
5、DECIMAL函數(shù)——DECIMAL操作
deccmp(dec_t *dec1, dec_t *dec2);
返回值:
-1dec1dec2
DECUNKNOW有一個是空值
deccopy(dec_t *dec1, dec_t *dec2);
decround(dec_t *dec1, int scale);
dectrunc(dec_t *dec1, int scale);
二 、DATETIME和INTERVAL使用方式及實例
1、概述
DATETIME數(shù)據(jù)類型存放時間,時間由以下部分組成:YEAR,MONTH,DAY,HOUR,MINUTE,SECOND和秒的FRACTION(n)。
INTERVAL數(shù)據(jù)類型存放時間間隔,組成部分同上。
定義宿主變量:
DATETIME LargestQulifier TO SmallQulifier
INTERVAL LargestQulifier TO SmallQulifier
限定詞:
YEAR,MONTH,DAY,HOUR,MINUTE,SECOND,F(xiàn)RACTION(n)
也可以不指明修飾符,直接定義。
2、DATETIME和INTERVAL宏及轉換函數(shù)
在頭文件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和字符串之間的轉換函數(shù)
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值的函數(shù)
dtcurrent(dtime *to) 把當前日期和時間賦給一個DATETIME變量。
dtextent(dtime_t *from, dtime *to) 拷貝DATETIME值,使用的是不同的修飾符。
5、INTERVAL轉換函數(shù)
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算術操作的函數(shù)
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()函數(shù)把DATE值轉換為一個字符串,使用的模板是yyyy-mm-dd
?;使用dtcvasc()函數(shù)把字符串轉換成DATETIME類型變量的值。
?;如果需要的話,可以使用dtextend()函數(shù)來調整DATETIME的修飾符。
DATETIME→DATE
?;使用dtextend()函數(shù)把DATETIME的修飾符調整為“year to day”。
?;使用dttoasc()函數(shù)以模板yyyy-mm-dd創(chuàng)建一個字符串。
?;使用rdefmtdate()函數(shù)以模板yyyy-mm-dd把字符串轉換為一個DATE值。
8、有關DATETIME和INTERVAL值的其他運算
rinvtodec(dec_t *v, int q, dec_t *dec) 把INTERVAL或DATETIME類型的值轉換成DECIMAL類型
本文來自ChinaUnix博客,如果查看原文請點:http://blog.chinaunix.net/u2/84425/showart_2069371.html |
|