【网学网提醒】:本文主要为网学会员提供Informix-4gl学习资料informix-4gl,希望对需要Informix-4gl学习资料informix-4gl网友有所帮助,学习一下!
第一章一.环境范例:变量名称DBDELIMITERDBDATEDBEDITDBLANGDBMONEYDBPATHDBPRINTDBSRCDBTEMPINFORMIXDIRINFORMIXSERVERFORMDIRDBNLSLANGONCONFIGPATHTERMTERMCAP
Informix环境变量的设定
变量说明指定由dbload在卸出数据文件中使用的字段定界符指定在DB中想要使用的日期格式(Y4MD/,MDY4-)指定在程序员环境中想要使用的文本编辑器(vi)指定在程序中所使用消息文件的存放目录指定在DB中想要使用的货币格式指定DB与其它相应文件的搜索路径指定计算机的打印程序指定程序调试阶段文件的搜索路径指定临时文件的存放目录指定Informix文件的存放目录(/usr/informix)指定Informixr的数据库服务器名称指定Informix屏幕格式文件的存放路径指定Informix传输汉字(DBNLS=2)指定Informix可显示汉字(LANG=english.8859)指定Informix-Online的配置文件(onconfig.life)指定Informix可执行文件的搜索路径指定Informix的终端类型(TERM=vt100)指定Informixr的终端类型文件
二.环境范例:.profile(环境变量的等号前后不得为空格)stty-istrip-isig(防止用户非法中断)INFORMIXDIR=/usr/informixINFORMIXSERVER=ld420501_tcpONCONFIG=onconfig.life
第1页共40页40页
PATH=$PATH:$INFORMIXDIR/bin:$HOME/bin:$HOME/form:$HOME/prgDBPATH=/u/cbps/form:/u/cbps/binFORMDIR=/u/cbps/formDBDATE=Y4MD/LANG=english_us.8859DBLANG=english_us.8859DBNLS=2TERMCAP=/usr/informix/etc/termcapTERM=vt100exportINFORMIXDIRINFORMIXSERVERONCONFIGPATHDBPATHFORMDIRDBDATELANGexportDBLANGDBNLSTERMCAPTERM环境变量的设置文件中还可加入其它Shell语句
第二章
Informix产品线及DB应用开发工具简介
一.Informix(英孚美)产品线简介(三大类):1.数据库服务器(DatabaseServer):①.ODS(Informix-OnlineDynemicServer)联机动态服务器,多线索,多性能的DBserver(数据库服务器)
第2页共40页40页
②.XPS(Informix-OnlineExtendedParallelServer)将DSA扩展至松耦合或非共享的计算体系结构,动态可申缩性体系结构(DynemicScerableArchiterta),适用于大型数据库的应用,并行SQL操作。③.IUS(Informix-UniversblServer)处理丰富而复杂的数据而设计,并用Datablade模块技术,用来存储和检索丰富的多媒体Data及其他复杂的插入或对象扩展模块。
2.应用开发工具:①.Informix-NERERA适用于关键性业务的C/S(客户机/服务器)模式,开放性,图形化面向对象的开发环境。Client/ServerModel②.Informix-4GL适用于各种类型业务的哑终端操作方式,└→
适用性广,开发方便,可维护性好,功能强大,无图形功能,用户界面不够友好。③.Informix-SQL符合国际标准的SQL语言,具有通用性,
DDL与DML合为一体,高度的非过程化,分为嵌入式和交互式两种形式,具
有数据控制,访问功能。④.Informix-ESQL/C把SQL嵌入C语言提供实现SQL语言的目标函数库,利用宿主程序完成一个应用的过程。3.连接工具:
第3页共40页40页
c4gl<*.4gl*.c*.ec*.o>-c,o,s
└→4gl源程序文件的编译,连接生成目标文件或可执行文件esql<*.ec*.c*.o>-c,o
└→esql源程序文件的编译,连接生成目标文件或可执行文件
cc
<*.c*.o>
-c,o
└→c语言源程序文件的编译,连接生成目标文件或可执行文件
二.SQL(StructuredQueryLanguage)简介:1.SQL(结构化查询语言)的主要特点:(RDBServer关系型数据库服务器)①.一体化:DDL与DML合为一体.②.高度非过程化:whattodo,nothowtodo用户使用起来简单方便.③.具有SQL交互式与SQL嵌入式两种形式.
2.SQL语言的分类:①.DDL(数据定义语言):用来创建,更改,删除数据库基表视图.②.DML(数据操纵语言):对DB中的数据进行查询或增删改操作.③.DCL(数据控制访问语言):对存取权根的控制,授权和回收,游标语句,动态管理语句,数据完整性语句,查询优化语句,事务处理语句.
第4页共40页40页
三.Stores7,Dbaccess,Isql,I4gl,Upscol等DBMS实用工具:1.$dbaccessdemo7└→创建范例DB[DBname]└→数据库名[withlog]└→缺省不带系统日志
2.$dbaccess└→捆绑在Informix-OnlineDBServer上的一套DBMS实例程序,可以做到:①.利用该工具可以做到创建和删除数据库.②.查询数据库中各种信息,编辑使用SQL语句.③.创建,更改,删除数据库基表.④.增加,删除,修改数据库中原始记录.⑤.从OS(操作系统)文件中装载数据到数据库中.⑥.将数据库中的数据卸出到一个OS(操作系统)文件中.⑦.创建回收权限.⑧.利用该工具可以创建,删除,修改Procedure(过程)。
3.$isql└→捆绑在Informix-OnlineDBServer上的一套DBMS实例程序,可以做到:①.利用该工具可以做到创建和删除数据库.②.查询数据库中各种信息,编辑使用SQL语句.
第5页共40页40页
③.创建,更改,删除数据库基表.④.增加,删除,修改数据库中原始记录.⑤.从OS(操作系统)文件中装载数据到数据库中.⑥.将数据库中的数据卸出到一个OS(操作系统)文件中.⑦.创建回收权限.⑧.利用该工具可以创建,删除,修改,编译屏幕表格文件(*.per),并运行.⑨.利用该工具可以创建,删除,修改,编译报表文件(*.ace),并运行.
4.$i4ql└→捆绑在Informix-OnlineDBServer上的一套Informix-4GL实例程序,可以做到:①.利用该工具可以做到创建和删除数据库.②.查询数据库中各种信息,编辑使用SQL语句.③.创建,更改,删除数据库基表.④.增加,删除,修改数据库中原始记录.⑤.从OS(操作系统)文件中装载
数据到数据库中.⑥.将数据库中的数据卸出到一个OS(操作系统)文件中.⑦.授权和回收权限.⑧.利用该工具可以创建,修改,编译屏幕表格文件(*.per).⑨.利用该工具可以创建,删除,修改,编译,运行Informix-4GL源
第6页共40页40页
程序文件(*.4gl).
5.$upscol└→捆绑在Informix-OnlineDBServer上的一套屏幕属性实例程序,可以做到:①.利用该工具可以调整屏幕字段的数据属性和显示属性.②.调整屏幕字段的前背颜色,下划线,反显等.③.调整屏幕字段的数据格式,消息,限制输入等.
6.$form4gl<文件名>①.编译已存在的屏幕表格文件:form4gl<*?*.per>└→被编译的屏幕表格文件名②.为指定数据库中的表格生成默认屏幕格式文件:form4gl-d
└→表名
└→生成文件└→数据库名
7.$c4gl<*.4gl>使用方法:c4gl[-Vaeqcz][-phase12345][-ansi][-anyerr][-globcurs|-localcurs][-nokeep|-keep][-static|-shared][-nolinenos|-linenos][-otherargs]
第7页共40页40页
[source.4gl[otheresql.ec...][otherobj.ooutfile]开关参数-V-a-e-q-c-zfunctions-phase12345-ansi-anyerr-globcurs-localcurs(default)-nokeep(default)-keep-linenos使用说明
...]
[othersrc.c
...]
...]
[yourlib.a
...]
[-o
Displayversionof4glonlyDoarrayboundscheckingPreprocessonly,nocompilationorlinkingQuietmodefori4glc1[phase1]Preprocess&;compileonly,nolinkingAllowvariablenumberofargumentsto
ProcessonlythephasethatindicatedCheckSQLstatementsforANSIcomplianceSetstatusvariableafterexpressionsMakecursordefinitionsglobaltoprogramMakecursordefinitionslocaltomodule
Deleteintermediate.4ec,.ec,and.cfiles
Keepintermediate.4ec,.ec,and.cfilesProduce#linenumberingin.cfile(default)
第8页共40页40页
-nolinenos-static-shared-otherargs-o
Suppress#linenumberingin.cfileUsestaticlibrariesUsedynamiclinkingandsharedlibrariesOtherargumentsarepassedtotheCcompilerNextargumentisnameofexecutable
8.$esql<*.ec>使用方法:esql[-e][-static][-shared][-esqlcargs][-otherargs][-ooutfile][-libs]esqlfile.ec[othersrc.c...][-lyourlib...]开关参数-e-static-sharedshared).-esqlcargsesqlcarguments(-g,-G,-nln,-Ipathname,使用说明Preprocessonly,nocompilationorlinkingUseinformixstaticlibraries.Useinformixsharedlibraries(defaultis[otherobj.o...]
-nowarn,-V,-ansi,-xopen,-local,-log,-EDname,-EUname,-icheck)-otherargs-oOtherargumentsarepassedtoccNextargumentisprogramname
第9页共40页40页
-libslinktime.
Displaythelistoflibrariesusedbyesqlat
9.dbexport,dbimport,dbschema,ontape数据库后备工具:dbexport以文本形式卸出数据库文件(Table、View、Procedure、Trigger等)dbexport或dbexport–
t/dev/rStp0–s–bdbimport以文本形式上载数据库文件(Table、View、Procedure、Trigger等)dbimport-dworkdbs–lbuffereddbschema以文本形式卸出数据库的建表、建过程的SQL文件dbschema–d-t-ss卸出指定表或所有表dbschema–d-f-ss卸出指定过程或所有过程ontape数据库系统备份工具ontape–s–B为指定数据库恢复Buffered日志
第三章
Informix-SQLVersion6.05.UD1应用
第10页10页
共40页40页
一.有关数据库,基表,索引的创建与删除1.语法约定:<......>{......}[......](......)|大写[A-Z]小写[a-z]表示必选项表示必选其中项表示可选项表示语句的一部分表示多项选一表示Informix的保留字表示Informix的库名,表名,字段名,变量名
2.数据库(Database):①.创建一个DB:CREATEDATABASE[WITHBUFFEREDLOG]└→是否带数
└─┴→语法关键字据库日志
└→数据库名
创建一个DB同时也打开了这个DB②.数据库命名规则:㈠.数据库名不超过10个字符.㈡.必须以字母打头,其余部分可以是字母,数字,下划线的任意组合.㈢.在同一数DBServer(据库服务器)中数据库名应具有唯一性.
第11页11页共40页40页
㈣.数据库名不得是Informix的保留字
3.数据库基表(Table):①.创建一个DBTable:DATABASE→数据库名→数据库表名字段说明,#有序整数型,其初始值为1,#从-2147483647到+2147483647之
CREATETABLE字段名称字段类型(column0serial(1)column1integer间的整数column2smallint
,#从-32767到+32767之间的整数
column3floatdefault0.00notnull,#双精度浮点数column4smallfloat,#单精度浮点数
column5decimal(m,n),#具有可定义精度的数字(左边m-n位,右边n位)column6money(m,n)column7datecolumn8,#与decimal型相同(货币型),#日期型
datetimeyeartosecond,#日期时间型
(1999-09-0709:52:52)column9char(n)column10varchar(n),#字符型n表示字符长度
,#字符型(最后一个字段无逗号)
check(字段名in(值1,值2,值3)constraint名称,
第12页12页共40页40页
primarykey(字段1,字段2,字段n)constraint名称##主键唯一,非空);
数据类型CHARVARCHARSMALLINTINTEGERSMALLFLOATFLOATSERIALDATEDATETIMEDECIMAL(m,n)MONEY(m,n)
字
段
长
度
语句中定义的长度语句中定义的长度2个字节4个字节4个字节8个字节4个字节4个字节8个字节(YeartoSecond),其它为4依赖精度(m/2+1四舍五入到下一整数)依赖精度(m/2+1四舍五入到下一整数)
②.基表命名规则:㈠.表名最多不超过18个字符,除此以外与数据库命名规则雷同.㈡.必须以字母打头,其余部分可以是字母,数字,下
划线的任意组合.㈢.在同一数据库中表名应具有唯一性.
第13页13页
共40页40页
㈣.表名不得是Informix的保留字.㈤.表中字段名不得超过18个字符,定义liketable.*必须保证前8个字符的唯一性。㈥.表中字段名不得重复(不区分大小写)。
4.索引(Index):①.索引分类:㈠.单字段索引:提高查询和分类操作效率。㈡.多字段索引:加快几个字段分类处理的速度。索引仅是加快数据分类处理的速度。②.索引规则:㈠.直到表中有上百条记录时才加索引.㈡.经常用于检索和排序操作的字段.㈢.用于连接表和使用频率高的字段。㈣.不要对含有大量重复值的字段加索引,索引字段中相同的值不得出现多于65536次㈤.不得对多于8个字段的组加索引。㈥.不得对长度超过120字节的一个字段或一组字段加索引。㈦.索引命名规则与表名命名规则相似。③.创建索引:CREATE[UNIQUE|DISTINCT]INDEX→索引名└→唯一索引
第14页14页共40页40页
ON name>→表名
(column1[DESC],column2,..,columnn)└→降序索引5.视图(View):①.视图定义:视图是数据库上动态的窗口而不是静态的状况,并且是以数据库表的形式出现在数据库中,授权与增、删、改操作与基表的操作一致。②.视图命名规则:㈠.表名最多不超过18个字符,除此以外与数据库基表的命名规则雷同.㈡.必须以字母打头,其余部分可以是字母,数字,下划线的任意组合.㈢.在同一数据库中视图名应具有唯一性.㈣.视图名不得是Informix的保留字.㈤.视图中字段名不得超过18个字符,必须保证前8个字符的唯一性。㈥.视图中字段名不得重复(不区分大小写),应具有唯一性。③.视图任务:㈠.在数据库上为不同的用户提供不同的数据窗口,一个单独的视图可以包含来自不同的表的字段(字段不得同名)。㈡.限制某些敏感数据的存取,只允许用户查看聚合信息。㈢.允许用户象修改、插入和删除数据库中如同在视图中出现
第15页15页共40页40页
那样被组织起来的数据④.视图与基表的区别:㈠.不能利用视图取代格式说明文件中的表。㈡.不能在视图上建立索引。㈢.某些条件下不能通过视图更新或删除看到的数据。㈣.不能通过ROWID存取表。⑤.创建与删除视图:CREATEVIEW[(字段1,...,字段n)]└→视图名称ASSELECT<标准Select语句>→不得使用UNION操作符[WITHCHECKOPTION]→输入与修改是否满足SELECT语句条件
6.删除数据库、表、索引、视图:①.删除数据库:drop②.删除表③.删除索引④.删除视图
:droptable:dropindex:dropview
删除数据库前必须
关闭此数据库,删除数据库同时也删除了该数据库的所有表、索引、视图。
二.SQL实际应用:
第16页16页共40页40页
1.INSERT语句:(向数据库的表中插入一条行记录)INSERTINTO(column1,comumn2,...,comumnn)└→表名字段VALUES(value_list)→值列表2.DELETE语句:(从数据库的表中删除若干条满足条件的行记录)DELETEFROM记录└→表名(WHERE条件列表)→缺省为所有行└→字段名表→缺省为所有
3.UPDATE语句:(修改数据库表中满足条件的若干条行记录)UPDATESTATISTICS(TBname)→为指定数据库表更统计(缺省为所有)└→表名UPDATEn>└→表名(WHERE条件列表)记录→缺省为所有行SET<字段1=值1,字段n=值
UPDATE
SET└→表名
第17页17页共40页40页
<字段列表>=<值列表>
(WHERE条件列表)记录
→缺省为所有行
UPDATE
SET└→表名
<字段.*>
=<记录.*>
(WHERE条件列表)记录
→缺省为所有行
4.SELECT语句:(从一数据库表中选择满足条件的行记录)SELECT→*表示所有字段
(INTO<程序变量列表>)或(INTOTEMP<临时表>)FROM[表别名](WHERE<条件列表>)录ORDERBY[column1,column2,...,column8][DESC]→排序(可选)可用1-8代替字段GROUPBY[column1,column2,...,columnn]可用1-8代替字段[HAVING<条件>]个或多个限制条件INTOTEMP<临时表>(可选)→为组提供一→分组(可选)→数据库表名→缺省为所有行记
第18页18页
共40页40页
5.多表连接(Join)的SELECT语句:(从多个数据库表中选择满足条件的行记录)SELECT<表1.字段>,2.字段>,2.字段>,3.字段>,<表<表<表...,<表n.字段>FROM<表1>[别名1],<表2>[别名2],<表3>[别名3],...,<表n>[别名n]WHERE<条件列表>能省略ORDERBY[1,2,3,4,5,6,7,8][DESC]→排序,1-8表示字段在SELECT中出现的顺序。GROUPBY[column1,column2,...,columnn][HAVING<条件>]或多个限制条件INTOTEMP<临时表>(将查询结果放到临时表中)当在WHERE子句中建立多表连接时,表与表之间至少有一个字段用于连接。连接的功能是建立一个临时组合的表,在对应表中符合连接条件的记录被连接形成一个记录。→分组(可选)→为组提供一个→WHERE子句不
6.SELECT语句中的聚合函数和日期函数:语法功能
COUNT(*)COUNT(DISTINCT*)
第19页19页
满足条件的记录个数去除重复项后满足条件的记录个数
共40页40页
SUM(DISTINCTx)AVG(DISTINCTx)MAX(x)MIN(x)DATE()DAY()少号)MDY()ATE类型的值MONTH()WEEKDAY()星期日至星期六)YEAR()
满足条件字段x的总和满足条件字段x的
平均值满足条件字段x的最大值满足条件字段x的最小值为表达式返回一个DATE类型的值返回DATE类型表达式月份的日期(多
分别代表月、日、年的整数返回一个D
返回DATE类型表达式的月份返回DATE类型表达式星期的整数0-6(
返回DATE类型表达式的年份
7.SELECT语句中的算术操作符:符号+*/mod**功加法减法乘法除法取模(取余数)幂(乘方)
第20页20页共40页40页
能
8.WHERE子句的详细说明:①.关系操作符:功等于不等于大于大于或等于小于小于或等于能
操作符=或==!=或<>>>=<<=②.
AND和OR(与、或)
③.④.⑤.
[NOT]BETWEEN...AND...([不]在...与...之间)[NOT]IN(值1,值2,值3,。,值n)所期望的值。。[NOT]MATCHES模式匹配:
MATCHES“字符值”*?表示零个或多个字符表示单个字符
[...]表示方括号中的任意字符[^..]表示除此之外的任意字符[A-Z]表示从A到Z的任意字符\转换下一个字符的特殊含义
第21页21页共40页40页
⑥.
[NOT]LIKE模式匹配:(象...一样)
LIKE“字符值”%—⑦.⑧.表示零个或多个字符表示单个字符
IS[NOT]NULL表示空值或非空值:子查询:
WHERE表达式关系运算符{ALL|ANY|SOME}(SELECT语句)WHERE表达式[NOT]IN(SELECT语句)WHERE[NOT]EXISTS(SELECT语句)ALL表示子查询可返回0个,1个或多个值,并对每个返回值比较为真时则条件为真ANY表示子查询可返回0个,1个或多个值,至少一个返回值比较为真时则条件为真SOMEANY的别名
IN检查表达式是否在由下面的SELECT语句返回的结果中EXISTS检查其后的SELECT语句是否返回了任何一个记录,返回记录则条件为真NOT对查找条件的真值取非
9.SQL语句总述:SQL(结构化的查询语言)在我们的实际工作中起着举足轻重的
第22页22页共40页40页
作用,符合国际通用标准,功能强大、语句简洁、操作方便、使用灵活,能随时从数据库中进行文本的上下载工作,通过使用视图与临时表来筛选数据则使我们的工作更加方便、有效,在SELECT语句中可以嵌入返回值的过程,从而进一步提高工作效率。
第四章
关系数据库Informix-4GL程序设计
一.关系数据库程序设计的关键和方法:1.成功设计一个关系数据库的关键因素:①.深入广泛、了解企业内部组织机构及需求;②.始终保持与最终用户交互、联系;③.设计过程中要采用结构化的开发方法,便于维护;④.要用ER图表示数据结构模型。2.结构化的开放方法交整个应用的开发周期划分成阶段:①.系统开发的可行性报告;②.程序的功能需求;③.技术设计(系统规格说明书);④.编程及测试(源程序代码清单);⑤.
用户培训、实现(用户手册)。⑥.程序的维护与升级。3.数据库设计的方法与步骤:
第23页23页共40页40页
①.获得对企业的了解(需求分析);②.标识主要的数据对象(实体、属性、联系);③.用ER图画出数据对象(初步ER图);④.求解逻辑数据类型(处理联系、去掉冗余);⑤.确定属性的细则(数据类型);⑥.通过规范化来修正逻辑模型;⑦.用SQL的DDL将逻辑模型转换成物理的DB模式。
二.Informix-4gl的语法规则:1.程序体结构:DATABASEGLOBALS###定义全局变量DEFINE变量名1变量名n变量类型,变量类型
ENDGLOBALS或GLOBALS“glob.4gl”MAINDEFINE变量名1变量名n变量类型,变量类型
OPTIONSPROMPTLINE1,ERRORLINE24,
MESSAGELINE24,COMMENTLINE24,
第24页24页共40页40页
FORMMENUnext
LINE4,LINE4,keycontrol-n,
previouskeycontrol-p,deleteinsertkeycontrol-o,keycontrol-i,
ACCEPTKEYINTERRUPT,###使用ESC键无效INPUTWRAPDEFERINTERRUPT###按接受键后存入###防止非法中断
setisolationtodirtyreadsetlockmodetowait5whenevererrorcontinue###遇到错误继续执行
callstartlog(“slif_err.log”)....(其它程序语句)....(用户函数)ENDMAIN2.程序的具体语法:①.命令行参数:arg_val[0]:表示命令本身arg_val[1]:表示命令行参数1arg_val[n]:表示命令行参数nsum_args():测试命令行参数的总个数
第25页25页共40页40页
②.程序变量:除serial类型外,其余均可为数据库字段类型。
第五章
Informix-SPL(过程)语法详解
Informix数据库用户一般都熟悉的使用SQL语句进行简单的查询和统计,而在Informix-Online的数据库服务器中提供了用结构化查询语言SQL语句和流程控制存储语言SPL创建存储例程,以减少Informix的处理。存储例程是SQL语句和SPL的集合。它们存放在数据库中,语句会被分析.优化,在例程的执行中,高速缓存中会有一SQL执行规划,使后续操作的执行速度很快。而单独的SQL语句只有在执行时才会被优化,并且存储例程可以被不同的开发工具调用(4GL、ESQL/C、POWERBUILDER.DELPHI),在SELECT语句中也调用过程。例程调试简单,不必重新编译应有软件包。在例程创建时Informix查询处理器会分析它,并产生一执行规划,永久存放于SPROCEDURES.SYSPROBODY.和SYSPROPLAN中,其后例程按此规划执行,由于大部分查询处理已经完成,存储例程可以在瞬间执行完毕。由于存储例程所具有的优越性,它已成为进行Informix数据库核心开发的有力工具,掌握它对Informix的开发人员有积极意义,现将我在实际工作中使用的语法和例子详解于下,疏漏和错误请来信指教。1.创建和执行例程
①.创建例程语法:
第26页26页共40页40页
CRAETEPROCEDURE[OWNER.]PROCEDURE_NAME(参数1型=[DEFAULT],参数2=[DEFAULT])参数类型=[DEFAULT],参数n
参数类
参数类型
RETURNING值1类型,值2类型,值n类型;<......>语句体;ENDRPOCEDURE
例程大小不可超过64K,这包括所有的SQL.SPL.空格.跳格符,例程名最多18个字符,并在数据库中唯一存在,语句间用";"分隔,例程只能在当前数据库中创建,例程创建后是一标准执行模板块,可在不同的应有中对其调用,这对开发不同版本的应用将更为便利。例:createprocedure"test".upwage()definerev_rev_item_codevarchar(2,0);definerev_p_rev_datedate;defineacc_rec_prem_nodecimal(8,2);definerev_p_rev_amt
decimal(10,2);definerev_I_info_branchvarchar(6,0);definerev_I_info_appl_nodecimal(8,0);definerev_I_info_date
date;definerev_o_rev_datedate;definerev_o_rev_amtdecimal(10,2);defineacc_ac_rev_amntdecimal(10,2);defineacc_rec_prem_datedate;beginwork;foreachcur_rev
第27页27页共40页40页
for
select
I_info_appl_branch,I_info_appl_no,I_info_date,o_rev_date,o_rev_amtintorev_I_info_branch,rev_I_info_appl_no,rev_I_info_date,rev_o_rev_date,rev_o_rev_amtfromrev_rec_tblwhere(rev_item_code="PS")andp_rev_dateisnullandp_rev_amt=0and(I_info_appl_noisnotnullorI_info_dateisnotnull);selectmax(rec_prem_acc_no)intoacc_rec_prem_nofromwhere
rec_prem_accI_info_appl_branch=rev_I_info_branchandI_info_appl_no=rev_I_info_appl_noandI_info_date=rev_I_info_dateando_rev_date=rev_o_rev_dateandrev_item_code="PS"andac_rev_amnt=rev_o_rev_amt;selectdate(rec_prem_date)intoacc_rec_prem_date
fromrec_prem_accwhereI_info_appl_branch=rev_I_info_branchandI_info_appl_no=rev_I_info_appl_noandI_info_date=rev_I_info_dateando_rev_date=rev_o_rev_dateandrev_item_code="PS"andac_rev_amnt=rev_o_rev_amtand
第28页28页共40页40页
rec_prem_acc_no=acc_rec_prem_no;selectac_rev_amntintoacc_ac_rev_amntfromrec_prem_accwhereI_info_appl_branch=rev_I_info_branchandI_info_appl_no=rev_I_info_appl_noandI_info_date=rev_I_info_dateando_rev_date=rev_o_rev_dateandrev_item_code="PS"andrec_prem_acc_no=acc_rec_prem_noandac_rev_amnt=rev_o_rev_amt;ifacc_ac_rev_amntisnulloracc_rec_prem_dateisnullthencontinueforeach;endif;updaterev_rec_tblsetp_rev_date=acc_rec_prem_date,p_rev_amt=acc_ac_rev_amntwhereI_info_appl_branch=rev_I_info_branchandI_info_date=rev_I_info_dateandI_info_appl_no=rev_I_info_appl_noando_rev_date=rev_o_rev_date;endforeach;commitwork;
第29页29页共40页40页
endprocedure;②.执行例程语法:A):在dbaccess中EXECUTEPROCEDUREDBNAME@SERVER_NAME:例程名(参数1,参数2,.....)用这种方法可对例程进行调试。B):在Informix-4GL中PREPAREPREPSTATTEMENTFROM"EXECUTEPROCEDURE
DBNAME@SERVER_NAME:例程名(?,?,?,...)DECLAREP_CURSSURSORFORPREPSTM
TOPENP_CURSUSING参数1,参数2,....FETCHP_CURSINTO返回值1,返回值2,...CLOSEP_CURS当应用程序不支持EXECUTPROCEDURE语法,则需使用PREPARE命令,如INFORMIX-4GL中,而使用INFORMIX-NEWEAR则无此限制,需注意的是PREPARE语句中变量用?号代替,其个数要与例程的参数个数和类型一致,返回值也是一样。C):在Informix-ESQL/C中EXECSQLEXECUTEPROCEDURE例程名(参数1,参数2,...)INTO(返回值1,返回值2,...)EC5.0或更高版本可使用EXECUTE在PROCEDURE语法,在ESQL/C中宿主变量用于想存储例程传递值,同时也接收返回值.D):在POWERBUILDER中
第30页30页共40页40页
DECLARE逻辑名PROCEDUREFOR例程名(:参数1,:参数2:...)INTO:返回值1,:返回值2,..USING事物名EXEC例程名(:参数1,:参数2,.....)PB要求为例程制定逻辑名,以后的SQL语句将以逻辑名为准指向后台数据库例程,当例程即便没有参数也必须有小扩号.2.流程控制语言:在过程中也提供了其他语言具备的流程控制语言,完成循环判断和分类处理的能力,主要有:①.IF....ELIF.....ELSE.....ENDIF例:CRAETEPROCEDURESTR_COM(STR1CHAR(20),STR2CHAR(20))RETURNINGINT;DEFINERELINT;IFSTR1>STR2THENLETREL=1;ELIFSTR2>STR1THEN--当STR2>STR1REL=-1LETREL=-1;ELSELETREL=0;ENDIFRETUENREL;ENDPROCEDURE当IF的条件为一个SQL语句如SELECT时需用扩号,并且返回值为单值。
第31页31页共40页40页
--当STR1>STR2REL=1
--当STR1=STR2REL=0
②.FOR.....ENDFOR例:FORINDEXIN(20TO30STEP2,100TO200STEP10)--执行代码ENDFORFOR的条件可以是变量,常量或一个SQL语句的返回值③.WHILE.......ENDWHILE当WHILE的条件为TRUE时执行WHILE后的语句,为FALSE退出循环。例:WHILEI<10INSERTINTOTBB_1VALUES(I);LETI=I+1;ENDWHILE;④.FOREACH........ENDFOREACH该语句较为特别FOREACH循环能够声明并打开游标,读取记录行,并关闭游标.其完整语法:FOREACH游标名[WITHHOLD]SELECT字段名INTO变量FROMTABLEWHERE条件;ENDFOREACHFOREACHEXECUTEPROCEDURE例程名(参数1,参数2,..)INTO变量ENDFOREACH该循环中语句的执行次数与SELECT和EXECUTEPROCEDURE语句返回的行数一样多。如果FOREACH语句中包含一条EXECUTEPROCEDURE,
第32页32页共40页40页
则循环停止的条件为:.执行了不带任何参数的RETURN语句.执行了ENDPROCEDURE如果没有返回行数据,则不再执行循环中的语句。存储例程中不允许使用滚动游标。当使用WITHHOLD时,更新游标将放置更新锁,使其他过程无法更新该行,直至事物完成,当在FOREACH循环的语句块中的UPDATE或DELETE有WHERECURRENTOF短语,则存储例程会自动使用更新游标例1:BEGINWORK;FOREACHCUR_1FORSELECTDATEINTOV_DATEFROMTABLEIF
V_DATEISNULLTHENDELETEFROMTABLEWHERECURRENTOFCUR_1;ENDIF;ENDFOREACH;COMMITWORK;例2:FOREACHEXECUTEPROCEDUREBAR(10,20)INTOIINSERTINTOTABLE1VALUES(I)ENDPROCEDURE⑤.CONTINUE适用语句(FORWHILEFOREACH)将执行传递给下
一次循环⑥.EXIT适用语句(FORWHILEFOREACH)
第33页33页共40页40页
从循环中退出例:FORJ=1TO20IFJ>10THENCONTINUEFOR;ENDIFLETI,S=J,0;WHILEI>0LETI=I-1;IFI=5THENEXITFOR;ENDIFENDWHILEENDFOR3.变量的定义与赋值:存储例程中使用的变量必须在例程开始处用DEFINE语句定义,变量的数据类型为除SERIAL以外的任意类型,如果定义一个TEXT或BYTE类型的变量,则该变量为指向数据的指针。传递给程序的变量必须在CRAETEPROCEDURE语句中定义。DEFINE也可使用LIKE语句。变量类型缺省为局部变量,也可引用GLOBAL定义全局变量,全局变量在例程间保持它的值,直至会话结束。用户必须为每一个定义的全局变量赋缺省值,缺省值仅在例程第一次引用该全局变量时使用,以后的例程将会忽略其缺省值。
第34页34页共40页40页
例:CREATEPROCEDURESP1()RETURNINGINT;DEFINEGLOBALIINTDEFAULT1;LETI=I+1;RETURNI;ENDPROCEDURECRAETEPROCEDURESP2()RETURNINGINT;DEFINEGLOBALIINTDEFAULT4;LETI=I+1;RETURNI;ENDPROCEDURE当执行顺序为SP1,SP2返回值3,当执行顺序为SP2,SP1返回值为6。例程也可被声名为变量例:DEFINELENPROCEDURELETX=LEN(A,B,C)变量赋值必须用LET关键字,如果不给变量赋值,变量会有一个不确定值,任何对该变量的使用都会产生错误。BEGIN......END利用BEGIN....END可以封装语句,它允许用户完成以下功能:.定义仅用于该语句块的变量
第35页35页共40页40页
.在语句块内以不同方式处理异常情况..在某语句块中定义的变量,在该语句块以及它所包含的语句块都有效,除非又将变量定义一次。例:CREATEPROCEDURESP()RETURNINGINT;DEFINEV1INT;LETV1=1;BEGINDEFINEV1INT;LETV1=2;ENDRETURNV1;ENDPROCEDURE返回值为1。4.在例程中执行其他例程和系统命令:应用CALL命令可在例程中调用其他的例程。例:CREATEPROCEDURESP()DEFINEI,J,K,LINT;CALLSP1(10,20)RETURNINGI,J,K;ENDPROCEDURE用SYSTEM可在例程中调用系统命令。通过SYSTEM命令,用户可以执行操作系统命令。系统命令放在括号内,用双管道号(||),还
第36页36页共40页40页
可以为SYSTEM命令串连起多个表达式。但在存储例程中不能使用该命令的返回值,如果系统调用失败(返回非零值),返回值将和SQL错误代码一起,放在ISAM代码中。例:SYSTEM"/usr/exec/exec.sh"用RETURN命令可以将例程运行的结果
返回给调用它的应用。当需要多次调用同一例程可执行RETURNWITHRESUME命令,它可以保证下一次调用该例程时,所有变量保持原值,而且从RETURNWITHRESUME后的第一条语句执行。例:RETURNV_INTWITHRESUME;5.调试跟踪语句:我们在做应用的时候,当程序完成后都需要进行数据测试,以便验证程序逻辑的严密性,在例程中,INFORMIX也提供了调试跟踪语句,其主要有(TRACE,ONEXCEPTION,RAISEEXCEPTION)。TRACE语句可以跟踪语句块中每一个活动语句的结果和过程,并且可用SETDEBUGFILETOFILENAME语法写入指定文件中。ONEXECEPTION可在例程中设定断点,向一个DEBUGLOG或ERRLOG文件写入错误信息。完整语法为:ONEXCEPTIONIN(error_number)setsql错误代码变量,isam错误代码变量,错误信息变量处理语句ENDEXCEPTIONWITHRESUME注意SET后的3个变量必须在DEFINE中定义,其中sql错误代
第37页37页共40页40页
码.Isam错误代码变量类型为INT,错误信息变量为足够长的CHAR变量。Error_number是一个SQL错误代码或用RAISEEXCEPTION设置的陷阱代码。WITHRESUME为可选项,当用WITHRESUME语句时,INFORMIX会执行完ONEXCEPTION语句块的命令后会返回到出错命令行的下一行接着执行,或RAISEEXCEPTION的下一行执行。RAISEEXCEPTION人为设定SQL错误代码,ISAM错误代码,错误信息。RAISEEXCEPTION与ONEXCEPTION语法连用很容易跟踪例程的错误代码例:CREATEPROCEDURETMP_PROCEDURE()DEFINESQLCODEINT;DEFINEISAMCODEINT;DEFINEERR_TXTCHAR(255);ONEXCEPTIONSETSQLCODE,ISAMCODE,ERR_TXTIFSQLCODE=-284THENRASIEEXCEPTIONSQLCODE,ISAMCODE,"在TMP_PROCEDURE中查询返回多条记录";ENDIFIFSQLCODE=-1218THENRASIEEXCEPTIONSQLCODE,ISAMCODE,"在TMP_RPOCEDURE中类型转换错误“;ENDIF
第38页38页共40页40页
ENDEXCEPTIONSELECT.......ENDPROCEDURE
6.过程实例:CREATEPROCEDUREYEARS(E_DATEDATE,B_DATEDATE)RETURNINGINT;返回E_DATE与B_DATE之间的整年数(E_DATE大于B_DATE)DEFINEV_EINT;DEFINEV_BINT;LETV_E=MONTH(E_DATE);LETV_B=MONTH(B_DATE);IFV_EV_BTHENLETV_E=YEAR(E_DATE)-YEAR(B_DATE);RETURNV_E;ENDIF;LETV_E=DAY(E_DATE);LETV_B=DAY(B_DATE);IFV_E 第39页39页共40页40页
LETV_E=YEAR(E_DATE)-YEAR(B_DATE)-1;RETURNV_E;ELSELETV_E=YEAR(E_DATE)-YEAR(B_DATE);RETURNV_E;ENDIF;ENDPROCEDURE;
第40页40页
共40页40页