问题描述
我需要更新我正在按顺序读取的索引记录的主键我知道我不能使用重写来做到这一点,任何建议
前 5 个 move 语句是主键。
move perdt1-pno to perat-pno
move zeros to perat-bno
move space to perat-eng-type
move space to perat-shift-code
move zeros to perat-area
start perat-file key > perat-key
invalid key
set end-of-infile to true
not invalid key
read perat-file next ignore lock
at end
continue
end-read
display "meow"
perform
varying ws-sub from 1 by 1
until ws-sub > 10
or perat-pno not = perdt1-pno
if (perat-pno = perdt1-pno)
and (in-apc <> perat-bno)
display "meow2"
display perat-pno
move in-apc to perat1-bno
move in-perat-area
to perat1-area
move in-primary-skill
to perat1-eng-type
if in-primary-skill <> spaces
move "P" to perat-primary-skill
else
move "S" to perat-primary-skill
end-if
//i cant do rewrite here.
解决方法
如您所见,主索引没有 REWRITE
,因为一旦您更改 REWRITE
不会更改先前的读取记录,而是更改具有新主记录的记录 -如果存在。
这就是 ORGANIZATION INDEXED
的工作原理。
常做的事情:
-
READ
旧记录(可能是WITH LOCK
) - 如果您还没有:保存关键字段的旧值
- 将新值放在关键字段中,然后是
WRITE
,最好使用INVALID KEY
子句来捕捉这种情况 - 结果是以下之一:
-
INVALID KEY
条件(=重复):-您必须决定它是否应该是DELETED
(如果是,则再次重新读取旧记录,“更新”其关键字段并执行再次INSERT
,否则通过手动错误消息或让运行时系统处理重复键来中止) -
NOT INVALID KEY
条件 - 一切正常
-
- 将保存的(旧)值放在键字段中,然后是
DELETE
(否则文件中的记录将同时包含旧键值和新键值)
根据您环境中的规则,您可能需要使用新密钥 READ
,因此在 INVALID KEY
期间永远不要进入 WRITE
条件。