【问题标题】:DB2/Cursor program working in cobol在 cobol 中工作的 DB2/Cursor 程序
【发布时间】:2017-11-12 16:27:05
【问题描述】:

我的要求是从包含重复电话号码的 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

验证参数

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

谁能告诉我这个逻辑是否正确? 我怀疑它是否会在不备份到磁带文件的情况下进行批量删除?

谢谢

【问题讨论】:

  • 请解释为什么这与stackoverflow.com/questions/47152124/…不同(可能会得到编辑的附加信息)
  • @SimonSobisch 首先我尝试编辑相同的问题,但无法清楚地完成!不同之处在于我在这里包含代码和游标的..
  • @SimonSobisch 为混淆道歉!因为我是新手,所以一开始就不知道如何发布代码和查询
  • 一个建议,仅在从表中删除行后写入备份数据集。您可以将客户端 ID、序列号保留在工作存储中,并仅在删除后写入这些详细信息。为什么?因为如果您在删除之前写入,那么您的删除可能会不成功,即使这样您也可能会告诉您已经删除了该记录。我也不确定您如何在删除查询中处理 sqlcode 0/100。如果您说 sqlcode 100 没问题,那么您可能不想在输出中写入该记录。
  • @user6542823 :在每个 SQL 查询语句之后都包含错误处理条件。例如,如果 0 执行 abc 段落,如果 100 执行 ABEND 段落。 .你能告诉我我的逻辑是否满足要求?比如 1 FETCH 语句会删除多少行?

标签: sql db2 cursor cobol mainframe


【解决方案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 然后删除行。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-04-08
    • 1970-01-01
    • 2012-05-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多