The DELETE statement in COBOL is used to remove records from indexed and relative files, providing essential functionality for data maintenance and file management operations.
The DELETE statement removes the current record from an indexed or relative file that has been opened for I-O access.
12345678910DELETE file-name RECORD [INVALID KEY imperative-statement] [NOT INVALID KEY imperative-statement] [END-DELETE] *> Alternative syntax for relative files DELETE file-name [INVALID KEY imperative-statement] [NOT INVALID KEY imperative-statement] [END-DELETE]
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061ENVIRONMENT DIVISION. INPUT-OUTPUT SECTION. FILE-CONTROL. SELECT EMPLOYEE-FILE ASSIGN TO "EMPLOYEE.DAT" ORGANIZATION IS INDEXED ACCESS MODE IS DYNAMIC RECORD KEY IS EMP-ID FILE STATUS IS FILE-STATUS-EMP. DATA DIVISION. FILE SECTION. FD EMPLOYEE-FILE. 01 EMPLOYEE-RECORD. 05 EMP-ID PIC X(5). 05 EMP-NAME PIC X(25). 05 EMP-DEPT PIC X(3). 05 EMP-SALARY PIC 9(6)V99. WORKING-STORAGE SECTION. 01 FILE-STATUS-EMP PIC X(2). 01 WS-EMPLOYEE-ID PIC X(5). 01 WS-DELETE-FLAG PIC X(1) VALUE 'N'. PROCEDURE DIVISION. MAIN-PROCESSING. OPEN I-O EMPLOYEE-FILE DISPLAY "Enter Employee ID to delete: " ACCEPT WS-EMPLOYEE-ID PERFORM DELETE-EMPLOYEE CLOSE EMPLOYEE-FILE STOP RUN. DELETE-EMPLOYEE. *> First read the record to ensure it exists MOVE WS-EMPLOYEE-ID TO EMP-ID READ EMPLOYEE-FILE KEY IS EMP-ID INVALID KEY DISPLAY "Employee " WS-EMPLOYEE-ID " not found" MOVE 'N' TO WS-DELETE-FLAG NOT INVALID KEY DISPLAY "Found employee: " EMP-NAME DISPLAY "Department: " EMP-DEPT DISPLAY "Salary: " EMP-SALARY MOVE 'Y' TO WS-DELETE-FLAG END-READ *> Delete the record if it was found IF WS-DELETE-FLAG = 'Y' DELETE EMPLOYEE-FILE RECORD INVALID KEY DISPLAY "Error deleting employee " WS-EMPLOYEE-ID DISPLAY "File Status: " FILE-STATUS-EMP NOT INVALID KEY DISPLAY "Employee " WS-EMPLOYEE-ID " deleted successfully" END-DELETE END-IF.
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869DATA DIVISION. WORKING-STORAGE SECTION. 01 WS-ERROR-HANDLING. 05 WS-DELETE-COUNT PIC 9(4) VALUE 0. 05 WS-ERROR-COUNT PIC 9(3) VALUE 0. 05 WS-CONFIRMATION PIC X(1). 01 WS-FILE-STATUS-MESSAGES. 05 WS-STATUS-00 PIC X(30) VALUE "Operation successful". 05 WS-STATUS-23 PIC X(30) VALUE "Record not found". 05 WS-STATUS-24 PIC X(30) VALUE "Boundary violation". 05 WS-STATUS-48 PIC X(30) VALUE "File not open for I-O". PROCEDURE DIVISION. DELETE-WITH-CONFIRMATION. DISPLAY "Employee to delete:" DISPLAY "ID: " EMP-ID DISPLAY "Name: " EMP-NAME DISPLAY "Department: " EMP-DEPT DISPLAY "Salary: " EMP-SALARY DISPLAY " " DISPLAY "Are you sure you want to delete this record? (Y/N): " ACCEPT WS-CONFIRMATION IF WS-CONFIRMATION = 'Y' OR WS-CONFIRMATION = 'y' PERFORM EXECUTE-DELETE ELSE DISPLAY "Delete operation cancelled" END-IF. EXECUTE-DELETE. DELETE EMPLOYEE-FILE RECORD INVALID KEY PERFORM HANDLE-DELETE-ERROR NOT INVALID KEY PERFORM HANDLE-DELETE-SUCCESS END-DELETE. HANDLE-DELETE-SUCCESS. ADD 1 TO WS-DELETE-COUNT DISPLAY "Record deleted successfully" DISPLAY "Total records deleted: " WS-DELETE-COUNT *> Log the deletion for audit purposes PERFORM LOG-DELETE-OPERATION. HANDLE-DELETE-ERROR. ADD 1 TO WS-ERROR-COUNT DISPLAY "Delete operation failed" DISPLAY "File Status: " FILE-STATUS-EMP EVALUATE FILE-STATUS-EMP WHEN "23" DISPLAY "Error: " WS-STATUS-23 WHEN "24" DISPLAY "Error: " WS-STATUS-24 WHEN "48" DISPLAY "Error: " WS-STATUS-48 WHEN OTHER DISPLAY "Unexpected error occurred" END-EVALUATE DISPLAY "Total errors: " WS-ERROR-COUNT. LOG-DELETE-OPERATION. *> Write to audit log DISPLAY "AUDIT: Record " EMP-ID " deleted at " ACCEPT CURRENT-TIMESTAMP FROM DATE-TIME DISPLAY CURRENT-TIMESTAMP.
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293DATA DIVISION. WORKING-STORAGE SECTION. 01 WS-BATCH-CONTROLS. 05 WS-RECORDS-PROCESSED PIC 9(5) VALUE 0. 05 WS-RECORDS-DELETED PIC 9(5) VALUE 0. 05 WS-RECORDS-FAILED PIC 9(5) VALUE 0. 05 WS-EOF-FLAG PIC X(1) VALUE 'N'. 01 WS-DELETE-CRITERIA. 05 WS-DEPT-TO-DELETE PIC X(3). 05 WS-MIN-SALARY PIC 9(6)V99. 05 WS-MAX-SALARY PIC 9(6)V99. 01 WS-CURRENT-TIMESTAMP PIC X(20). PROCEDURE DIVISION. BATCH-DELETE-PROCESSING. DISPLAY "=== Batch Delete Operation ===" *> Get deletion criteria DISPLAY "Enter department to delete (or SPACES for all): " ACCEPT WS-DEPT-TO-DELETE DISPLAY "Enter minimum salary (0 for no minimum): " ACCEPT WS-MIN-SALARY DISPLAY "Enter maximum salary (999999.99 for no maximum): " ACCEPT WS-MAX-SALARY PERFORM DELETE-MATCHING-RECORDS PERFORM DISPLAY-BATCH-SUMMARY. DELETE-MATCHING-RECORDS. MOVE 'N' TO WS-EOF-FLAG *> Start from beginning of file START EMPLOYEE-FILE KEY IS GREATER THAN OR EQUAL TO EMP-ID INVALID KEY DISPLAY "Error positioning file" MOVE 'Y' TO WS-EOF-FLAG END-START PERFORM UNTIL WS-EOF-FLAG = 'Y' READ EMPLOYEE-FILE NEXT RECORD AT END MOVE 'Y' TO WS-EOF-FLAG NOT AT END ADD 1 TO WS-RECORDS-PROCESSED PERFORM CHECK-DELETE-CRITERIA END-READ END-PERFORM. CHECK-DELETE-CRITERIA. *> Check if record meets deletion criteria IF (WS-DEPT-TO-DELETE = SPACES OR WS-DEPT-TO-DELETE = EMP-DEPT) AND (EMP-SALARY >= WS-MIN-SALARY AND EMP-SALARY <= WS-MAX-SALARY) DISPLAY "Deleting: " EMP-ID " " EMP-NAME " " EMP-DEPT PERFORM DELETE-CURRENT-RECORD END-IF. DELETE-CURRENT-RECORD. DELETE EMPLOYEE-FILE RECORD INVALID KEY ADD 1 TO WS-RECORDS-FAILED DISPLAY "Failed to delete " EMP-ID ": " FILE-STATUS-EMP NOT INVALID KEY ADD 1 TO WS-RECORDS-DELETED PERFORM LOG-BATCH-DELETE END-DELETE. LOG-BATCH-DELETE. ACCEPT WS-CURRENT-TIMESTAMP FROM DATE-TIME DISPLAY "DELETED: " EMP-ID " " EMP-NAME " at " WS-CURRENT-TIMESTAMP. DISPLAY-BATCH-SUMMARY. DISPLAY " " DISPLAY "=== Batch Delete Summary ===" DISPLAY "Records processed: " WS-RECORDS-PROCESSED DISPLAY "Records deleted: " WS-RECORDS-DELETED DISPLAY "Delete failures: " WS-RECORDS-FAILED IF WS-RECORDS-DELETED > 0 DISPLAY "Deletion criteria applied:" IF WS-DEPT-TO-DELETE NOT = SPACES DISPLAY " Department: " WS-DEPT-TO-DELETE END-IF DISPLAY " Salary range: " WS-MIN-SALARY " to " WS-MAX-SALARY END-IF.
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091ENVIRONMENT DIVISION. INPUT-OUTPUT SECTION. FILE-CONTROL. SELECT EMPLOYEE-FILE ASSIGN TO "EMPLOYEE.DAT" ORGANIZATION IS INDEXED ACCESS MODE IS DYNAMIC RECORD KEY IS EMP-ID FILE STATUS IS FILE-STATUS-EMP. SELECT BACKUP-FILE ASSIGN TO "EMPBACK.DAT" ORGANIZATION IS SEQUENTIAL FILE STATUS IS FILE-STATUS-BACKUP. DATA DIVISION. FILE SECTION. FD BACKUP-FILE. 01 BACKUP-RECORD. 05 BACKUP-TIMESTAMP PIC X(20). 05 BACKUP-OPERATION PIC X(10). 05 BACKUP-EMP-DATA PIC X(50). WORKING-STORAGE SECTION. 01 WS-BACKUP-CONTROLS. 05 WS-BACKUP-ENABLED PIC X(1) VALUE 'Y'. 05 WS-BACKUP-COUNT PIC 9(4) VALUE 0. PROCEDURE DIVISION. DELETE-WITH-BACKUP. OPEN I-O EMPLOYEE-FILE IF WS-BACKUP-ENABLED = 'Y' OPEN OUTPUT BACKUP-FILE END-IF PERFORM DELETE-SELECTED-RECORDS CLOSE EMPLOYEE-FILE IF WS-BACKUP-ENABLED = 'Y' CLOSE BACKUP-FILE DISPLAY "Backup file created with " WS-BACKUP-COUNT " entries" END-IF. DELETE-SELECTED-RECORDS. *> Example: Delete all employees with salary > 100000 MOVE 'N' TO WS-EOF-FLAG START EMPLOYEE-FILE KEY IS GREATER THAN OR EQUAL TO EMP-ID END-START PERFORM UNTIL WS-EOF-FLAG = 'Y' READ EMPLOYEE-FILE NEXT RECORD AT END MOVE 'Y' TO WS-EOF-FLAG NOT AT END IF EMP-SALARY > 100000 PERFORM BACKUP-AND-DELETE END-IF END-READ END-PERFORM. BACKUP-AND-DELETE. *> Create backup entry before deletion IF WS-BACKUP-ENABLED = 'Y' PERFORM CREATE-BACKUP-ENTRY END-IF *> Perform the deletion DELETE EMPLOYEE-FILE RECORD INVALID KEY DISPLAY "Failed to delete " EMP-ID NOT INVALID KEY DISPLAY "Deleted high-salary employee: " EMP-ID " " EMP-NAME END-DELETE. CREATE-BACKUP-ENTRY. ACCEPT BACKUP-TIMESTAMP FROM DATE-TIME MOVE "DELETE" TO BACKUP-OPERATION STRING EMP-ID DELIMITED BY SIZE " " DELIMITED BY SIZE EMP-NAME DELIMITED BY SIZE " " DELIMITED BY SIZE EMP-DEPT DELIMITED BY SIZE " " DELIMITED BY SIZE EMP-SALARY DELIMITED BY SIZE INTO BACKUP-EMP-DATA END-STRING WRITE BACKUP-RECORD ADD 1 TO WS-BACKUP-COUNT.
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130DATA DIVISION. WORKING-STORAGE SECTION. 01 WS-TRANSACTION-CONTROL. 05 WS-TRANSACTION-ID PIC X(10). 05 WS-ROLLBACK-FLAG PIC X(1) VALUE 'N'. 05 WS-COMMIT-FLAG PIC X(1) VALUE 'N'. 05 WS-DELETE-LIST OCCURS 100 TIMES. 10 WS-DELETE-ID PIC X(5). 10 WS-DELETE-STATUS PIC X(1). 05 WS-DELETE-COUNT PIC 9(3) VALUE 0. 01 WS-TEMP-EMPLOYEE PIC X(50). PROCEDURE DIVISION. TRANSACTION-DELETE. PERFORM INITIALIZE-TRANSACTION PERFORM COLLECT-DELETE-CANDIDATES PERFORM EXECUTE-TRANSACTION-DELETE PERFORM FINALIZE-TRANSACTION. INITIALIZE-TRANSACTION. ACCEPT WS-TRANSACTION-ID FROM DATE-TIME MOVE 0 TO WS-DELETE-COUNT MOVE 'N' TO WS-ROLLBACK-FLAG MOVE 'N' TO WS-COMMIT-FLAG DISPLAY "Transaction " WS-TRANSACTION-ID " started". COLLECT-DELETE-CANDIDATES. *> Collect all records to be deleted before starting MOVE 'N' TO WS-EOF-FLAG START EMPLOYEE-FILE KEY IS GREATER THAN OR EQUAL TO EMP-ID END-START PERFORM UNTIL WS-EOF-FLAG = 'Y' OR WS-DELETE-COUNT >= 100 READ EMPLOYEE-FILE NEXT RECORD AT END MOVE 'Y' TO WS-EOF-FLAG NOT AT END *> Example criteria: delete inactive employees IF EMP-DEPT = "XXX" *> Inactive department code ADD 1 TO WS-DELETE-COUNT MOVE EMP-ID TO WS-DELETE-ID(WS-DELETE-COUNT) MOVE 'P' TO WS-DELETE-STATUS(WS-DELETE-COUNT) *> Pending END-IF END-READ END-PERFORM DISPLAY "Found " WS-DELETE-COUNT " records for deletion". EXECUTE-TRANSACTION-DELETE. PERFORM VARYING WS-INDEX FROM 1 BY 1 UNTIL WS-INDEX > WS-DELETE-COUNT OR WS-ROLLBACK-FLAG = 'Y' MOVE WS-DELETE-ID(WS-INDEX) TO EMP-ID READ EMPLOYEE-FILE KEY IS EMP-ID INVALID KEY DISPLAY "Record " EMP-ID " not found - skipping" MOVE 'S' TO WS-DELETE-STATUS(WS-INDEX) *> Skipped NOT INVALID KEY PERFORM EXECUTE-SINGLE-DELETE END-READ END-PERFORM *> Check if all deletes were successful PERFORM CHECK-TRANSACTION-STATUS. EXECUTE-SINGLE-DELETE. DELETE EMPLOYEE-FILE RECORD INVALID KEY DISPLAY "Delete failed for " EMP-ID ": " FILE-STATUS-EMP MOVE 'F' TO WS-DELETE-STATUS(WS-INDEX) *> Failed MOVE 'Y' TO WS-ROLLBACK-FLAG NOT INVALID KEY DISPLAY "Deleted " EMP-ID MOVE 'C' TO WS-DELETE-STATUS(WS-INDEX) *> Completed END-DELETE. CHECK-TRANSACTION-STATUS. IF WS-ROLLBACK-FLAG = 'Y' DISPLAY "Transaction failed - rollback required" PERFORM ROLLBACK-TRANSACTION ELSE DISPLAY "All deletes successful - committing transaction" MOVE 'Y' TO WS-COMMIT-FLAG PERFORM COMMIT-TRANSACTION END-IF. ROLLBACK-TRANSACTION. DISPLAY "Rolling back transaction " WS-TRANSACTION-ID *> In a real system, this would restore backed-up records DISPLAY "Note: Rollback functionality requires backup/restore mechanism". COMMIT-TRANSACTION. DISPLAY "Committing transaction " WS-TRANSACTION-ID DISPLAY "Successfully deleted " WS-DELETE-COUNT " records". FINALIZE-TRANSACTION. PERFORM DISPLAY-TRANSACTION-SUMMARY *> Clean up transaction data MOVE SPACES TO WS-TRANSACTION-ID MOVE 0 TO WS-DELETE-COUNT. DISPLAY-TRANSACTION-SUMMARY. DISPLAY " " DISPLAY "=== Transaction Summary ===" DISPLAY "Transaction ID: " WS-TRANSACTION-ID DISPLAY "Status: " IF WS-COMMIT-FLAG = 'Y' DISPLAY "COMMITTED" ELSE DISPLAY "ROLLED BACK" END-IF DISPLAY "Delete Operations:" PERFORM VARYING WS-INDEX FROM 1 BY 1 UNTIL WS-INDEX > WS-DELETE-COUNT DISPLAY " " WS-DELETE-ID(WS-INDEX) " - " EVALUATE WS-DELETE-STATUS(WS-INDEX) WHEN 'C' DISPLAY "Completed" WHEN 'F' DISPLAY "Failed" WHEN 'S' DISPLAY "Skipped" WHEN 'P' DISPLAY "Pending" END-EVALUATE END-PERFORM.
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117DATA DIVISION. WORKING-STORAGE SECTION. 01 WS-VALIDATION-CONTROLS. 05 WS-VALIDATE-BEFORE-DELETE PIC X(1) VALUE 'Y'. 05 WS-CHECK-REFERENCES PIC X(1) VALUE 'Y'. 05 WS-VALIDATION-ERRORS PIC 9(3) VALUE 0. 01 WS-BUSINESS-RULES. 05 WS-MIN-EMPLOYEES-DEPT PIC 9(3) VALUE 5. 05 WS-PROTECTED-DEPTS OCCURS 10 TIMES PIC X(3). 05 WS-PROTECTED-COUNT PIC 9(2) VALUE 0. PROCEDURE DIVISION. VALIDATED-DELETE. PERFORM SETUP-BUSINESS-RULES PERFORM DELETE-WITH-VALIDATION. SETUP-BUSINESS-RULES. *> Define departments that cannot be emptied MOVE 3 TO WS-PROTECTED-COUNT MOVE "ADM" TO WS-PROTECTED-DEPTS(1) MOVE "SEC" TO WS-PROTECTED-DEPTS(2) MOVE "FIN" TO WS-PROTECTED-DEPTS(3). DELETE-WITH-VALIDATION. *> Read the record to be deleted READ EMPLOYEE-FILE KEY IS EMP-ID INVALID KEY DISPLAY "Employee not found: " EMP-ID NOT INVALID KEY PERFORM VALIDATE-DELETE-OPERATION IF WS-VALIDATION-ERRORS = 0 PERFORM EXECUTE-VALIDATED-DELETE ELSE DISPLAY "Delete operation cancelled due to validation errors" END-IF END-READ. VALIDATE-DELETE-OPERATION. MOVE 0 TO WS-VALIDATION-ERRORS *> Check business rules PERFORM CHECK-DEPARTMENT-PROTECTION PERFORM CHECK-DEPARTMENT-MINIMUM PERFORM CHECK-EXTERNAL-REFERENCES IF WS-VALIDATION-ERRORS > 0 DISPLAY "Validation failed with " WS-VALIDATION-ERRORS " errors" ELSE DISPLAY "Validation passed - deletion allowed" END-IF. CHECK-DEPARTMENT-PROTECTION. PERFORM VARYING WS-INDEX FROM 1 BY 1 UNTIL WS-INDEX > WS-PROTECTED-COUNT IF EMP-DEPT = WS-PROTECTED-DEPTS(WS-INDEX) DISPLAY "Error: Cannot delete from protected department " EMP-DEPT ADD 1 TO WS-VALIDATION-ERRORS END-IF END-PERFORM. CHECK-DEPARTMENT-MINIMUM. *> Count remaining employees in department PERFORM COUNT-DEPARTMENT-EMPLOYEES IF WS-DEPT-COUNT <= WS-MIN-EMPLOYEES-DEPT DISPLAY "Error: Department " EMP-DEPT " would have too few employees" DISPLAY "Minimum required: " WS-MIN-EMPLOYEES-DEPT DISPLAY "Would remain: " WS-DEPT-COUNT - 1 ADD 1 TO WS-VALIDATION-ERRORS END-IF. CHECK-EXTERNAL-REFERENCES. *> Check if employee has active projects, etc. *> This would typically involve checking other files DISPLAY "Checking external references for " EMP-ID *> Simulate reference check IF EMP-ID = "EMP01" OR EMP-ID = "EMP02" DISPLAY "Error: Employee has active references - cannot delete" ADD 1 TO WS-VALIDATION-ERRORS END-IF. COUNT-DEPARTMENT-EMPLOYEES. *> Count employees in the same department MOVE 0 TO WS-DEPT-COUNT MOVE 'N' TO WS-EOF-FLAG START EMPLOYEE-FILE KEY IS GREATER THAN OR EQUAL TO EMP-ID END-START PERFORM UNTIL WS-EOF-FLAG = 'Y' READ EMPLOYEE-FILE NEXT RECORD AT END MOVE 'Y' TO WS-EOF-FLAG NOT AT END IF EMP-DEPT = WS-CURRENT-DEPT ADD 1 TO WS-DEPT-COUNT END-IF END-READ END-PERFORM. EXECUTE-VALIDATED-DELETE. DELETE EMPLOYEE-FILE RECORD INVALID KEY DISPLAY "Delete operation failed: " FILE-STATUS-EMP NOT INVALID KEY DISPLAY "Employee " EMP-ID " deleted successfully" PERFORM LOG-VALIDATED-DELETE END-DELETE. LOG-VALIDATED-DELETE. DISPLAY "AUDIT: Validated delete of " EMP-ID " from " EMP-DEPT ACCEPT CURRENT-TIMESTAMP FROM DATE-TIME DISPLAY "Timestamp: " CURRENT-TIMESTAMP.
123456789101112131415161718192021222324252627282930313233343536373839*> Standard DELETE pattern READ file-name KEY IS key-field INVALID KEY DISPLAY "Record not found" NOT INVALID KEY DELETE file-name RECORD INVALID KEY DISPLAY "Delete failed: " file-status NOT INVALID KEY DISPLAY "Record deleted successfully" END-DELETE END-READ *> Safe DELETE with confirmation DISPLAY "Delete record " key-field "? (Y/N): " ACCEPT confirmation-flag IF confirmation-flag = 'Y' PERFORM DELETE-RECORD ELSE DISPLAY "Delete cancelled" END-IF *> Batch DELETE with error recovery PERFORM UNTIL end-of-file READ file-name NEXT RECORD AT END SET end-of-file TO TRUE NOT AT END IF delete-criteria-met DELETE file-name RECORD INVALID KEY PERFORM LOG-DELETE-ERROR NOT INVALID KEY ADD 1 TO delete-count END-DELETE END-IF END-READ END-PERFORM