|
![]() | Příkaz FETCH | ![]() | Kurzory v SQL | Příkaz DELETE CURRENT OF | ![]() |
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
![]() | Příkaz FETCH | ![]() | Kurzory v SQL | Příkaz DELETE CURRENT OF | ![]() |