使用SEARCH ALL检索含PIC X(02)键的表时匹配失败求助
COBOL SEARCH ALL 匹配失败问题解决
问题根源
你的代码存在三个关键错误,导致明明存在的键却返回"NOT FOUND":
- 手动设置索引干扰二分查找:SEARCH ALL是基于二分查找的自动查找逻辑,手动执行
SET IND-TAB TO 1会破坏其内部索引的自动维护,直接导致查找流程异常。 - WHEN子句写法错误:SEARCH ALL的WHEN子句无需通过索引下标(
TAB-KEY (IND-TAB))访问键,这是普通SEARCH的用法,而非SEARCH ALL的正确写法。 - 比较变量不匹配:代码中使用的
VAL未定义,应该引用你声明的WS-VAL变量。
另外必须确认:表数据已严格按TAB-KEY升序排列,SEARCH ALL依赖有序的表结构,若数据无序,二分查找必然无法命中。
修正后的代码
原表声明(无需修改)
01 WS-VAL PIC X(02). 01 WS-TABLE. 03 WS-TABLE-LINE OCCURS 400 TIMES ASCENDING KEY IS TAB-KEY INDEXED BY IND-TAB. 05 TAB-KEY PIC X(02). 05 TAB-LIB PIC X(15).
修正后的SEARCH ALL逻辑
SEARCH ALL WS-TABLE-LINE AT END DISPLAY 'NOT FOUND' WHEN TAB-KEY = WS-VAL DISPLAY 'FOUND' // 找到后可通过IND-TAB获取匹配项的位置 DISPLAY '匹配表项索引:' IND-TAB END-SEARCH
额外检查项
- 填充
WS-TABLE时,必须保证所有TAB-KEY严格升序,COBOL不会自动为表排序,需在数据加载阶段确保顺序。 - 确认
WS-VAL与TAB-KEY的格式完全一致:字符类型比较是逐字节匹配的,若WS-VAL存在多余空格或非打印字符,会导致匹配失败。
内容的提问来源于stack exchange,提问作者Ahmed SEDDIK
相关产品推荐
相关产品推荐

