Icon View Incident Report

Serious Serious
Reported By: Alec Mironov
Reported On: 11/22/2007
For: Version 1.06 Build 1
# 2486 Attempting a DELETE Operation On a Cursor Without an Initial FETCH Causes Nothing to Get Deleted

I have created simple database for testing. There are two tables MasterTable and DetailTable. DetailTable has ParentID field which point to the ID field of MasterTable (just standard relations). MasterTable has a trigger "AfterDeleteMaster" which does deletion of DetailTable records. When I delete Master record nothing happens with the DetailTable.

BEGIN
  DECLARE FCursor SENSITIVE CURSOR FOR FStatement;
  DECLARE TEMPGUID VARCHAR(40) DEFAULT OLDROW.ID;

  PREPARE FStatement FROM 'SELECT * FROM DetailTable WHERE ParentID = ?';
  OPEN FCursor USING TEMPGUID;

  START TRANSACTION ON TABLES DetailTable;
  BEGIN
    WHILE NOT EOF(FCursor) DO
      DELETE FROM FCursor;
    END WHILE;
  
    COMMIT;
  
    EXCEPTION
      ROLLBACK;
  END;
END

Workaround:

BEGIN
 DECLARE FCursor SENSITIVE CURSOR FOR FStatement;
 DECLARE TEMPGUID VARCHAR(40) DEFAULT OLDROW.ID;

 PREPARE FStatement FROM 'SELECT * FROM DetailTable WHERE ParentID = ?';
 OPEN FCursor USING TEMPGUID;
 FETCH FIRST FROM FCursor;

 START TRANSACTION ON TABLES DetailTable;
 BEGIN
   WHILE NOT EOF(FCursor) DO
     DELETE FROM FCursor;
     FETCH FIRST FROM FCursor;
   END WHILE;

   COMMIT;

   EXCEPTION
     ROLLBACK;
 END;
END



Comments Comments and Workarounds
The workaround is to issue a FETCH before and after each delete.


Resolution Resolution
Fixed Problem on 11/28/2007 in version 1.07 build 1


Products Affected Products Affected
ElevateDB Additional Software and Utilities
ElevateDB DAC Client-Server
ElevateDB DAC Client-Server with Source
ElevateDB DAC Standard
ElevateDB DAC Standard with Source
ElevateDB DAC Trial
ElevateDB VCL Client-Server
ElevateDB VCL Client-Server with Source
ElevateDB VCL Standard
ElevateDB VCL Standard with Source
ElevateDB VCL Trial

Image