Przykłady dla kursorów PLSQL - kursory jawne, niejawne i odsyłające
Kursor logicznie działa jako wskaźnik do zestawu wyników. Możesz przesuwać kursor w zestawie wyników, przetwarzając każdy wiersz, aż ustalisz, że jesteś na końcu zestawu wyników. Istnieją trzy typy składni związane z kursorami:tworzenie kursora, pobieranie za pomocą kursora i zamykanie kursora. Ponadto istnieje wiele atrybutów kursora, których możesz użyć w swoich logicznych porównaniach. Oto typy kursorów w Oracle:
Wyraźne kursory
Explicit Cursors to kursory, które deklarujesz i używasz.
Kursory niejawne
PL/SQL umożliwia uwzględnienie instrukcji SQL, w tym instrukcji SELECT, jako części kodu bez deklarowania kursora, zwanego niejawnym kursorem.
Kursory odnośników
Kursor odwołuje się do zestawu wyników. REF CURSOR umożliwia przekazywanie odniesienia kursora z jednej jednostki programu PL/SQL do drugiej. Innymi słowy, pozwala stworzyć zmienną, która otrzyma kursor i umożliwi dostęp do jego zbioru wyników, ale w tym blogu podam przykłady tylko dla kursorów jawnych i niejawnych, podam przykład dla kursorów Ref i Dynamiczny kursor na innym blogu .Przykład Explicit Cursor:DECLARE nemployeeid NUMBER; ddata_początkowa DATA; data data; sjobid VARCHAR2 (20); -- zadeklaruj kursor CURSOR curjob IS SELECT id_pracownika, data_początkowa, data_końcowa, id_pracy FROM hr.job_history;BEGIN OPEN curjob; LOOP FETCH curjob INTO nemployeeid, dstartdate, denddate, sjobid; WYJDŹ, KIEDY curjob% NOTFOUND; DBMS_OUTPUT.put_line( 'Pracownik ' || nemployeeid || 'miał pracę ' || sjobid || ' dla ' || (denddate - dstartdate) || ' dni.'); PĘTLA KOŃCOWA; CLOSE curjob;END;/Ten sam przykład jest podany poniżej dla jawnego kursora, ale z For Loop, kursory For Loop są bardziej inteligentne, ponieważ nie ma potrzeby deklarowania zmiennych do pobierania z nich wartości i nie ma potrzeby otwierania lub zamykania lub sprawdzania, czy wskaźnik znajduje się na końcu kursora. Oto przykład:DECLARE CURSOR curjob IS SELECT worker_id, start_date, end_date, job_id FROM hr.job_history;BEGIN FOR jh_rec IN curjob LOOP DBMS_OUTPUT.put_line( ''Pracownik ' || jh_rec.employee_id || | ' miał pracę ' .job_id || ' dla ' || ( jh_rec.end_date - jh_rec.start_date || ' dni.')); END LOOP;END;/Przykład niejawnego kursora:DECLARE nempno NUMBER; CURSOR curjob IS SELECT worker_id, start_date, end_date, job_id FROM hr.job_history;BEGIN -- poniżej zapytania sql znajduje się typ niejawnego kursora SELECT COUNT ( * ) INTO nempno FROM hr.job_history; DBMS_OUTPUT.put_line ( 'Istnieją ' || nempno || ' rekordy historii pracowników.'); FOR jh_rec IN curjob PĘTLA DBMS_OUTPUT.put_line( ''Pracownik ' || jh_rec.employee_id || ' miał pracę ' || jh_rec.job_id || ' dla ' || ( jh_rec.end_date - jh_rec.dni._data || )); KONIEC PĘTLI;KONIEC;/