理解索引表,最重要是要理解索引的概念。下面结合一个使用索引表定义的银行账户信息,具体分析索引的特点。定义该索引表的代码如下。
01 BANK-ACCOUNT-TABLE.
05 ACCOUNT-DATA OCCURS 10 TIMES
INDEXED BY ACC-NDX.
10 ACCOUNT-NUM PIC 9(9).
10 ACCOUNT-NAME PIC X(10).
以上代码中,ACC-NDX即为该索引表的索引。对于ACC-NDX而言,主要有下面几个特点,或者说是需要注意的地方。
1.索引不用被直接定义
通过上面代码可以看到,被显示定义的只有两项数据,即ACCOUNT-NUM和ACCOUNT-NAME。其中ACCOUNT-NUM为银行账户的号码,作为表中的数据编号。ACCOUNT-NAME为该账户的姓名,是实际数据。
ACCOUNT-NUM被定义为一个含有9位数字的整型数据,定义代码如下。
10 ACCOUNT-NUM PIC 9(9).
ACCOUNT-NAME被定义为一个含有10个字符的字符型数据,定义代码如下。
10 ACCOUNT-NAME PIC X(10).
相比较而言,索引变量ACC-NDX则没有如上进行定义。ACC-NDX既不像ACCOUNT-NUM那样被定义为一整型数据;也不像ACCOUNT-NAME那样被定义为一字符型数据。
既然没有被定义,那么,ACC-NDX是否因此不占用内存空间呢?答案是否定的。实际上,ACC-NDX是直接由COBOL系统本身存储在某一内存单元上的。ACC-NDX是占用内存空间的,但作为程序员并不用理会它存储在何处。
2.不能对索引使用MOVE赋值操作
以上谈到,索引作为一个特殊的数据,是不用在数据部DATA DIVISION中进行定义的。同时,它的特殊之处还表现在不能对其使用MOVE语句。
对于本例中的索引变量ACC-NDX而言,下面的代码是错误的。
MOVE 5 TO ACC-NDX. ←错误的用法,索引不能用MOVE语句进行赋值操作
这段代码企图将整型数据赋值给索引 变量ACC-NDX。然而,ACC-NDX作为一个特殊的索引变量,是不允许对其使用MOVE语句进行赋值操作的。
同样,下面这段代码企图将一个变量中保存的数据赋值给ACC-NDX,也是错误的。原因仍然是不能对索引变量使用MOVE语句。代码如下。
MOVE TEST-DATA TO ACC-NDX. ←错误的用法,索引不能用MOVE语句进行赋值操作
下面这段代码企图将ACC-NDX中的数据赋值给另外一个变量,同样也是错误的。其代码如下。
MOVE ACC-NDX TO PL-DATA. ←错误的用法,索引不能用MOVE语句进行赋值操作
3.不能对索引使用算术运算符号语句
对索引变量ACC-NDX使用前面章节中讲到的算术运算也是不允许的。例如,下面几行代码都错误地对ACC-NDX进行了算术运算操作。
ADD 3 TO ACC-NDX.
SUBTRACT DATA-SUB FROM ACC-NDX.
MULTIPLY ACC-NDX BY 5 GIVING RESULT-DATA.
COMPUTER ACC-NDX = (2+3) * 5.
……
那么,如何对索引变量进行赋值操作或算术运算呢?这就需要使用到SET语句。关于SET语句,将在后面章节进行详细讲解。