【发布时间】: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