602SQL-Úplná dokumentace Index  

Příkaz UPDATE CURRENT OF (SQL)

příkaz_UPDATE_CURRENT_OF ::= UPDATE [ tabulka ] SET přiřazení {, přiřazení }…  WHERE 
    CURRENT OF jméno_kurzoru;

Příkaz UPDATE CURRENT OF (neboli Positioned UPDATE) provede změny zadané přiřazeními na řádce, 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 jako celek i sloupce uvedené na levé straně všech přiřazení musí být editovatelné.

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