602SQL-Úplná dokumentace Index  

Příkaz DELETE CURRENT OF (SQL)

příkaz_DELETE_CURRENT_OF ::= DELETE [ FROM tabulka ] WHERE CURRENT OF jméno_kurzoru;

Příkaz DELETE CURRENT OF (neboli Positioned DELETE) zruší řádku, na níž je nastaven kurzor zadaný jménem_kurzoru. Jméno_kurzoru musí být buď deklarováno v deklaraci kurzoru nebo v příkazu FOR nebo musí označovat dotaz patřící do aplikace a uložený v databázi. Kurzor musí umožňovat rušení záznamů.

Je-li v příkazu uvedena tabulka, musí to být (jediná) tabulka zpřístupněná zadaným kurzorem.

Pokud zadaný kurzor není otevřen), nastane chybový sqlstate 34000 (SQ_INVALID_CURSOR_NAME), pokud není nastaven na některý řádek (např. je před prvním nebo za posledním řádkem), nastane chybový sqlstate 24000 (SQ_INVALID_CURSOR_STATE). Je-li příkaz proveden v transakci READ ONLY, nastane chybový sqlstate 25006 (SQ_TRANS_STATE_RDONLY).


Příklad použití:

Změňte cenu u položek ceníku takto: položky ceníku začínající na X snižte o 10%, začínající na A zvyšte o 100%, ostatní smažte. Je to obdoba příkladu použitého pro demonstraci příkazu FOR:

PROCEDURE ZmenaCeniku();
BEGIN 
  DECLARE err_notfound BIT DEFAULT FALSE;
  DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' 
    BEGIN SET err_notfound=TRUE; END;
  DECLARE curcen SENSITIVE CURSOR FOR 
    SELECT cislo_pol, cena
    FROM Cenik
  FOR UPDATE; 
  DECLARE Polozka CHAR(20); 
  DECLARE Cena NUMERIC(14,2); 
  OPEN curcen; 
  LabelLoop: LOOP 
     FETCH NEXT FROM curcen INTO Polozka, Cena; 
     IF err_notfound IS TRUE THEN LEAVE LabelLoop; END IF; 
     IF SUBSTRING(Polozka FROM 1 FOR 1) = 'X' THEN 
       UPDATE SET Cena = Cena*0.9 WHERE CURRENT OF curcen;
     ELSEIF SUBSTRING(Polozka FROM 1 FOR 1) = 'A' THEN 
       UPDATE SET Cena = Cena*2 WHERE CURRENT OF curcen;
     ELSE
       DELETE WHERE CURRENT OF curcen;
     END IF; 
  END LOOP LabelLoop; 
  CLOSE curcen; 
END;

Viz