SEARCH语句的功能实际上是实现对索引表中数据的顺序查找。SEARCH语句实现的功能步骤如下。
q SEARCH语句从指定的索引处开始查找。若WHEN子句后的条件没有得到满足,则将索引变量相应增加一个数据单位。查找索引表中的下一条数据。同时继续判断WHEN子句后所列条件。
q 若WHEN子句后所列条件一旦满足,则停止查找。索引变量为当前满足条件的关键数据项所对应的索引值。
q 若直到该索引表中的最后一条数据仍然没有满足WHEN子句后所列条件的,将停止查找。同时,AT END子句下面的语句将被执行。若没有写AT END子句,则直接执行SEARCH语句后面的下一条语句。
以下结合一个具体实例进行讲解。
首先,建立一张索引表,其中包含一组记录有相关人员姓名的数据。这里由于只有一种数据类型,因此人员姓名数据即为该表的关键数据项。定义并初始化该索引表的代码如下。
01 MEMBER-DATA.
05 FILLER PIC X(10) VALUE ‘ZHANG SAN’.
05 PIC X(10) VALUE ‘LI SI’.
05 PIC X(10) VALUE ‘WANG WU’.
05 PIC X(10) VALUE ‘LIU DA’.
05 PIC X(10) VALUE ‘XU CHAO’.
01 MEMBER-TABLE REDEFINES MEMBER-DATA.
05 MEMBERS PIC X(10)
OCCURS 5 TIMES
INDEXED BY MEMBER-NDX.
这里不妨假设需要查找姓名为“WANG WU”的人员。若找到,则将变量FOUND-FLAG置为“Y”,否则将其置为“N”。
这里可以通过前面讲过的PERFORM VARYING语句实现该功能。使用PERFORM VARYING语句的代码如下。
MOVE ‘N’ TO FOUND-FLAG.
PERFORM 100-FOUND-PROCESS
VARYING MEMBER-NDX FROM 1 BY 1
UNTIL MEMBER-NDX > 5 OR FOUND-FLAG = ‘Y’.
……
100-FOUND-PROCESS.
IF MEMEBERS (MEMBER-NDX) = ‘WANG WU’
MOVE ‘Y’ TO FOUND-FLAG
END-IF.
由于该表为索引表,故这里还可以通过SEARCH语句进行查找,代码如下。
SET MEMBER-NDX TO 1.
SEARCH MEMBERS
AT END
MOVE ‘N’ TO FOUND-FLAG
WHEN MEMBERS (MEMBER-NDX) = ‘WANG WU’
MOVE ‘Y’ TO FOUND-FLAG
END-SEARCH.
以上两段代码执行后,FOUND-FLAG中的值都将为‘Y’。
由此可见,使用SEARCH语句和使用PERFORM VARYING语句进行查找的效果是等同的。因为二者都是基于顺序查找方式进行查找的。但是,对于索引表而言,通常使用的是SEARCH语句。因为SEARCH语句除可以进行顺序查找外,还有以下两点好处。
q 只用指定起始查找位置,并且可含有多条条件判断语句(WHEN语句)。因此,该语句在功能结构上较为清晰。
q 相对于PERFORM VARYING语句而言,SEARCH语句的查找是自动执行的。因此,在编码上更为简便。