HPlogo KSAM/3000 Reference Manual: HP 3000 MPE/iX Computer Systems > Chapter 3 USING KSAM FILES IN COBOL PROGRAMS

CKDELETE

» 

Technical documentation

Complete book in PDF
» Feedback

 » Table of Contents

This procedure logically deletes a record from a KSAM file.

   CALL "CKDELETE" USING fileable, status

In order to logically delete records from a KSAM file, you can use the procedure CKDELETE. A logically deleted record is marked by a code of binary 1's in the first two characters of the record, but is not physically removed from the file. The deletion mark makes such a record inaccessible but does not physically reduce the size of the file. The utility program FCOPY (described in section II) can be used to compact a KSAM file by copying only active records, excluding deleted records, to a new KSAM file.

CKDELETE deletes the record at which the logical record pointer is currently positioned. Therefore, CKDELETE must be preceded by a call that positions the pointer (see Table 3-3 “Positioning the Logical Record Pointer”).

PARAMETERS

filetable

an 8-word record containing the number and name of the file, its input-output type, access mode, and a code indicating whether the previous operation was successful and if so what it was. (Refer to Filetable Parameter discussion earlier in this section.)

status

one word (two 8-bit characters) set to a pair of values upon completion of the call to CKDELETE indicating whether the call was successful and if not, why not. (Refer to Status Parameter discussion earlier in this section.)

USING CKDELETE

In order to delete a record, you should first read the record into the working storage section of your program with a call to CKREAD if in sequential mode, a call to CKREADBYKEY if in random mode, or a call to either if in dynamic mode. CKDELETE can be called only if the file is currently open for both input and output (input-output type =2). This allows the record to be read into your program's data area and then written back to the file with the delete mark. Following execution of CKDELETE, the deleted record can no longer be accessed.

SHARED ACCESS. If the file was opened for shared access with CKOPENSHR, you must lock the file with CKLOCK before you can delete any records with CKDELETE. Because CKDELETE depends on the logical record pointer, the call to CKLOCK should precede the call that positions the pointer. The call to CKUNLOCK is then called after the call to CKDELETE. To illustrate, the sequence of calls in shared access should be:

   CKLOCK <----- to lock file

   CKSTART or CKREADBYKEY <-------------- to position pointer

   . 

   . 

   . 

   CKDELETE<----- to delete record at which pointer is positioned

   CKUNLOCK<----- to unlock file

Following the call to CKDELETE, the pointer is positioned to the next key following the key in the deleted record.

EXAMPLES

The following examples show the use of CKDELETE for sequential access using CKREAD and for random access using CKREADBYKEY. The WORKING-STORAGE SECTION from Figure 3-2 Representation of KSAMFILE Used in COBOL Examples and the FINISH procedure from the CKCLOSE example are assumed for these examples.

  1. Sequential Delete.

    In order to delete all records whose primary key begins with "P", first position the file to the start of these records with CKSTART and then read each record with CKREAD and delete it with CKDELETE.

    WORKING-STORAGE SECTION. 
    77 RELOP PIC S9(4) COMP. 
    77 KEYVAL PIC X(20). 
    77 KEYLOC PIC S9(4) COMP. 
    77 KEYLENGTH PIC S9(4) COMP. 
    . 
    . 
    . 
    PROCEDURE DIVISION. 
    START. 
       MOVE 2 TO I-O-TYPE. 
       MOVE 0 TO A-MODE. 
       CALL "CKOPEN" USING FILETABLE, STAT. 
       . 
       . <---------- check status
       . 
       FIND-REC. 
          MOVE 0 TO RELOP.<------ test for equality between primary key and KEY
          MOVE "P" TO KEYVAL. 
          MOVE 3 TO KEYLOC. 
          MOVE 1 TO KEYLENGTH.<----- check first character only
          CALL "CKSTART" USING FILETABLE, STAT, RELOP, KEYVAL, KEYLOC, 
           KEYLENGTH. 
          IF STATUS-KEY-1 = "0" THEN 
               GO TO READ-REC. 
          IF STAT = "23" THEN 
               DISPLAY "NO RECORD FOUND" 
               GO TO FINISH. 
          IF STATUS-KEY-1 = "9" THEN 
               CALL "CKERROR" USING STAT, RESULT 
               DISPLAY "CKERROR NO.=", RESULT 
               GO TO FINISH. 
          READ-REC. 
              CALL "CKREAD" USING FILETABLE, STAT, REC, RECSIZE. 
              IF STATUS-KEY-1 = "1" THEN 
                  DISPLAY "END OF FILE REACHED" 
                  GO TO FINISH. 
              IF STATUS-KEY-1 = "0" THEN 
                  IF NAME OF REC NOT LESS THAN "Q "THEN 
                      DISPLAY "DELETIONS COMPLETED" 
                      GO TO FINISH; 
                  ELSE GO TO DELETE-REC; 
              ELSE 
                  DISPLAY "CKREAD ERROR, STATUS =", STAT 
                  IF STATUS-KEY-1 = "9" THEN 
                      CALL "CKERROR" USING STAT, RESULT 
                      DISPLAY "CKERROR NO.", RESULT. 
              GO TO READ-REC. 
    
          DELETE-REC. 
              CALL "CKDELETE" USING FILETABLE, STAT. 
              IF STATUS-KEY-1 = "0" THEN 
                   DISPLAY "DELETED" 
                   GO TO READ-REC; 
               ELSE 
                   DISPLAY "CKDELETE ERROR, STATUS = ", STAT 
                   IF STATUS-KEY-1 = "9" THEN 
                       CALL "CKERROR" USING STAT, RESULT 
                       DISPLAY"CKERROR NO.=", RESULT 
               GO TO READ-REC. 
    
    NOTE: If access is shared, the file must be opened with a call to CKOPENSHR and then locked before the call to CKSTART that initially sets the pointer. The file should remain locked while the records to be deleted are read and then marked for deletion. If the file is not locked before CKSTART is called, other users can change the file so that the record pointer points to the wrong record.
  2. Random Delete.

    A file containing the primary keys of those records to be deleted from a KSAM file is read into the working storage area DAT. These key values are used by CKREADBYKEY to locate and read the items to be deleted by CKDELETE.

    PROCEDURE DIVISION. 
    START. 
       MOVE 2 TO I-O-TYPE, A-MODE. 
       CALL "CKOPEN" USING FILETABLE, STAT. 
       . 
       . check status
       . 
    READ-KEY. 
       READ DATA-FILE INTO DAT; 
          AT END GO TO FINISH. 
       CALL "CKREADBYKEY" USING FILETABLE, STAT, REC, NAME OF DAT, KEYLOC, RECSIZE. 
       IF STATUS-KEY-1 = "0" THEN 
          GO TO DELETE-RECORD. 
       DISPLAY "CKREADBYKEY ERROR, STATUS = ",STAT. 
       IF STATUS-KEY-1 = "9" THEN 
          CALL "CKERROR" USING STAT, RESULT 
          DISPLAY "CKERROR ", RESULT 
          GO TO READ-KEY. 
       DELETE-RECORD. 
          CALL "CKDELETE" USING FILETABLE, STAT. 
          IF STATUS-KEY-1 = "0" THEN 
              DISPLAY REC, " DELETED" 
              GO TO READ-KEY. 
          DISPLAY "CKDELETE ERROR, STATUS =",STAT. 
          IF STATUS-KEY-1 = "9" THEN 
              CALL "CKERROR" USING STAT, RESULT 
              DISPLAY "CKERROR NO. =", RESULT. 
          GO TO READ-KEY. 
    
NOTE: Note: If access is shared, the file must be opened with a call to CKOPENSHR; a call to CKLOCK must precede the call to CKREADBYKEY and a call to CKUNLOCK must follow the CKDELETE error tests and should precede the return to READ-KEY.