2017-11-12 18 views
0

私の要件は、重複した電話番号(無効な電話番号、ハードコードされた16の電話番号のセット)を含むdb2テーブルからデータを削除することです。シーケンス番号(最小値)。コボルのDB2/Cursorプログラム

は、メインテーブルには、データを以下のい考慮する: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 

注:また、私は、バックアップを取るために削除する前に、出力テープファイルに削除される行を移動する必要があります。

ロジック以下、 宣言カーソルが出ている:最後に、DELETE-PARA

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 

EXEC SQL 
    DELETE FROM PHONE_TAB WHERE CURRENT CURSOR 
END-EXEC 

この論理が正しいかどうか誰かに教えてもらえますか? テープファイルにバックアップせずに一括削除するかどうか疑問です。

おかげ

+0

なぜこれがhttps://stackoverflow.com/questions/47152124/mainframe-cobol-db2-delete-programと違うのか説明してください(追加情報の編集が必要な場合があります) –

+0

@SimonSobischまずは編集しようとしました同じ質問ですが、明らかにできませんでした!それは私がここにコードとカーソルの使用法を含んでいるところが違っている。 – user8898467

+0

@SimonSobischは混乱のためにお詫び!流れの上に積み重ねるために新しいものがあるから...最初にコードとクエリをポストするようには知らなかった – user8898467

答えて

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 * 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) 

のように、あなたが選択を実行し、行を削除することができ、それが最初の選択でそれを実行して、右の行を削除することを確認することができます。

関連する問題