stroustrup 发表于 2003-09-01 15:43

INFORMIX-4GL实用手册(转载)

第一章   Informix环境变量的设定

一.环境范例:

变 量 名 称
变    量    说    明

DBDELIMITER
指定由dbload在卸出数据文件中使用的字段定界符

DBDATE
指定在DB中想要使用的日期格式(Y4MD/,MDY4-)

DBEDIT
指定在程序员环境中想要使用的文本编辑器(vi)

DBLANG
指定在程序中所使用消息文件的存放目录

DBMONEY
指定在DB中想要使用的货币格式

DBPATH
指定DB与其它相应文件的搜索路径

DBPRINT
指定计算机的打印程序

DBSRC
指定程序调试阶段文件的搜索路径

DBTEMP
指定临时文件的存放目录

INFORMIXDIR
指定Informix文件的存放目录(/usr/informix)

INFORMIXSERVER
指定Informixr的数据库服务器名称

FORMDIR
指定Informix屏幕格式文件的存放路径

DBNLS
指定Informix传输汉字(DBNLS=2)

LANG
指定Informix可显示汉字(LANG=english.8859)

ONCONFIG
指定Informix-Online的配置文件(onconfig.life)

PATH
指定Informix可执行文件的搜索路径

TERM
指定Informix的终端类型(TERM=vt100)

TERMCAP
指定Informixr的终端类型文件




二.环境范例:

.profile (环境变量的等号前后不得为空格)

stty -istrip -isig (防止用户非法中断)

INFORMIXDIR=/usr/informix

INFORMIXSERVER=ld420501_tcp

ONCONFIG=onconfig.life

PATH=$PATH:$INFORMIXDIR/bin:$HOME/bin:$HOME/form:$HOME/prg

DBPATH=/u/cbps/form:/u/cbps/bin

FORMDIR=/u/cbps/form

DBDATE=Y4MD/

LANG=english_us.8859

DBLANG=english_us.8859

DBNLS=2

TERMCAP=/usr/informix/etc/termcap

TERM=vt100

export INFORMIXDIR INFORMIXSERVER ONCONFIG PATH DBPATH FORMDIR DBDATE LANG

export DBLANG DBNLS TERMCAP TERM

环境变量的设置文件中还可加入其它Shell语句





第二章Informix产品线及DB应用开发工具简介



一.Informix(英孚美)产品线简介(三大类):

1.数据库服务器(Database Server):

    ①.ODS (Informix-Online Dynemic Server)

       联机动态服务器,多线索,多性能的DB server(数据库服务器)

    ②.XPS (Informix-Online Extended Parallel Server)

       将DSA扩展至松耦合或非共享的计算体系结构,动态可申缩性体系结构(Dynemic Scerable Architerta),适用于大型数据库的应用,并行SQL操作。

    ③.IUS (Informix-Universbl Server)

       处理丰富而复杂的数据而设计,并用Datablade模块技术,用来存储和检索丰富的多媒体Data及其他复杂的插入或对象扩展模块。



2.应用开发工具:

    ①.Informix-NERERA 适用于关键性业务的C/S(客户机/服务器)模式,开放性,图形化面向对象的开发环境。             └→ Client/Server Model

    ②.Informix-4GL    适用于各种类型业务的哑终端操作方式,适用性广,开发方便,可维护性好,功能强大,无图形功能,用户界面不够友好。

    ③.Informix-SQL    符合国际标准的SQL语言,具有通用性,DDL与DML合为一体,高度的非过程化,分为嵌入式和交互式两种形式,具有数据控制,访问功能。

    ④.Informix-ESQL/C 把SQL嵌入C语言提供实现SQL语言的目标函数库,利用宿主程序完成一个应用的过程。

3.连接工具:

   c4gl <*.4gl *.c *.ec *.o>; -c,o,s <OBJ>;

   └→ 4gl 源程序文件的编译,连接生成目标文件或可执行文件

   esql <*.ec *.c *.o>;       -c,o   <OBJ>;

   └→ esql源程序文件的编译,连接生成目标文件或可执行文件



   cc   <*.c *.o>;            -c,o   <OBJ>;

   └→ c语言源程序文件的编译,连接生成目标文件或可执行文件



二.SQL(Structured Query Language)简介:

1.SQL(结构化查询语言)的主要特点:(RDB Server 关系型数据库服务器)

    ①.一体化:DDL与DML合为一体.

    ②.高度非过程化:what to do ,not how to do用户使用起来简单方便.

    ③.具有SQL交互式与SQL嵌入式两种形式.



2.SQL语言的分类:

    ①.DDL (数据定义语言):用来创建,更改,删除数据库基表视图.

    ②.DML (数据操纵语言):对DB中的数据进行查询或增删改操作.

    ③.DCL (数据控制访问语言):对存取权根的控制,授权和回收,游标语句,动态管理语句,数据完整性语句,查询优化语句,事务处理语句.



三.Stores7,Dbaccess,Isql,I4gl,Upscol等DBMS实用工具:

1.$dbaccessdemo7       <Retuen>;

    └→创建范例DB└→数据库名└→缺省不带系统日志



2.$dbaccess <Retuen>;

    └→捆绑在Informix-Online DB Server上的一套DBMS实例程序,可以做到:

   ①.利用该工具可以做到创建和删除数据库.

   ②.查询数据库中各种信息,编辑使用SQL语句.

   ③.创建,更改,删除数据库基表.

   ④.增加,删除,修改数据库中原始记录.

   ⑤.从OS(操作系统)文件中装载数据到数据库中.

   ⑥.将数据库中的数据卸出到一个OS(操作系统)文件中.

   ⑦.创建回收权限.

   ⑧.利用该工具可以创建,删除,修改Procedure(过程)。



3.$isql <Retuen>;

    └→捆绑在Informix-Online DB Server上的一套DBMS实例程序,可以做到:

   ①.利用该工具可以做到创建和删除数据库.

   ②.查询数据库中各种信息,编辑使用SQL语句.

   ③.创建,更改,删除数据库基表.

   ④.增加,删除,修改数据库中原始记录.

   ⑤.从OS(操作系统)文件中装载数据到数据库中.

   ⑥.将数据库中的数据卸出到一个OS(操作系统)文件中.

   ⑦.创建回收权限.

   ⑧.利用该工具可以创建,删除,修改,编译屏幕表格文件(*.per),并运行.

   ⑨.利用该工具可以创建,删除,修改,编译报表文件(*.ace),并运行.



4.$i4ql <Retuen>;

    └→捆绑在Informix-Online DB Server上的一套Informix-4GL实例程序,可以做到:

   ①.利用该工具可以做到创建和删除数据库.

   ②.查询数据库中各种信息,编辑使用SQL语句.

   ③.创建,更改,删除数据库基表.

   ④.增加,删除,修改数据库中原始记录.

   ⑤.从OS(操作系统)文件中装载数据到数据库中.

   ⑥.将数据库中的数据卸出到一个OS(操作系统)文件中.

   ⑦.授权和回收权限.

   ⑧.利用该工具可以创建,修改,编译屏幕表格文件(*.per).

   ⑨.利用该工具可以创建,删除,修改,编译,运行Informix-4GL源程序文件(*.4gl).



5.$upscol <Retuen>;

    └→捆绑在Informix-Online DB Server上的一套屏幕属性实例程序,可以做到:

   ①.利用该工具可以调整屏幕字段的数据属性和显示属性.

   ②.调整屏幕字段的前背颜色,下划线,反显等.

   ③.调整屏幕字段的数据格式,消息,限制输入等.



6.$form4gl <文件名>; <Return>;

   ①.编译已存在的屏幕表格文件:

      form4gl    <*?*.per>;

                  └→被编译的屏幕表格文件名

   ②.为指定数据库中的表格生成默认屏幕格式文件:

      form4gl -d <filename>;    <DB Server>;   <Table>;

                  └→生成文件└→数据库名└→表名



7.$c4gl <*.4gl>; <Return>;

   使用方法: c4gl [-Vaeqcz] [-phase 12345] [-ansi] [-anyerr]

                  [-globcurs | -localcurs] [-nokeep | -keep]

                  [-static | -shared] [-nolinenos | -linenos] [-otherargs]

                  

                   [-o outfile]

   开关参数       使用说明

    -V            Display version of 4gl only

    -a            Do array bounds checking

    -e            Preprocess only, no compilation or linking

    -q            Quiet mode for i4glc1

    -c            Preprocess & compile only, no linking

    -z            Allow variable number of arguments to functions

    -phase 12345Process only the phase that indicated

    -ansi         Check SQL statements for ANSI compliance

    -anyerr       Set status variable after expressions

    -globcurs   Make cursor definitions global to program

    -localcurs    Make cursor definitions local to module (default)

    -nokeep       Delete intermediate .4ec, .ec, and .c files (default)

    -keep         Keep intermediate .4ec, .ec, and .c files

    -linenos      Produce #line numbering in .c file (default)

    -nolinenos    Suppress #line numbering in .c file

    -static       Use static libraries

    -shared       Use dynamic linking and shared libraries

    -otherargs    Other arguments are passed to the C compiler

    -o            Next argument is name of executable



8.$esql <*.ec>; <Return>;

   使用方法: esql [-e] [-static] [-shared] [-esqlcargs] [-otherargs]

                  [-o outfile] [-libs] esqlfile.ec

                   [-lyourlib...]

   开关参数       使用说明

    -e            Preprocess only, no compilation or linking

    -static       Use informix static libraries.

    -shared       Use informix shared libraries ( default is shared).

    -esqlcargs    esqlc arguments (-g, -G, -nln, -Ipathname, -nowarn, -V, -ansi,-xopen, -local, -log, -EDname, -EUname, -icheck)

    -otherargs    Other arguments are passed to cc

    -o            Next argument is program name

-libs         Display the list of libraries used by esql at link time.



9.dbexport,dbimport,dbschema,ontape数据库后备工具:

   dbexport以文本形式卸出数据库文件(Table、View、Procedure、Trigger等)

   dbexport <Dbname>; 或 dbexport <Dbname>; –t /dev/rStp0 –s –b

   dbimport以文本形式上载数据库文件(Table、View、Procedure、Trigger等)

   dbimport <Dbname>; -d workdbs –l buffered

   dbschema 以文本形式卸出数据库的建表、建过程的SQL文件

   dbschema –d <Dbname>; -t <Tabname|all>; -ss <Filename>; 卸出指定表或所有表

   dbschema –d <Dbname>; -f <Procname|all>; -ss <Filename>; 卸出指定过程或所有过程

   ontape 数据库系统备份工具

   ontape –s –B <Dbname>; 为指定数据库恢复Buffered日志





第三章   Informix-SQL Version 6.05.UD1 应用



一.有关数据库,基表,索引的创建与删除

1.语法约定:

    <......>;   表示必选项

    {......}   表示必选其中项

    [......]   表示可选项

    (......)   表示语句的一部分

       |         表示多项选一

    大写    表示Informix的保留字

    小写    表示Informix的库名,表名,字段名,变量名



2.数据库(Database):

   ①.创建一个DB:

      CREATE DATABASE      <DB name>;   

         └─┴→语法关键字└→数据库名   └→是否带数据库日志

      创建一个DB同时也打开了这个DB

   ②.数据库命名规则:

      ㈠.数据库名不超过10个字符.

      ㈡.必须以字母打头,其余部分可以是字母,数字,下划线的任意组合.

      ㈢.在同一数DB Server(据库服务器)中数据库名应具有唯一性.

      ㈣.数据库名不得是Informix的保留字



3.数据库基表(Table):

   ①.创建一个DB Table:

      DATABASE   <DB name>;   →数据库名

      CREATE TABLE <TB name>;   →数据库表名

      字段名称字段类型      字段说明

   (column0serial(1)   , #有序整数型,其初始值为1

       column1integer   , #从-2147483647到+2147483647之间的整数

       column2smallint    , #从-32767到+32767之间的整数

       column3float default 0.00 not null,#双精度浮点数

       column4smallfloat, #单精度浮点数

       column5decimal(m,n), #具有可定义精度的数字(左边m-n位,右边n位)

       column6money(m,n), #与decimal型相同(货币型)

       column7date      , #日期型

       column8datetime year to second,#日期时间型(1999-09-07 09:52:52)

       column9char(n)   , #字符型n表示字符长度

       column10 varchar(n), #字符型(最后一个字段无逗号)

       check (字段名 in(值1,值2,值3) constraint 名称,

       primary key(字段1,字段2,字段n) constraint 名称 ##主键唯一,非空

   );



数 据 类 型
字   段   长   度

CHAR
语句中定义的长度

VARCHAR
语句中定义的长度

SMALLINT
2个字节

INTEGER
4个字节

SMALLFLOAT
4个字节

FLOAT
8个字节

SERIAL
4个字节

DATE
4个字节

DATETIME
8个字节(Year to Second),其它为4

DECIMAL(m,n)
依赖精度(m/2+1四舍五入到下一整数)

MONEY(m,n)
依赖精度(m/2+1四舍五入到下一整数)




   ②.基表命名规则:

      ㈠.表名最多不超过18个字符,除此以外与数据库命名规则雷同.

      ㈡.必须以字母打头,其余部分可以是字母,数字,下划线的任意组合.

      ㈢.在同一数据库中表名应具有唯一性.

      ㈣.表名不得是Informix的保留字.

      ㈤.表中字段名不得超过18个字符,定义like table.* 必须保证前8个字符的唯一性。

      ㈥.表中字段名不得重复(不区分大小写)。



4.索引(Index):

   ①.索引分类:

      ㈠.单字段索引:提高查询和分类操作效率。

      ㈡.多字段索引:加快几个字段分类处理的速度。

      索引仅是加快数据分类处理的速度。

   ②.索引规则:

      ㈠.直到表中有上百条记录时才加索引.

      ㈡.经常用于检索和排序操作的字段.

      ㈢.用于连接表和使用频率高的字段。

      ㈣.不要对含有大量重复值的字段加索引,索引字段中相同的值不得出现多于65536次

      ㈤.不得对多于8个字段的组加索引。

      ㈥.不得对长度超过120字节的一个字段或一组字段加索引。

      ㈦.索引命名规则与表名命名规则相似。

   ③.创建索引:

      CREATE INDEX <IDX name>;→索引名

                └→唯一索引      ON <TBname>;→表名

                                     (column1 ,column2,..,columnn)

                                             └→降序索引

5.视图(View):

    ①.视图定义:视图是数据库上动态的窗口而不是静态的状况,并且是以数据库表的形式出现在数据库中,授权与增、删、改操作与基表的操作一致。

    ②.视图命名规则:

      ㈠.表名最多不超过18个字符,除此以外与数据库基表的命名规则雷同.

      ㈡.必须以字母打头,其余部分可以是字母,数字,下划线的任意组合.

      ㈢.在同一数据库中视图名应具有唯一性.

      ㈣.视图名不得是Informix的保留字.

      ㈤.视图中字段名不得超过18个字符,必须保证前8个字符的唯一性。

      ㈥.视图中字段名不得重复(不区分大小写),应具有唯一性。

③.视图任务:

      ㈠.在数据库上为不同的用户提供不同的数据窗口,一个单独的视图可以包含来自不同的表的字段(字段不得同名)。

      ㈡.限制某些敏感数据的存取,只允许用户查看聚合信息。

      ㈢.允许用户象修改、插入和删除数据库中如同在视图中出现那样被组织起来的数据

④.视图与基表的区别:

      ㈠.不能利用视图取代格式说明文件中的表。

      ㈡.不能在视图上建立索引。

      ㈢.某些条件下不能通过视图更新或删除看到的数据。

      ㈣.不能通过ROWID存取表。

    ⑤.创建与删除视图:

       CREATE VIEW <View Name>;[(字段1,...,字段n)]

                     └→视图名称

         AS SELECT <标准Select 语句>; →不得使用UNION操作符

          →输入与修改是否满足SELECT语句条件



6.删除数据库、表、索引、视图:

①.       删除数据库:drop       <DBname>;

②.       删除表    :drop table <TBname>;

③.       删除索引:drop index <IDX name>;

④.       删除视图:drop view<VEW name>;

      删除数据库前必须关闭此数据库,删除数据库同时也删除了该数据库的所有表、索引、视图。

stroustrup 发表于 2003-09-01 15:44

INFORMIX-4GL实用手册(转载)

二.SQL实际应用:

1.INSERT 语句:(向数据库的表中插入一条行记录)

INSERT INTO <TB name>;(column1,comumn2,...,comumnn)

               └→表名      └→字段名表 →缺省为所有字段

   VALUES (value_list)→值列表

2.DELETE 语句:(从数据库的表中删除若干条满足条件的行记录)

DELETE FROM<TB name>;(WHERE 条件列表) →缺省为所有行记录

                └→表名



3.UPDATE 语句:(修改数据库表中满足条件的若干条行记录)

    UPDATE STATISTICS (TB name)→为指定数据库表更统计(缺省为所有)

                     └→表名

UPDATE       <TB name>;SET<字段1= 值1,字段n= 值n>;

               └→表名

                        (WHERE 条件列表)→缺省为所有行记录



UPDATE       <TB name>;SET<字段列表>; = <值列表>;

               └→表名

                        (WHERE 条件列表)→缺省为所有行记录



UPDATE       <TB name>;SET<字段.*>;   = <记录.*>;

               └→表名

                        (WHERE 条件列表)→缺省为所有行记录



4.SELECT 语句:(从一数据库表中选择满足条件的行记录)

SELECT <column1,column2,...,columnn>;   →*表示所有字段

(INTO <程序变量列表>;)或(INTO TEMP <临时表>;)

FROM <TB name>; [表别名]               →数据库表名

(WHERE <条件列表>;)                      →缺省为所有行记录

ORDER BY →排序(可选)可用1-8代替字段

GROUP BY       →分组(可选)可用1-8代替字段

                           →为组提供一个或多个限制条件

INTO TEMP <临时表>; (可选)



5.多表连接(Join)的SELECT语句:(从多个数据库表中选择满足条件的行记录)

SELECT <表1.字段>;,<表2.字段>;,<表2.字段>;,<表3.字段>;,...,<表n.字段>;

   FROM <表1>; [别名1],<表2>; [别名2],<表3>; [别名3],...,<表n>; [别名n]

WHERE <条件列表>;                        →WHERE子句不能省略

ORDER BY →排序,1-8表示字段在SELECT中出现的顺序。

GROUP BY →分组(可选)

                           →为组提供一个或多个限制条件

   INTO TEMP <临时表>; (将查询结果放到临时表中)

    当在WHERE子句中建立多表连接时,表与表之间至少有一个字段用于连接。连接的功能是建立一个临时组合的表,在对应表中符合连接条件的记录被连接形成一个记录。



6.SELECT语句中的聚合函数和日期函数:

语法                   功       能

COUNT(*)            满足条件的记录个数

COUNT(DISTINCT *)    去除重复项后满足条件的记录个数

      SUM(DISTINCT x)   满足条件字段x的总和

      AVG(DISTINCT x)   满足条件字段x的平均值

      MAX(x)            满足条件字段x的最大值

      MIN(x)            满足条件字段x的最小值

   DATE()            为表达式返回一个DATE类型的值

      DAY()            返回DATE类型表达式月份的日期(多少号)

      MDY()            分别代表月、日、年的整数返回一个DATE类型的值

    MONTH()            返回DATE类型表达式的月份

WEEKDAY()            返回DATE类型表达式星期的整数0-6(星期日至星期六)

   YEAR()            返回DATE类型表达式的年份



7.SELECT语句中的算术操作符:

符号         功       能

+             加法

-             减法

*             乘法

/             除法

mod            取模(取余数)

**             幂(乘方)



8.WHERE子句的详细说明:

①.   关系操作符:

操作符         功   能

       = 或 ==      等于

       !=或 <>;      不等于

       >;            大于

       >;=             大于或等于

       <            小于

       <=             小于或等于

②.   AND 和 OR(与、或)



③.    BETWEEN ...AND...([不]在...与...之间)

④.    IN (值1,值2,值3,。。。,值n) 所期望的值

⑤.    MATCHES 模式匹配:

MATCHES “字符值”

*   表示零个或多个字符

?   表示单个字符

[...] 表示方括号中的任意字符

[^..] 表示除此之外的任意字符

表示从A到Z的任意字符

\   转换下一个字符的特殊含义

⑥.    LIKE 模式匹配:(象...一样)

LIKE “字符值”

%   表示零个或多个字符

—   表示单个字符

⑦.   IS NULL 表示空值或非空值:

⑧.   子查询:

WHERE 表达式 关系运算符{ALL|ANY|SOME}(SELECT 语句)

WHERE 表达式 IN(SELECT 语句)

WHERE EXISTS(SELECT 语句)

         ALL 表示子查询可返回0个,1个或多个值,并对每个返回值比较为真时则条件为真

         ANY 表示子查询可返回0个,1个或多个值,至少一个返回值比较为真时则条件为真

      SOMEANY的别名

          IN 检查表达式是否在由下面的SELECT语句返回的结果中

      EXISTS检查其后的SELECT语句是否返回了任何一个记录,返回记录则条件为真

         NOT 对查找条件的真值取非





9.SQL语句总述:

   SQL(结构化的查询语言)在我们的实际工作中起着举足轻重的作用,符合国际通用标准,功能强大、语句简洁、操作方便、使用灵活,能随时从数据库中进行文本的上下载工作,通过使用视图与临时表来筛选数据则使我们的工作更加方便、有效,在SELECT语句中可以嵌入返回值的过程,从而进一步提高工作效率。





第四章   关系数据库Informix-4GL程序设计



一.关系数据库程序设计的关键和方法:

1.成功设计一个关系数据库的关键因素:

    ①.深入广泛、了解企业内部组织机构及需求;

    ②.始终保持与最终用户交互、联系;

    ③.设计过程中要采用结构化的开发方法,便于维护;

    ④.要用ER图表示数据结构模型。

2.结构化的开放方法交整个应用的开发周期划分成阶段:

    ①.系统开发的可行性报告;

    ②.程序的功能需求;

    ③.技术设计(系统规格说明书);

④.编程及测试(源程序代码清单);

    ⑤.用户培训、实现(用户手册)。

    ⑥.程序的维护与升级。

3.数据库设计的方法与步骤:

    ①.获得对企业的了解(需求分析);

    ②.标识主要的数据对象(实体、属性、联系);

    ③.用ER图画出数据对象(初步ER图);

④.求解逻辑数据类型(处理联系、去掉冗余);

    ⑤.确定属性的细则(数据类型);

    ⑥.通过规范化来修正逻辑模型;

⑦.用SQL的DDL将逻辑模型转换成物理的DB模式。



二.Informix-4gl的语法规则:

1.程序体结构:

DATABASE <DB Name>;

GLOBALS###定义全局变量

DEFINE变量名1变量类型,

      变量名n变量类型

END GLOBALS或GLOBALS “glob.4gl”

MAIN

      DEFINE变量名1变量类型,

      变量名n变量类型

    OPTIONSPROMPTLINE1,

             ERROR   LINE 24,

             MESSAGE LINE 24,

             COMMENT LINE 24,

             FORM    LINE4,

             MENU    LINE4,

             next   key control-n,

             previous key control-p,

             delete   key control-o,

             insert   key control-i,   

             ACCEPT KEY INTERRUPT,### 使用ESC键无效

             INPUT WRAP         ### 按接受键后存入

    DEFER    INTERRUPT            ### 防止非法中断

    setisolation to dirty read

    setlock mode to wait 5

    whenever error continue       ### 遇到错误继续执行

    call startlog(“slif_err.log”)

    ....(其它程序语句)

    ....(用户函数)

END MAIN

2.程序的具体语法:

   ①.命令行参数:

      arg_val:表示命令本身

      arg_val:表示命令行参数1

      arg_val:表示命令行参数n

      sum_args():测试命令行参数的总个数

   ②.程序变量:

      除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.创建和执行例程

①.创建例程语法:

      CRAETE PROCEDURE PROCEDURE_NAME (参数1参数类型=, 参数2参数类型=,参数n参数类型=)

                  RETURNING 值1类型,值2类型,值n类型;

      <......>;语句体;      END RPOCEDURE

例程大小不可超过64K,这包括所有的SQL.SPL.空格.跳格符,例程名最多18个字符,并在数据库中唯一存在,语句间用";"分隔,例程只能在当前数据库中创建,例程创建后是一标准

执行模板块,可在不同的应有中对其调用,这对开发不同版本的应用将更为便利。例:

create procedure "test".upwage()

define rev_rev_item_code varchar(2,0);

define rev_p_rev_date date;

define acc_rec_prem_no decimal(8,2);define rev_p_rev_amtdecimal(10,2);define rev_I_info_branch varchar(6,0);define rev_I_info_appl_no decimal(8,0);define rev_I_info_date date;define rev_o_rev_date date;

define rev_o_rev_amt decimal(10,2);

define acc_ac_rev_amnt decimal(10,2);

define acc_rec_prem_date date;

begin work;

foreach cur_rev for select I_info_appl_branch,I_info_appl_no,I_info_date,

o_rev_date,o_rev_amt into rev_I_info_branch,

rev_I_info_appl_no,rev_I_info_date,rev_o_rev_date,                           rev_o_rev_amt from rev_rec_tbl where

(rev_item_code="PS" ) and p_rev_date is null and

p_rev_amt=0 and (I_info_appl_no is not null or

I_info_date is not null);

select max(rec_prem_acc_no) into acc_rec_prem_no from rec_prem_acc where                                 I_info_appl_branch=rev_I_info_branch

and I_info_appl_no=rev_I_info_appl_no

and I_info_date=rev_I_info_date

and o_rev_date=rev_o_rev_date

and rev_item_code="PS" and

ac_rev_amnt=rev_o_rev_amt;

select date(rec_prem_date) into acc_rec_prem_date

from rec_prem_acc where I_info_appl_branch=rev_I_info_branch

and I_info_appl_no=rev_I_info_appl_no

and I_info_date=rev_I_info_date

and o_rev_date=rev_o_rev_date

and rev_item_code="PS" and

ac_rev_amnt=rev_o_rev_amt and

rec_prem_acc_no=acc_rec_prem_no ;

select ac_rev_amnt into acc_ac_rev_amnt

from rec_prem_acc

where I_info_appl_branch=rev_I_info_branch

and I_info_appl_no=rev_I_info_appl_no

and I_info_date=rev_I_info_date

and o_rev_date=rev_o_rev_date

and rev_item_code="PS"

and rec_prem_acc_no=acc_rec_prem_no

and ac_rev_amnt=rev_o_rev_amt;

if acc_ac_rev_amnt is null or acc_rec_prem_date is null then

   continue foreach;

end if;

update rev_rec_tbl

   set p_rev_date=acc_rec_prem_date,

       p_rev_amt =acc_ac_rev_amnt

where I_info_appl_branch=rev_I_info_branch

   and I_info_date=rev_I_info_date

   and I_info_appl_no=rev_I_info_appl_no

   and o_rev_date=rev_o_rev_date;

end foreach;

commit work;

end procedure;

②.执行例程语法:

    A):在dbaccess中

       EXECUTE PROCEDURE DBNAME@SERVER_NAME:例程名(参数1,参数2,.....)用这种方法可对例程进行调试。

    B):在Informix-4GL中

       PREPARE PREP STATTEMENT FROM "EXECUTE PROCEDURE DBNAME@SERVER_NAME:例程名(?,?,?,...)

       DECLARE P_CURS SURSOR FOR PREP STMT

       OPEN P_CURS USING 参数1,参数2,....

       FETCH P_CURS INTO 返回值1,返回值2,...

       CLOSE P_CURS

       当应用程序不支持EXECUT PROCEDURE语法,则需使用PREPARE命令,如INFORMIX-4GL中,而使用INFORMIX-NEWEAR则无此限制,需注意的是PREPARE语句中变量用?号代替,其个数要与例程的参数个数和类型一致,返回值也是一样。

    C):在Informix-ESQL/C中

       EXEC SQL EXECUTE PROCEDURE 例程名(参数1,参数2,...) INTO (返回值1,返回值2,...)在EC5.0或更高版本可使用EXECUTE PROCEDURE 语法,在ESQL/C中宿主变量用于想存储例程传递值,同时也接收返回值.

    D):在POWER BUILDER中

       DECLARE 逻辑名 PROCEDURE FOR 例程名(:参数1,:参数2:...) INTO :返回值1,:返回值2,..USING 事物名

       EXEC 例程名(:参数1,:参数2,.....)

       PB要求为例程制定逻辑名,以后的SQL语句将以逻辑名为准指向后台数据库例程,当例程即便没有参数也必须有小扩号.

2.流程控制语言:

在过程中也提供了其他语言具备的流程控制语言,完成循环判断和分类处理的能力,主要有:①.IF ....ELIF.....ELSE.....END IF例:

CRAETE PROCEDURE STR_COM(STR1 CHAR(20),STR2 CHAR(20))

RETURNING INT;

DEFINE REL INT;

IF STR1>;STR2 THEN--当STR1>;STR2 REL=1

LET REL=1;

ELIF STR2>;STR1 THEN --当STR2>;STR1 REL=-1

LET REL=-1;

ELSE

LET REL=0;   --当STR1=STR2 REL=0

END IF

RETUEN REL;

END PROCEDURE

当IF的条件为一个SQL语句如SELECT时需用扩号,并且返回值为单值。

②.FOR .....END FOR

例:FOR INDEX IN (20 TO 30 STEP 2,100 TO 200 STEP 10)

   --执行代码

   END FOR

FOR的条件可以是变量,常量或一个SQL语句的返回值

③.WHILE.......END WHILE

当WHILE的条件为TRUE时执行WHILE后的语句,为FALSE退出循环。

例:WHILE I<10

    INSERT INTO TBB_1 VALUES(I);

    LET I=I+1;

    END WHILE;

④.FOREACH........END FOREACH

该语句较为特别FOREACH循环能够声明并打开游标,读取记录行,并关闭游标.其完整语法:

FOREACH 游标名 SELECT 字段名 INTO 变量 FROM

   TABLE WHERE 条件 ;

END FOREACH

FOREACH EXECUTE PROCEDURE 例程名(参数1,参数2,..) INTO

变量

END FOREACH

该循环中语句的执行次数与SELECT 和 EXECUTE PROCEDURE语句返回的行数一样多。如果FOREACH语句中包含一条EXECUTE PROCEDURE,则循环停止的条件为:

.执行了不带任何参数的RETURN语句

.执行了END PROCEDURE

如果没有返回行数据,则不再执行循环中的语句。存储例程中不允许使用滚动游标。

当使用WITH HOLD时,更新游标将放置更新锁,使其他过程无法更新该行,直至事物完成,当在FOREACH循环的语句块中的UPDATE或DELETE有

WHERE CURRENT OF短语,则存储例程会自动使用更新游标

例1:BEGIN WORK;

   FOREACH CUR_1 FOR SELECT DATE INTO V_DATE FROM TABLE

   IF V_DATE IS NULL THEN

   DELETE FROM TABLE WHERE CURRENT OF CUR_1;

   END IF;

   END FOREACH;

   COMMIT WORK;

例2:FOREACH EXECUTE PROCEDURE BAR(10,20) INTO I

   INSERT INTO TABLE1 VALUES(I)

   END PROCEDURE

⑤.CONTINUE    适用语句( FOR WHILE FOREACH)   将执行传递给下一次循环⑥.EXIT

   适用语句( FOR WHILE FOREACH)

   从循环中退出

   例:FOR J=1 TO 20

       IF J>;10 THEN

          CONTINUE FOR;

       END IF

       LET I,S=J,0;

         WHILE I>;0

             LET I=I-1;

             IF I=5 THEN

               EXIT FOR;

             END IF

         END WHILE

       END FOR

3.变量的定义与赋值:

   存储例程中使用的变量必须在例程开始处用DEFINE语句定义,变量的数据类型为除SERIAL以外的任意类型,如果定义一个TEXT或BYTE类型的变量,则该变量为指向数据的指针。传递给程序的变量必须在CRAETE PROCEDURE语句中定义。DEFINE也可使用LIKE语句。变量类型缺省为局部变量,也可引用GLOBAL定义全局变量,全局变量在例程间保持它的值,直至会话结束。用户必须为每一个定义的全局变量赋缺省值,缺省值仅在例程第一次引用该全局变量时使用,以后的例程将会忽略其缺省值。

例:CREATE PROCEDURE SP1()

      RETURNING INT;

      DEFINE GLOBAL I INT DEFAULT 1;

      LET I=I+1;

      RETURN I;

      END PROCEDURE

      CRAETE PROCEDURE SP2 ()

      RETURNING INT;

      DEFINE GLOBAL I INT DEFAULT 4;

      LET I=I+1;

      RETURN I;

      END PROCEDURE

   当执行顺序为SP1,SP2 返回值3,当执行顺序为SP2,SP1返回值为6。

   例程也可被声名为变量

例:DEFINE LEN PROCEDURE

      LET X=LEN(A,B,C)

    变量赋值必须用LET关键字,如果不给变量赋值,变量会有一个不确定值,任何对该变量的使用都会产生错误。

      BEGIN......END

利用BEGIN....END可以封装语句,它允许用户完成以下功能:

   .定义仅用于该语句块的变量

   .在语句块内以不同方式处理异常情况.

   .在某语句块中定义的变量,在该语句块以及它所包含的语句块都有效,除非又将变量定义一次。

      例 : CREATE PROCEDURE SP ()

         RETURNING INT;

         DEFINE V1 INT;

         LET V1=1;

         BEGIN

             DEFINE V1 INT;

             LET V1=2;

         END

          RETURN V1;

      END PROCEDURE

   返回值为1。

4.在例程中执行其他例程和系统命令:

   应用CALL命令可在例程中调用其他的例程。

   例:CREATE PROCEDURE SP()   

       DEFINE I,J,K,L INT;

         CALL SP1(10,20) RETURNING I,J,K;

       END PROCEDURE

   用SYSTEM可在例程中调用系统命令。 通过SYSTEM命令,用户可以执行操作系统命令。系统命令放在括号内,用双管道号(||),还可以为SYSTEM命令串连起多个表达式。但在存储例程中不能使用该命令的返回值,如果系统调用失败(返回非零值),返回值将和SQL错误代码一起,放在ISAM代码中。

    例:SYSTEM "/usr/exec/exec.sh"

    用RETURN命令可以将例程运行的结果返回给调用它的应用。当需要多次调用同一例程可执行RETURN WITH RESUME命令,它可以保证下一次调用该例程时,所有变量保持原值,而且从RETURN WITH RESUME后的第一条语句执行。

    例:RETURN V_INT WITH RESUME;

5.调试跟踪语句:

   我们在做应用的时候,当程序完成后都需要进行数据测试,以便验证程序逻辑的严密性,在例程中,INFORMIX也提供了调试跟踪语句,其主要有(TRACE,ON EXCEPTION,RAISE EXCEPTION)。TRACE 语句可以跟踪语句块中每一个活动语句的结果和过程,并且可用SET DEBUG FILE TO FILENAME 语法写入指定文件中。

    ON EXECEPTION可在例程中设定断点,向一个DEBUGLOG或ERRLOG文件写入错误信息。完整语法为:

    ON EXCEPTION IN (error_number)

       set sql错误代码变量,isam错误代码变量,错误信息变量

       处理语句

    END EXCEPTION WITH RESUME

    注意SET后的3个变量必须在DEFINE中定义,其中sql错误代码.Isam错误代码变量类型为INT,错误信息变量为足够长的CHAR变量。Error_number是一个SQL错误代码或用RAISE EXCEPTION设置的陷阱代码。WITH RESUME为可选项,当用WITH RESUME语句时,INFORMIX会执行完ON EXCEPTION语句块的命令后会返回到出错命令行的下一行接着执行,或RAISE EXCEPTION的下一行执行。

    RAISE EXCEPTION人为设定SQL错误代码,ISAM错误代码,错误信息。

    RAISE EXCEPTION与ON EXCEPTION语法连用很容易跟踪例程的错误代码

例:CREATE PROCEDURE TMP_PROCEDURE()

       DEFINE SQLCODE INT;

       DEFINE ISAMCODE INT;

       DEFINE ERR_TXT CHAR(255);

      ON EXCEPTION SET SQLCODE,ISAMCODE,ERR_TXT

      IF SQLCODE= -284 THEN

         RASIE EXCEPTION SQLCODE,ISAMCODE,"在TMP_PROCEDURE中查询返回多条记录";

      END IF

      IF SQLCODE= -1218 THEN

         RASIE EXCEPTION SQLCODE,ISAMCODE,"在TMP_RPOCEDURE中类型转换错误“;

       END IF

   END EXCEPTION

      SELECT .......

END PROCEDURE



6.过程实例:

CREATE PROCEDURE YEARS(E_DATE DATE,B_DATE DATE)

RETURNING INT;返回E_DATE与B_DATE之间的整年数(E_DATE大于B_DATE)

    DEFINE V_EINT;

    DEFINE V_BINT;

    LET V_E = MONTH(E_DATE);

    LET V_B = MONTH(B_DATE);

    IF V_E < V_B THEN

       LET V_E = YEAR(E_DATE)-YEAR(B_DATE)-1;

       RETURN V_E;

    ELIF V_E >; V_B THEN

       LET V_E = YEAR(E_DATE)-YEAR(B_DATE);

       RETURN V_E;

    END IF;

    LET V_E = DAY(E_DATE);

    LET V_B = DAY(B_DATE);

    IF V_E < V_B THEN

       LET V_E = YEAR(E_DATE)-YEAR(B_DATE)-1;

       RETURN V_E;

    ELSE

       LET V_E = YEAR(E_DATE)-YEAR(B_DATE);

       RETURN V_E;

    END IF;

END PROCEDURE;

wjj9912130 发表于 2003-09-01 15:52

INFORMIX-4GL实用手册(转载)

好东西啊!谢谢啊!

ycguolin 发表于 2003-09-01 15:58

INFORMIX-4GL实用手册(转载)

~ing.

蓝色键盘 发表于 2003-09-01 16:06

INFORMIX-4GL实用手册(转载)

老大,怎么4gl的东西讲解的不是很多。


不过,我还是置精了,以后大家发现4gl相关的,就那上来。

stroustrup 发表于 2003-09-01 16:23

INFORMIX-4GL实用手册(转载)

4gl的手册有,但没有电子文档,找找看。

dintan 发表于 2003-09-01 17:42

INFORMIX-4GL实用手册(转载)

謝謝,收下

xuxiang 发表于 2003-09-01 18:42

INFORMIX-4GL实用手册(转载)

支持

czw1413_cn 发表于 2003-09-01 18:44

INFORMIX-4GL实用手册(转载)

收了

vsmark 发表于 2003-09-01 21:14

INFORMIX-4GL实用手册(转载)

页: [1] 2 3
查看完整版本: INFORMIX-4GL实用手册(转载)