2017-11-12 3 views
0

필자의 요구 사항은 중복 전화 번호 (잘못된 전화 번호, 하드 코드 된 16 개의 전화 번호 세트)가있는 db2 테이블에서 데이터를 삭제하는 것입니다. 그리고 하나의 전화 번호가 유지되어야합니다. 시퀀스 번호 (최소값).cobol에서 DB2/커서 프로그램 작동

는 기본 테이블 데이터를 다음했다 고려해 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 

마지막으로, 삭제-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) 

처럼 선택과 그것을 실행하여 올바른 행을 삭제하는 것을 확인할 수 있습니다, 당신은 선택을 실행 한 다음 행을 삭제할 수 있습니다.

관련 문제