Co to jest CURSOR w PL / SQL?
Kursor jest wskaźnikiem do tego obszaru kontekstu. Oracle tworzy obszar kontekstowy do przetwarzania instrukcji SQL, który zawiera wszystkie informacje o instrukcji.
PL / SQL pozwala programiście kontrolować obszar kontekstu za pomocą kursora. Kursor przechowuje wiersze zwrócone przez instrukcję SQL. Zestaw wierszy, które utrzymuje kursor, nazywany jest zestawem aktywnym. Te kursory można również nazwać, aby można było do nich odwoływać się z innego miejsca kodu.
W tym samouczku nauczysz się:
- Niejawny kursor
- Jawny kursor
- Atrybuty kursora
- Instrukcja kursora pętli FOR
Kursor jest dwojakiego rodzaju.
- Niejawny kursor
- Jawny kursor
Niejawny kursor
Za każdym razem, gdy w bazie danych wystąpią jakiekolwiek operacje DML, tworzony jest niejawny kursor przechowujący wiersze, których dotyczy ta konkretna operacja. Tych kursorów nie można nazwać, a zatem nie można ich kontrolować ani odwoływać z innego miejsca kodu. Możemy odnosić się tylko do ostatniego kursora poprzez atrybuty kursora.
Jawny kursor
Programiści mogą tworzyć nazwane obszary kontekstowe, aby wykonywać swoje operacje DML, aby uzyskać nad nim większą kontrolę. Kursor jawny należy zdefiniować w sekcji deklaracji bloku PL / SQL i jest on tworzony dla instrukcji „SELECT”, której należy użyć w kodzie.
Poniżej znajdują się czynności związane z pracą z jawnymi kursorami.
- Deklarowanie kursora
Zadeklarowanie kursora oznacza po prostu utworzenie jednego nazwanego obszaru kontekstu dla instrukcji „SELECT”, która jest zdefiniowana w części deklaracji. Nazwa tego obszaru kontekstu jest taka sama jak nazwa kursora.
- Otwieranie kursora
Otwarcie kursora poinstruuje PL / SQL, aby przydzielił pamięć dla tego kursora. Spowoduje to, że kursor będzie gotowy do pobrania rekordów.
- Pobieranie danych z kursora
W tym procesie wykonywana jest instrukcja „SELECT”, a pobrane wiersze są zapisywane w przydzielonej pamięci. Są one teraz nazywane zestawami aktywnymi. Pobieranie danych z kursora jest czynnością na poziomie rekordu, co oznacza, że możemy uzyskać dostęp do danych w sposób rekord po rekordzie.
Każda instrukcja pobierania 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 zgłosi żadnych wyjątków.
- Zamykanie kursora
Po pobraniu całego rekordu musimy zamknąć kursor, aby zwolniona została pamięć przydzielona do tego obszaru kontekstu.
Składnia:
DECLARECURSORIS
- W powyższej składni część deklaracji 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 kursor niejawny, jak i kursor jawny mają pewne atrybuty, do których można uzyskać dostęp. Te atrybuty dostarczają więcej informacji o operacjach kursora. Poniżej znajdują się różne atrybuty kursora i ich zastosowanie.
Atrybut kursora | Opis |
%ZNALEZIONY | Zwraca wynik logiczny „TRUE”, jeśli ostatnia operacja pobierania pomyślnie pobrała rekord, w przeciwnym razie zwróci FALSE. |
%NIE ZNALEZIONO | Działa to odwrotnie do% FOUND, zwróci wartość „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” |
%LICZBA WIERSZY | Zwraca wartość liczbową. Podaje rzeczywistą liczbę rekordów, na które wpłynęła aktywność DML. |
Przykład 1 : W tym przykładzie zobaczymy, jak zadeklarować, otworzyć, pobrać i zamknąć jawny kursor.
Za pomocą kursora wyświetlimy imię i nazwisko pracownika z tabeli emp. Użyjemy również atrybutu kursora, aby ustawić pętlę, aby pobrać cały rekord z kursora.
DECLARECURSOR guru99_det IS SELECT emp_name FROM emp;lv_emp_name emp.emp_name%type;BEGINOPEN guru99_det;LOOPFETCH guru99_det INTO lv_emp_name;IF guru99_det%NOTFOUNDTHENEXIT;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:/
Wynik
Employee Fetched:BBBEmployee Fetched:XXXEmployee Fetched:YYYTotal rows fetched is 3
Objaśnienie kodu:
- Linia kodu 2 : Deklaracja 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: Ustawienie 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”, aby sprawdzić, czy pobrano cały rekord w kursorze. Jeśli zostanie pobrane, zwróci „TRUE” i sterowanie wyjdzie z pętli, w przeciwnym razie sterowanie będzie nadal pobierać dane z kursora i drukować dane.
- Linia kodu 11: warunek EXIT dla instrukcji pętli.
- Linia kodu 12: Wydrukuj pobrane imię i nazwisko pracownika.
- Linia kodu 14: Użycie atrybutu kursora „% ROWCOUNT”, aby znaleźć całkowitą liczbę rekordów, których dotyczy / zostały pobrane w kursorze.
- Linia kodu 15: Po wyjściu z pętli kursor jest zamykany, a przydzielona pamięć zwalniana.
Instrukcja kursora pętli FOR
Do pracy z kursorami można użyć instrukcji „FOR LOOP”. Możemy podać nazwę kursora zamiast ograniczenia zakresu w instrukcji pętli FOR, aby pętla działała od pierwszego rekordu kursora do ostatniego rekordu kursora. Zmienna kursora, otwieranie kursora, pobieranie i zamykanie kursora zostanie wykonane niejawnie przez pętlę FOR.
Składnia:
DECLARECURSORIS
- W powyższej składni część deklaracji 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.
Przykład 1 : W tym przykładzie wyświetlimy wszystkie nazwiska pracowników z tabeli emp za pomocą pętli kursor-FOR.
DECLARECURSOR guru99_det IS SELECT emp_name FROM emp;BEGINFOR lv_emp_name IN guru99_detLOOPDbms_output.put_line(‘Employee Fetched:‘||lv_emp_name.emp_name);END LOOP;END;/
Wynik
Employee Fetched:BBBEmployee Fetched:XXXEmployee Fetched:YYY
Objaśnienie kodu:
- Linia kodu 2 : Deklaracja kursora guru99_det dla instrukcji „SELECT emp_name FROM emp”.
- Linia kodu 4 : Konstruowanie pętli „FOR” dla kursora za pomocą zmiennej pętli lv_emp_name.
- Linia kodu 5: Drukowanie nazwiska pracownika w każdej iteracji pętli.
- Linia kodu 8: wyjście 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 w pętli FOR.