informix学习总结.docx
《informix学习总结.docx》由会员分享,可在线阅读,更多相关《informix学习总结.docx(17页珍藏版)》请在冰豆网上搜索。
![informix学习总结.docx](https://file1.bdocx.com/fileroot1/2023-3/1/46034731-21dd-47f8-98b0-b7c12626eb10/46034731-21dd-47f8-98b0-b7c12626eb101.gif)
informix学习总结
INFORMIX的学习
第一章ESQL/C的数据类型
数据类型
SQL与C数据类型的对应
简单类型
SQL?
?
?
?
C
CHAR(n)?
?
?
?
?
char(n+1)
CHARCTER(n)?
?
?
char*
SMALLINT?
?
?
?
?
shortint
INTERGER
INT?
?
?
?
?
longint
SMALLFLOAT
REAL?
?
?
?
?
float
FLOAT
DOUBLEPRECISIONdouble
SERIAL?
?
?
?
?
longint
DATE?
?
?
?
?
longint
复杂类型
SQL?
?
?
?
?
C
DECIMAL
DECNUMERIC?
?
?
?
?
dec_torstructdecimal
MONEY?
?
?
?
?
dec_torstructdecimal
DATETIME?
?
?
?
?
dtime_torstructdtime
INREVER?
?
?
?
?
?
?
intrvl_torstructintrvl
VARCHAR?
?
?
?
?
?
?
varcharorstring
数据类型转换
转换类型?
转换后
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(charbyte1,byte2,rptlen)?
比较两组连续的字节内存块。
bycopy(char*from,char*to,intlen)把一块内存的内容拷贝到另一块内存。
byfill(char*to,intlen,charch)?
?
?
用字符填充指定的内存块。
byleng(charfrom,intcount)?
?
?
?
统计有效字符的数目。
有效字符是指字符串去除了末尾空格所剩的字符。
3、字符串操作函数
ldchar(char*from,intnum,char*to)?
拷贝定长串到空值结尾的串。
stchar(char*from,char*to,intnum)?
拷贝空值结尾的串到定长串。
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*frmtchar*str)?
生成具有确定格式的日期字符串。
(str字符串和fmt必须按月、日、年的同一顺序)
返回代码:
?
?
?
0操作成功。
?
-1204在str参数中有非法的月份。
?
-1206在str参数中有非法的日期。
?
-1209由于str中没有包含年、月、日各部分间的定界符,str的长
度必须准确定义为6或8个字节长。
?
-1212fmt中没有包含年、月、日部分。
fmt和str的有效组合
?
fmt?
?
?
?
?
?
?
?
str
?
“mmddyy”?
?
?
?
?
“DEC25th1997”
?
“mmm.dd.yyyy”?
?
“dec251997”
?
“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”?
?
?
?
“Intheyear1997,themonthofDecember,its25thday”
?
“dd-mm-yy”?
?
?
?
“This25thdayofDecember,1997”
rmdyjul(shortmdy[3],long*jdate)用三个短整数生成一个内部日期这三个整数是有关年、月、日的数字值。
(年必须以完整的形式表达)
返回代码:
?
?
?
0操作成功。
?
-1204在mdy[2]中有非法年份。
?
-1205在mdy[1]中有非法月份。
?
-1206在mdy[0]中有非法日期。
rstrdate(char*str,long*jdate)将一个字符串日期转换成一内部格式的日期。
rtoday(long*jdate)?
?
?
?
?
从系统日期创建一个内部日期值。
2、从内部日期转换成其他类型
rfmtdate(lingjdate,char*fmt,char*str)从内部格式的日期类型值创建格式化的字符串。
返回代码:
?
?
?
0操作成功。
?
-1210内部日期不能被转换成月-日-年格式。
?
-1211程序存储溢出,即存储分配错误。
rjulmdy(longjdate,shortmdy[3])从一个内部日期生成一个含有3个短整数的数组对应内部日期的月、日、年。
rdatestr(longjdate,char*str)从一个内部日期值创建缺省的日期字符串。
rdayofweek(longjdate)给定一内部格式表示的日期,此函数返回所对应的星期中的某一天。
rleapyear(intyear)用来判断给定的年份是否为闰年。
返回值:
?
TRUE
(1)?
?
是闰年
?
FALSE(0)?
?
不是闰年
简单数值类型的格式化函数
rfmtdouble(doubledbval,char*fmt,char*str)将双精度格式化为指定的模板格式。
rfmtlong(doublelongval,char*fmt,char*str)将长整型值格式化为指定的模板格式。
可以构成格式模板串的字符:
*以星号代替空格。
&以0代替空格。
#代表一个数字或空格的位置。
<左调整,显示一个逗号,仅当左边有数字时才显示。
.显示一个小数点,一个格式模板串只能有一个小数点。
-显示负号,当数字为负的时候显示。
+显示正号,当数字为正的时候显示。
(显示一个负号,同(一起显示负值。
)显示一个负号,同)一起显示负值。
$显示美元符号。
处理空值的数值类型函数
risnull(inttype,char*cvar)?
检查C变量是否为空值。
rsetnull(inttype,char*cvar)给C变量置空值。
(五)其他函数
typalign(intpos,inttype)返回一具有指定数据类型变量的下一个位置。
rtypmsize(intsqltype,intsqllen)返回你必须分配在存储单元中的指定的C或RDSQLD的字节数。
rtyname(intsqltype)返回一包含指定RDSQL类型名的以空结尾的串。
rtypwidth(intsqltype,intsqllen)返回一具有RDSQL类型的值转换为一字符类型时避免截取所需的最小字符数。
ESQL/C数据类型的进一步说明
DECIMAL数据类型的使用
1、DECIMAL函数——把C的数据类型转换为DECIMAL值
deccvasc(char*from,intlen,dec_t*to)把ASCII字符串转换成DECIMAL值。
返回值:
0转换成功
-1200数字太大,上溢。
-1201数字太小,下溢。
-1213存在非数值字符。
-1216存在错误指数。
注意事项:
(1)字符串的前导空格被忽略。
(2)字符串可以有前导符号“+”或“-”。
(3)字符串可以包含e或E的指数形式,指数前可带符号“+”或“-”。
deccvint(intfrom,dec_t*to)?
?
把C的整数转化成DECIMAL值。
deccvlong(longfrom,dec_t*to)?
把C的长整数转化成DECIMAL值。
deccvdbl(doublefrom,dec_t*to)把C的双精度值转化成DECIMAL值。
2、DECIMAL函数——把DECIMAL值转换成字符型
dectoasc(dec_t*from,char*to,intlen,intrt)把DECIMAL值转换成ASCII字符串。
说明:
len串缓冲区字节的最大长度。
rt表示十进制小数右边十进制的位数。
注意事项:
(1)rt=-1,则十进制位的个数有*from的十进制值决定。
(2)如果此数不适合长度len的字符串,则该函数将这个数转换为指数表示的形式。
如果仍不适合,则串用“*”号填满。
如果数的长度短于串长,则右对齐且左部用空格填充。
dececvt(dec_t*from,intndgt,int*decpt,int*sign)将一十进制数转换成以空格结束的具有指定个数的字符串,且返回此字符串的指针。
decfcvt(dec_t*from,intndgt,int*decpt,int*sign)将一十进制数转换成以空格结束、小数点右边具有指定位数的字符串,且返回此字符串的指针。
rfmtdec(dec_t*from,char*format,char*to)将DECIMAL值转换成格式化的字符串。
1、DECIMAL函数——把DECIMAL值转换成数值型
dectoint(dec_t*from,int*to);
dectolong(dec_t*from,long*to);
dectodbl(dec_t*from,double*to)
2、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试图用零作除数
3、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,intscale);
dectrunc(dec_t*dec1,intscale);
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,intlen,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,intlen,char*fmt)
6、提供DATETIME和INTERVAL算术操作的函数
rdtaddinv(dec_t*dt,intdg,dec_t*in,intiq,dec_t*sum)把一个INTERVAL值加到一个DATETIME值上。
rdtsub(det_t*dt2,intdq2,dec_t*dt1,intdq1,dec_t*dt0,intdq0)求两个DATETIME值的差。
7、DATE类型和DATETIME类型之间的转换
DATE→DATETIME
定义一个带有修饰符“yeartoday”的DATETIME变量
使用rfmtdate()函数把DATE值转换为一个字符串,使用的模板是yyyy-mm-dd
使用dtcvasc()函数把字符串转换成DATETIME类型变量的值。
如果需要的话,可以使用dtextend()函数来调整DATETIME的修饰符。
DATETIME→DATE
使用dtextend()函数把DATETIME的修饰符调整为“yeartoday”。
使用dttoasc()函数以模板yyyy-mm-dd创建一个字符串。
使用rdefmtdate()函数以模板yyyy-mm-dd把字符串转换为一个DATE值。
8、有关DATETIME和INTERVAL值的其他运算
rinvtodec(dec_t*v,intq,dec_t*dec)把INTERVAL或DATETIME类型的值转换成DECIMAL类型
redectoinv(dec_t*dec,dec_t*v,intq)把DECIMAL值转换成INTERVAL或DATETIME类型值
第二章游标的使用
声明一个游标
DECLAREthe_itemCURSORFOR
SELECTorder_num,item_num,stock_num
INTOo_num,i_num,s_num
FROMitems
打开一个游标
OPENthe_item
因为这是数据库第一次收到查询,所以这也是检测许多错误的时机。
打开游标后,程序应检查SQLCODE的值。
如果它包含了一个负数值,那么,游标是不可用的。
SELECT语句中也许会有错误,任何错误都可能使得数据库服务器不能执行语句。
如果SQLCODE是0,表明SELECT语句的语法正确,游标可以使用。
但是,在这一点上,程序并不知道游标能否返回数据行。
取出行
DECLAREthe_itemCURSORFOR
SELECTorder_num,item_num,stock_num
INTOo_num,i_num,s_num
FROMitems
OPENthe_item
WHILEsq1code=0
FETCHthe_item
IFsq1code=0THEN
DISPLAYo_num,i_num,s_num
ENDIF
ENDWHILE
判断数据结束
DECLAREthe_itemCURSORFOR
SELECTorder_num,item_num,stock_num
FROMitems
OPENthe_item
IFsq1code=0THEN
FETCHthe_item--fetchfirstrow
ENDIF
WHILEsq1code=0
DISPLAYo_num,i_num,s_num
FETCHthe_item
ENDWHILE
定位INTO子句
INTO子句给出了宿主变量的名字,由这些宿主变量接收数据库服务器返回的数据。
宿主变量的名字必须在SELECT或FETCH语句中的一个中出现,但不能在二者中都出现。
下面是重新编写的在FETCH语句中指定宿主变量的例子:
DECLAREthe_itemCURSORFOR
SELECTorder_num,item_num,stock_num
FROMitems
OPENthe_item
WHILEstatus=0
FETCHthe_itemINTOo_num,i_num,s_num
IFstatus=0THEN
DISPLAYo_num,i_num,s_num
ENDIF
ENDWHILE
第三章FOREACH语句
例:
第四章存储过程
简单的存储过程
;
如何创建存储过程
CREATEPROCEDURE过程名(参数1,参数2,……)
RETURNING类型1,类型2,……;--返回值类型
?
DEFINE变量1类型1;
DEFINE变量2类型2;
………………;
SELECT表字段1,表字段2,……
INTO变量1,变量2,……
FROM表名
WHERE条件;--与参数有关
?
RETURN变量1,变量2,……;
?
ENDPROCEDURE;
数据传递
向存储过程传递数据
由存储过程返回数据
第一次调用过程返
事务处理
应付发生在数据修改过程中所发生的任何类型的错误的最好办法是使用事务日志。
当发生任何错误时,你能够告诉数据库服务器回滚到原来的状态。
下面是前一个例子使用事务的情况:
$beginwork;/*startthetransaction*/
$deletefromitems
whereorder_num=$onum;
del_result=sqlca.sqlcode;/*savetwoerror*/
del_isamno=aqlca.sqlerrd[1];/*...codenumbers*/
del_rowcnt=sqlca.sqlerrd[2];/*...andcountofrows*/
if(del_result<0)/*someproblem,*/
$rollbackwork;/*...puteverythingback*/
else/*everythingworkedok,*/
$commitwork;/*...finishtransaction*/
这个例子中关键的一点是程序在结束事务前先把重要的返回值存储在SQLCA中。
其原因是和所有的SQL语句一样,ROLLABCKWORK和COMMITWORK语句在SQLCA中设置返回代码。
除非事先保存好错误代码,否则在错误发生后执行ROLLBACKWORK语句会清除原来的错误代码,也就不能向用户报告了。
使用事务的优点是无论发生了什么错误,数据库都处于一种可知的、可预计的状态。
关于到底修改操作完成了多少的问题不会存在,要么全部完成,要么什么都没改。
错误处理
GEGIN
ONEXCEPTIONIN
(-206,--tabledoesn’texist
-207—columndoesn’texist
)SETerr_num
ENDEXCEPTIONWITHRESUME
自定义异常