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