在cobol中工作的DB2 / Cursor程序

时间:2017-11-12 16:27:05

标签: sql db2 cursor cobol mainframe

我的要求是从db2表中删除包含重复电话号码的数据(无效电话号码,16个电话号码的硬编码)。应保留一个电话号码,这取决于序列号(最小值)。

考虑主表有以下数据:PHONE_TAB

Client_Id   Phone_num  Seq_num
 1234        45678       15   --- delete
 4444        55555       45
 1234        45678       10   ---should be retained 
 5555        22222       25
 1234        45678       20   ---  delete
 1234        45678       11   ---  delete

注意:在删除之前我还必须将要删除的行移到输出磁带文件中进行备份。

提出了以下逻辑, 声明光标:

EXEC SQL
  DECLARE CUR1 CURSOR WITH HOLD FOR
   SELECT * FROM PHONE_TAB WHERE PHONE_NUM = 45678
END-EXEC

FETCH-PARA

EXEC SQL
 FETCH CUR1 INTO :DCLGEN_CLIENT_ID
                :DCLGEN_PHONE_NUM
                :DCLGEN_SEQ_NUM
END-EXEC

VALIDATE-PARA

EXEC SQL
 SELECT MIN(SEQ_NUM) FROM PHONE_TAB
 WHERE CLIENT_ID = :DCLGEN_CLIENT_ID
       PHONE_NUM = :DCLGEN_PHONE_NUM GROUP BY CLIENT_ID AND PHONE_NUM
       INTO WS_MIN
END-EXEC

EVALUATE TRUE 
 WHEN SEQ_NUM > WS_MIN 
      PERFORM BACKUP-PARA
 WHEN OTHER
      PERFORM FETCH-PARA

最后,DELETE-PARA

EXEC SQL
  DELETE FROM PHONE_TAB WHERE CURRENT CURSOR
END-EXEC

有人能告诉我这个逻辑是否正确吗? 我怀疑的是,如果没有备份到磁带文件,是否会进行批量删除?

由于

1 个答案:

答案 0 :(得分:1)

您可以使用以下SQL

一次性删除它们
DELETE FROM PHONE_TAB A
 WHERE EXISTS (SELECT 1 FROM PHONE_TAB B
                WHERE A.PHONE_NUM = B.PHONE_NUM AND
                      A.SEQ_NUM > B.SEQ_NUM)

它的工作原理是删除存在另一行的所有行,这些行具有相同的电话号码和较低的序列号。

您可以通过首先使用select运行它来检查它是否删除了正确的行,例如

SELECT * FROM PHONE_TAB A
 WHERE EXISTS (SELECT 1 FROM PHONE_TAB B
                WHERE A.PHONE_NUM = B.PHONE_NUM AND
                      A.SEQ_NUM > B.SEQ_NUM)

如果需要备份行,可以运行select然后删除行。