SEARCH ALL语句的语法格式同SEARCH语句比较类似。在SEARCH ALL语句中,仍然主要包含所要查找的索引表表名、判断条件、以及满足条件后的处理过程。SEARCH ALL语句只是在系统内部处理过程中与SEARCH语句不同。SEARCH ALL语句的基本格式如下。
SEARCH ALL indexed-table-entry
AT END
do something
WHEN condition
do something else
END-SEARCH.
与SEARCH语句类似,这里同样需要注意以下两点。
q 对于以do something表示的一组操作语句,通常该组语句内最多只有2~3条语句。
q 对于condition判断条件,必须包含以索引引用的具体数据项。并且该数据应该为判断表达式的第一个操作数。
此外,由于SEARCH ALL采用的是二分查找方式,因此相应的索引表中的数据必须有序。因此,能够使用SEARCH ALL语句的索引表,必须参照如下方式定义。
01 sample-indexed-table.
05 sample-entry-list OCCURS x1 TIMES
INDEXED BY sample-index.
ASCENDING KEY sample-num.
10 sample-num PIC 9(x2).
10 sample-data PIC X(x3).
以上定义的能使用SEARCH ALL语句的索引表,为表示数据的顺序,需要定义数据编号。该段代码定义的数据编号即为sample-num。同时,需要注意的是,这里通过ASCENDING KEY表明了该索引表中的数据为升序排列。
上面代码中定义的是数据按升序排列的索引表。同样可以定义数据按降序排列的索引表。定义方式如下。
01 sample-indexed-table.
05 sample-entry-list OCCURS x1 TIMES
INDEXED BY sample-index.
DESCENDING KEY sample-num.
10 sample-num PIC 9(x2).
10 sample-data PIC X(x3).
总之,SEARCH ALL语句只能用于查找数据排列有序的索引表。这是由SEARCH ALL语句的查找方式——二分查找法的算法特点所决定的。对于此类索引表的定义,通常可分两种情况讨论。
q 对于升序排列的数据,通过ASCENDING KEY加上数据编号指明。
q 对于降序排列的数据,通过DESCENDING KEY加上数据编号指明。
最后需要注意的一点是,SEARCH ALL语句中判断条件只能为一条。即在SEARCH ALL语句中,WHEN子句只能出现一条。因此,下面的这段代码是错误的。
SEARCH ALL indexed-table-entry
AT END
do something
WHEN sample-data (sample-index) = 1
perform statemen1
WHEN sample-data (sample-index) = 2
perform statemen2
WHEN sample-data (sample-index) = 3
perform statemen3 ←错误的代码,WHEN在SEARCH ALL语句中只能出现一条
END-SEARCH.