Chinaunix首页 | 论坛 | 博客
  • 博客访问: 103118719
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类: DB2/Informix

2008-03-19 20:56:43

第一章   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 
  └→ 4gl 源程序文件的编译,连接生成目标文件或可执行文件
  esql <*.ec *.c *.o>       -c,o   
  └→ esql源程序文件的编译,连接生成目标文件或可执行文件 

  cc   <*.c *.o>            -c,o   
  └→ 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  [DBname]      [with log] 
   └→创建范例DB  └→数据库名  └→缺省不带系统日志 

2.$dbaccess 
   └→捆绑在Informix-Online DB Server上的一套DBMS实例程序,可以做到:
  ①.利用该工具可以做到创建和删除数据库.
  ②.查询数据库中各种信息,编辑使用SQL语句.
  ③.创建,更改,删除数据库基表.
  ④.增加,删除,修改数据库中原始记录.
  ⑤.从OS(操作系统)文件中装载数据到数据库中.
  ⑥.将数据库中的数据卸出到一个OS(操作系统)文件中.
  ⑦.创建回收权限.
  ⑧.利用该工具可以创建,删除,修改Procedure(过程)。 

3.$isql 
   └→捆绑在Informix-Online DB Server上的一套DBMS实例程序,可以做到:
  ①.利用该工具可以做到创建和删除数据库.
  ②.查询数据库中各种信息,编辑使用SQL语句.
  ③.创建,更改,删除数据库基表.
  ④.增加,删除,修改数据库中原始记录.
  ⑤.从OS(操作系统)文件中装载数据到数据库中.
  ⑥.将数据库中的数据卸出到一个OS(操作系统)文件中.
  ⑦.创建回收权限.
  ⑧.利用该工具可以创建,删除,修改,编译屏幕表格文件(*.per),并运行.
  ⑨.利用该工具可以创建,删除,修改,编译报表文件(*.ace),并运行. 

4.$i4ql 
   └→捆绑在Informix-Online DB Server上的一套Informix-4GL实例程序,可以做到:
  ①.利用该工具可以做到创建和删除数据库.
  ②.查询数据库中各种信息,编辑使用SQL语句.
  ③.创建,更改,删除数据库基表.
  ④.增加,删除,修改数据库中原始记录.
  ⑤.从OS(操作系统)文件中装载数据到数据库中.
  ⑥.将数据库中的数据卸出到一个OS(操作系统)文件中.
  ⑦.授权和回收权限.
  ⑧.利用该工具可以创建,修改,编译屏幕表格文件(*.per).
  ⑨.利用该工具可以创建,删除,修改,编译,运行Informix-4GL源程序文件(*.4gl). 

5.$upscol 
   └→捆绑在Informix-Online DB Server上的一套屏幕属性实例程序,可以做到:
  ①.利用该工具可以调整屏幕字段的数据属性和显示属性.
  ②.调整屏幕字段的前背颜色,下划线,反显等.
  ③.调整屏幕字段的数据格式,消息,限制输入等. 

6.$form4gl <文件名> 
  ①.编译已存在的屏幕表格文件:
     form4gl    <*?*.per>
                 └→被编译的屏幕表格文件名 
  ②.为指定数据库中的表格生成默认屏幕格式文件:
     form4gl -d       
                 └→生成文件  └→数据库名  └→表名 
7.$c4gl <*.4gl> 
  使用方法: c4gl [-Vaeqcz] [-phase 12345] [-ansi] [-anyerr]
                 [-globcurs | -localcurs] [-nokeep | -keep]
                 [-static | -shared] [-nolinenos | -linenos] [-otherargs]
                 [source.4gl ...] [othersrc.c ...] [otheresql.ec ...]
                 [otherobj.o ...] [yourlib.a ...] [-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 [phase 1]
   -c            Preprocess & compile only, no linking
   -z            Allow variable number of arguments to functions
   -phase 12345  Process 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> 
  使用方法: esql [-e] [-static] [-shared] [-esqlcargs] [-otherargs]
                 [-o outfile] [-libs] esqlfile.ec
                 [othersrc.c...] [otherobj.o...] [-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 或 dbexport –t /dev/rStp0 –s –b 
  dbimport以文本形式上载数据库文件(Table、View、Procedure、Trigger等)
  dbimport -d workdbs –l buffered
  dbschema 以文本形式卸出数据库的建表、建过程的SQL文件
  dbschema –d -t -ss 卸出指定表或所有表
  dbschema –d -f -ss 卸出指定过程或所有过程
  ontape 数据库系统备份工具
  ontape –s –B 为指定数据库恢复Buffered日志 


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

一.有关数据库,基表,索引的创建与删除
 1.语法约定:
   <......>     表示必选项 
   {......}     表示必选其中项 
   [......]     表示可选项 
   (......)     表示语句的一部分
      |         表示多项选一
   大写[A-Z]    表示Informix的保留字
   小写[a-z]    表示Informix的库名,表名,字段名,变量名 

2.数据库(Database):
  ①.创建一个DB:
     CREATE DATABASE           [WITH BUFFERED LOG]
        └─┴→语法关键字  └→数据库名     └→是否带数据库日志
     创建一个DB同时也打开了这个DB
  ②.数据库命名规则:
     ㈠.数据库名不超过10个字符.
     ㈡.必须以字母打头,其余部分可以是字母,数字,下划线的任意组合.
     ㈢.在同一数DB Server(据库服务器)中数据库名应具有唯一性.
     ㈣.数据库名不得是Informix的保留字

3.数据库基表(Table):
  ①.创建一个DB Table:
     DATABASE       →数据库名
     CREATE TABLE   →数据库表名 
     字段名称  字段类型      字段说明
    (column0  serial(1)   , #有序整数型,其初始值为1
      column1  integer     , #从-2147483647到+2147483647之间的整数
      column2  smallint    , #从-32767到+32767之间的整数
      column3  float default 0.00 not null,#双精度浮点数
      column4  smallfloat  , #单精度浮点数
      column5  decimal(m,n), #具有可定义精度的数字(左边m-n位,右边n位)
      column6  money(m,n)  , #与decimal型相同(货币型)
      column7  date        , #日期型
      column8  datetime year to second,#日期时间型(1999-09-07 09:52:52)
      column9  char(n)     , #字符型  n表示字符长度
      column10 varchar(n)  , #字符型(最后一个字段无逗号)
      check (字段名 in(值1,值2,值3) constraint 名称,
      primary key(字段1,字段2,字段n) constraint 名称 ##主键唯一,非空
    ); 
数 据 类 型字   段   长   度
CHAR语句中定义的长度
VARCHAR语句中定义的长度
SMALLINT2个字节
INTEGER4个字节
SMALLFLOAT4个字节
FLOAT8个字节
SERIAL4个字节
DATE4个字节
DATETIME8个字节(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 [UNIQUE|DISTINCT] INDEX  →索引名
               └→唯一索引      ON  →表名
                                    (column1 [DESC],column2,..,columnn)
                                              └→降序索引
5.视图(View):
   ①.视图定义:视图是数据库上动态的窗口而不是静态的状况,并且是以数据库表的形式出现在数据库中,授权与增、删、改操作与基表的操作一致。
   ②.视图命名规则:
     ㈠.表名最多不超过18个字符,除此以外与数据库基表的命名规则雷同.
     ㈡.必须以字母打头,其余部分可以是字母,数字,下划线的任意组合.
     ㈢.在同一数据库中视图名应具有唯一性.
     ㈣.视图名不得是Informix的保留字.
     ㈤.视图中字段名不得超过18个字符,必须保证前8个字符的唯一性。
     ㈥.视图中字段名不得重复(不区分大小写),应具有唯一性。
③.视图任务:
     ㈠.在数据库上为不同的用户提供不同的数据窗口,一个单独的视图可以包含来自不同的表的字段(字段不得同名)。
     ㈡.限制某些敏感数据的存取,只允许用户查看聚合信息。
     ㈢.允许用户象修改、插入和删除数据库中如同在视图中出现那样被组织起来的数据
④.视图与基表的区别:
     ㈠.不能利用视图取代格式说明文件中的表。
     ㈡.不能在视图上建立索引。
     ㈢.某些条件下不能通过视图更新或删除看到的数据。
     ㈣.不能通过ROWID存取表。
   ⑤.创建与删除视图:
      CREATE VIEW [(字段1,...,字段n)]
                      └→视图名称
        AS SELECT <标准Select 语句> →不得使用UNION操作符
          [WITH CHECK OPTION] →输入与修改是否满足SELECT语句条件 

6.删除数据库、表、索引、视图:
①.删除数据库:drop       
②.删除表    :drop table 
③.删除索引  :drop index 
④.删除视图  :drop view  
     删除数据库前必须关闭此数据库,删除数据库同时也删除了该数据库的所有表、索引、视图。 

二.SQL实际应用:
1.INSERT 语句:(向数据库的表中插入一条行记录)
INSERT INTO (column1,comumn2,...,comumnn) 
              └→表名        └→字段名表 →缺省为所有字段
    valueS (value_list)→值列表
2.DELETE 语句:(从数据库的表中删除若干条满足条件的行记录)
DELETE FROM    (WHERE 条件列表) →缺省为所有行记录
               └→表名 

 3.UPDATE 语句:(修改数据库表中满足条件的若干条行记录)
   UPDATE STATISTICS (TB name)→为指定数据库表更统计(缺省为所有)
                      └→表名
UPDATE        SET  <字段1= 值1,字段n= 值n>
                └→表名 
                       (WHERE 条件列表)  →缺省为所有行记录 

UPDATE        SET  <字段列表> = <值列表>
                └→表名 
                       (WHERE 条件列表)  →缺省为所有行记录 

UPDATE        SET  <字段.*>   = <记录.*>
                └→表名 
                       (WHERE 条件列表)  →缺省为所有行记录 

 4.SELECT 语句:(从一数据库表中选择满足条件的行记录)
SELECT     →*表示所有字段
(INTO <程序变量列表>)或(INTO TEMP <临时表>)
 FROM [表别名]               →数据库表名
(WHERE <条件列表>)                      →缺省为所有行记录
ORDER BY [column1,column2,...,column8][DESC]→排序(可选)可用1-8代替字段
GROUP BY [column1,column2,...,columnn]      →分组(可选)可用1-8代替字段
[HAVING <条件>]                             →为组提供一个或多个限制条件
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,2,3,4,5,6,7,8][DESC]→排序,1-8表示字段在SELECT中出现的顺序。
 GROUP BY [column1,column2,...,columnn]  →分组(可选)
  [HAVING <条件>]                        →为组提供一个或多个限制条件
  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(与、或) 

③.[NOT] BETWEEN ...AND...([不]在...与...之间)
④.[NOT] IN (值1,值2,值3,。。。,值n) 所期望的值
⑤.[NOT] MATCHES 模式匹配:
MATCHES “字符值”
 *   表示零个或多个字符
 ?   表示单个字符
[...] 表示方括号中的任意字符
[^..] 表示除此之外的任意字符
[A-Z] 表示从A到Z的任意字符
 \   转换下一个字符的特殊含义
⑥.[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个或多个值,至少一个返回值比较为真时则条件为真
       SOME  ANY的别名
         IN 检查表达式是否在由下面的SELECT语句返回的结果中
     EXISTS检查其后的SELECT语句是否返回了任何一个记录,返回记录则条件为真
        NOT 对查找条件的真值取非 

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


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

一.关系数据库程序设计的关键和方法:
 1.成功设计一个关系数据库的关键因素:
   ①.深入广泛、了解企业内部组织机构及需求;
   ②.始终保持与最终用户交互、联系;
   ③.设计过程中要采用结构化的开发方法,便于维护;
   ④.要用ER图表示数据结构模型。
 2.结构化的开放方法交整个应用的开发周期划分成阶段:
   ①.系统开发的可行性报告;
   ②.程序的功能需求;
   ③.技术设计(系统规格说明书);
④.编程及测试(源程序代码清单);
   ⑤.用户培训、实现(用户手册)。
   ⑥.程序的维护与升级。
 3.数据库设计的方法与步骤:
   ①.获得对企业的了解(需求分析);
   ②.标识主要的数据对象(实体、属性、联系);
   ③.用ER图画出数据对象(初步ER图);
④.求解逻辑数据类型(处理联系、去掉冗余);
   ⑤.确定属性的细则(数据类型);
   ⑥.通过规范化来修正逻辑模型;
⑦.用SQL的DDL将逻辑模型转换成物理的DB模式。 

二.Informix-4gl的语法规则:
1.程序体结构:
DATABASE 
GLOBALS  ###定义全局变量
DEFINE  变量名1  变量类型,
       变量名n  变量类型
END GLOBALS或GLOBALS “glob.4gl”
MAIN
       DEFINE  变量名1  变量类型,
       变量名n  变量类型
   OPTIONS  PROMPT  LINE  1,
            ERROR   LINE 24,
            MESSAGE LINE 24,
            COMMENT LINE 24,
            form    LINE  4,
            MENU    LINE  4,
            next     key control-n,
            previous key control-p,
            delete   key control-o,
            insert   key control-i,   
            ACCEPT KEY INTERRUPT,### 使用ESC键无效
            INPUT WRAP           ### 按接受键后存入
   DEFER    INTERRUPT            ### 防止非法中断
   set  isolation to dirty read
   set  lock mode to wait 5
   whenever error continue       ### 遇到错误继续执行
   call startlog(“slif_err.log”)
   ....(其它程序语句)
   ....(用户函数)
END MAIN
 2.程序的具体语法:
  ①.命令行参数:
     arg_val[0]:表示命令本身
     arg_val[1]:表示命令行参数1
     arg_val[n]:表示命令行参数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 [OWNER.]PROCEDURE_NAME (参数1  参数类型=[DEFAULT], 参数2  参数类型=[DEFAULT],参数n  参数类型=[DEFAULT])
                   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_amt  decimal(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 游标名 [WITH HOLD] 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_E  INT;
   DEFINE V_B  INT;
   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;
 
阅读(769) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~