Oracle Kursor PL/SQL: niejawny, jawny, pętla For z przykładem
Co to jest KURSOR w PL/SQL?
Kursor jest wskaźnikiem do tego obszaru kontekstu. Oracle tworzy obszar kontekstowy do przetwarzania instrukcji SQL, który zawiera wszystkie informacje na temat instrukcji.
PL/SQL pozwala programiście kontrolować obszar kontekstu za pomocą kursora. Kursor przechowuje wiersze zwrócone przez instrukcję SQL. Zbiór wierszy, który przechowuje kursor, nazywany jest zbiorem aktywnym. Kursorom tym można również nadać nazwy, aby można było je odwoływać z innego miejsca w kodzie.
Kursor jest dwojakiego rodzaju.
- Niejawny kursor
- Jawny kursor
Niejawny kursor
Za każdym razem, gdy w bazie danych występują jakiekolwiek operacje DML, tworzony jest niejawny kursor, który zawiera wiersze, których dotyczy ta konkretna operacja. Kursory te nie mogą być nazwane, a zatem nie mogą być kontrolowane ani odwoływane z innego miejsca kodu. Możemy odwoływać się tylko do najnowszego kursora poprzez atrybuty kursora.
Jawny kursor
Programiści mogą tworzyć nazwane obszary kontekstowe, aby wykonywać operacje DML i mieć nad nimi większą kontrolę. Jawny kursor powinien być zdefiniowany w sekcji deklaracji Blok PL/SQLi jest tworzony dla instrukcji „SELECT”, która ma zostać użyta w kodzie.
Poniżej znajdują się kroki związane z pracą z jawnymi kursorami.
- Deklarowanie kursora Deklarowanie kursora oznacza po prostu utworzenie jednego nazwanego obszaru kontekstu dla instrukcji „SELECT”, która jest zdefiniowana w części deklaracyjnej. Nazwa tego obszaru kontekstowego jest taka sama jak nazwa kursora.
- Kursor otwierającyOtwarcie kursora wyświetli polecenie PL / SQL aby przydzielić pamięć dla tego kursora. Spowoduje to, że kursor będzie gotowy do pobrania rekordów.
- Pobieranie danych z kursoraW tym procesie wykonywana jest instrukcja „SELECT”, a pobrane wiersze są przechowywane w przydzielonej pamięci. Nazywa się je teraz zestawami aktywnymi. Pobieranie danych za pomocą kursora jest działaniem na poziomie rekordu, co oznacza, że możemy uzyskać dostęp do danych w sposób rekord po rekordzie. Każda instrukcja fetch pobierze jeden aktywny zestaw i przechowuje informacje o tym konkretnym rekordzie. Ta instrukcja jest taka sama jak instrukcja „SELECT”, która pobiera rekord i przypisuje do zmiennej w klauzuli „INTO”, ale nie generuje żadnych wyjątków.
- Zamykanie kursoraPo pobraniu wszystkich rekordów musimy zamknąć kursor, aby zwolnić pamięć przydzieloną do tego obszaru kontekstu.
Składnia
DECLARE CURSOR <cursor_name> IS <SELECT statement^> <cursor_variable declaration> BEGIN OPEN <cursor_name>; FETCH <cursor_name> INTO <cursor_variable>; . . CLOSE <cursor_name>; END;
- W powyższej składni część deklaracyjna zawiera deklarację kursora oraz zmienną kursora, w której zostaną przypisane pobrane dane.
- Kursor jest tworzony dla instrukcji „SELECT” podanej w deklaracji kursora.
- W części wykonawczej zadeklarowany kursor jest otwierany, pobierany i zamykany.
Atrybuty kursora
Zarówno niejawny kursor, jak i jawny kursor mają pewne atrybuty, do których można uzyskać dostęp. Atrybuty te dostarczają więcej informacji o operacjach kursora. Poniżej znajdują się różne atrybuty kursora i ich zastosowanie.
Atrybut kursora | Opis |
---|---|
%UZNANY | Zwraca wynik logiczny „TRUE”, jeśli ostatnia operacja pobierania zakończyła się pomyślnym pobraniem rekordu; w przeciwnym razie zwróci wartość FALSE. |
%NIE ZNALEZIONO | Działa to w odwrotny sposób do %FOUND i zwróci „TRUE”, jeśli ostatnia operacja pobierania nie mogła pobrać żadnego rekordu. |
%JEST OTWARTE | Zwraca wynik logiczny „TRUE”, jeśli dany kursor jest już otwarty, w przeciwnym razie zwraca „FALSE” |
% ROWCOUNT | Zwraca wartość liczbową. Podaje faktyczną liczbę rekordów, na które miało wpływ działanie DML. |
Wyraźny przykład kursora:
W tym przykładzie zobaczymy, jak zadeklarować, otworzyć, pobrać i zamknąć jawny kursor.
Za pomocą kursora wyświetlimy całe nazwisko pracownika z tabeli emp. Użyjemy także atrybutu kursora, aby ustawić pętlę tak, aby pobierała cały rekord z kursora.
DECLARE CURSOR guru99_det IS SELECT emp_name FROM emp; lv_emp_name emp.emp_name%type; BEGIN OPEN guru99_det; LOOP FETCH guru99_det INTO lv_emp_name; IF guru99_det%NOTFOUND THEN EXIT; END IF; Dbms_output.put_line(‘Employee Fetched:‘||lv_emp_name); END LOOP; Dbms_output.put_line(‘Total rows fetched is‘||guru99_det%R0WCOUNT); CLOSE guru99_det; END: /
Wydajność
Employee Fetched:BBB Employee Fetched:XXX Employee Fetched:YYY Total rows fetched is 3
Objaśnienie kodu
- Linia kodu 2: Deklarowanie kursora guru99_det dla instrukcji „SELECT emp_name FROM emp”.
- Linia kodu 3: Deklarowanie zmiennej lv_emp_name.
- Linia kodu 5: Otwieranie kursora guru99_det.
- Linia kodu 6: Ustawianie instrukcji pętli Basic w celu pobrania wszystkich rekordów z tabeli „emp”.
- Linia kodu 7: Pobiera dane guru99_det i przypisuje wartość do lv_emp_name.
- Linia kodu 9: Użycie atrybutu kursora „%NOTFOUND” w celu sprawdzenia, czy pobrany został cały rekord znajdujący się pod kursorem. Jeśli zostanie pobrany, zwróci „TRUE” i sterowanie wyjdzie z pętli, w przeciwnym razie sterowanie będzie kontynuować pobieranie danych z kursora i drukowanie danych.
- Linia kodu 11: Warunek EXIT dla instrukcji pętli.
- Linia kodu 12: Wydrukuj pobrane nazwisko pracownika.
- Linia kodu 14: Użycie atrybutu kursora „%ROWCOUNT” w celu znalezienia całkowitej liczby rekordów, których dotyczy problem/pobranych przez kursor.
- Linia kodu 15: Po wyjściu z pętli kursor zostaje zamknięty, a przydzielona pamięć zostaje zwolniona.
Instrukcja kursora pętli FOR
Do pracy z kursorami można używać instrukcji „FOR LOOP”. Zamiast limitu zakresu w instrukcji pętli FOR możemy podać nazwę kursora, dzięki czemu pętla będzie działać od pierwszego rekordu kursora do ostatniego rekordu kursora. Zmienna kursora, otwieranie kursora, pobieranie i zamykanie kursora będzie wykonywane pośrednio przez pętlę FOR.
Składnia
DECLARE CURSOR <cursor_name> IS <SELECT statement>; BEGIN FOR I IN <cursor_name> LOOP . . END LOOP; END;
- W powyższej składni część deklaracyjna zawiera deklarację kursora.
- Kursor jest tworzony dla instrukcji „SELECT” podanej w deklaracji kursora.
- W części wykonawczej zadeklarowany kursor jest ustawiany w pętli FOR i zmienna pętli „I” będzie w tym przypadku zachowywać się jak zmienna kursora.
Oracle Kursor dla przykładu pętli:
W tym przykładzie wyświetlimy wszystkie nazwiska pracowników z tabeli emp za pomocą pętli kursor-FOR.
DECLARE CURSOR guru99_det IS SELECT emp_name FROM emp; BEGIN FOR lv_emp_name IN guru99_det LOOP Dbms_output.put_line(‘Employee Fetched:‘||lv_emp_name.emp_name); END LOOP; END; /
Wydajność
Employee Fetched:BBB Employee Fetched:XXX Employee Fetched:YYY
Objaśnienie kodu
- Linia kodu 2: Deklarowanie kursora guru99_det dla instrukcji „SELECT emp_name FROM emp”.
- Linia kodu 4: Konstruowanie pętli „FOR” dla kursora ze zmienną pętli lv_emp_name.
- Linia kodu 5: Drukowanie nazwiska pracownika w każdej iteracji pętli.
- Linia kodu 8: Wyjdź z pętli
Uwaga: W pętli Cursor-FOR nie można używać atrybutów kursora, ponieważ otwieranie, pobieranie i zamykanie kursora odbywa się niejawnie przez Dla pętli.