Strona o szybkim czytaniu.
Aby modyfikować zawartość kursora (bieżący wiersz) podczas jego przetwarzania, można skorzystać z klauzuli CURRENT OF;
FOR zmienna_kursorowa IN nazwa_kursora LOOP
...
UPDATE tabela1
SET kol1 = v1
,kol2 = v2
WHERE CURRENT OF nazwa_kursora;
...
END LOOP;
W tym celu należy wcześniej podczas deklaracji kursora dołożyć po zapytaniu klauzule FOR UPDATE, która powoduje założenie blokady na wiersze objęte kursorem.
DECLARE
...
CURSOR nazwa_kursora IS
wyrażenie_select
FOR UPDATE;
BEGIN
Jeżeli kursor jest zadeklarowany jako FOR UPDATE, to wykonanie instrukcji COMMIT lub ROLLBACK podczas jego przetwarzanie powoduje uszkodzenie tego kursora.
Kursory, o których była mowa dotychczas, to tzw. kursory jawne, ponieważ jawnie je definiujemy. Oprócz tych jawnych kursorów mogą istnieć kursory niejawne powodowane wykonaniem się instrukcji UPDATE lub DELETE. Powodują one również chwilowe otwarcie kursora na czas wykonania się operacji. W ten sposób niejawnie otwarte kursory również posiadają swoje atrybuty. Możemy się do nich odwoływać tuż po wykonaniu się operacji UPDATE lub DELETE korzystając z wyrażenia:
SQL%atrybut
DECLARE
v_ile number;
BEGIN
UPDATE emp
SET sal = sal+1000
WHERE job = ‘MANAGER’;
v_ile := SQL%rowcount; -- ilość zmodyfikowanych wierszy
END;
Kursory dynamiczne pozwalają przetwarzać kursory oparte na dynamicznie definiowanych zapytaniach. Zapytanie, które będzie wybierać wiersze podczas otwarcia kursora nie musi być znane podczas implementowania kodu PL/SQL.
Aby korzystać z dynamicznych kursorów, należy najpierw zdefiniować odpowiedni typ referencyjny.
TYPE nazwa_typu IS REF CURSOR [RETURN typ_rekordowy];
Następnie zmienną tego typu.
zmienna_referencyjna nazwa_typu;
Również otwarcie kursora dynamicznego różni się od otwarcia kursora statycznego.
OPEN zmienna_referencyjna FOR
instrukcja_select | zmienna;
DECLARE
TYPE t_ref IS REF CURSOR;
v_cur t_ref;
v_sel varchar2(256);
v_kol1 number;
v_kol2 number;
BEGIN
SELECT ‘SELECT ’||kolumna1||’, ’||kolumna2||’ FROM ‘||tabela
INTO v_sel;
FROM zapytania;
OPEN v_cur FOR v_sel;
LOOP
FETCH v_cur INTO v_kol1, v_kol2;
EXIT WHEN v_cur%NOTFOUND;
...
END LOOP;
CLOSE v_cur;
END;