Oracle PL / SQL Cursor: Implicit, Explicit, Cursor FOR Loop [przykład]
co to jest kursor w PL/SQL?
kursor jest wskaźnikiem do tego obszaru kontekstowego. 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 zwracane przez polecenie SQL. Zestaw wierszy przechowywany przez kursor jest określany jako aktywny zestaw., Kursory te mogą być również nazwane tak, aby mogły być odwołane z innego miejsca kodu.
w tym tutorialu dowiesz się-
- Niejawny kursor
- jawny kursor
- atrybuty kursora
- dla instrukcji Loop Cursor
kursor jest dwóch typów.
- Implicit Cursor
- Explicit Cursor
Implicit Cursor
Ilekroć w bazie danych występują jakiekolwiek operacje DML, tworzony jest implicit cursor, który przechowuje wiersze, których to dotyczy, w danej operacji., Kursory te nie mogą być nazwane, a zatem nie mogą być kontrolowane ani odwoływane z innego miejsca kodu. Możemy odnosić się tylko do najnowszego kursora poprzez atrybuty kursora.
jawny kursor
programiści mogą tworzyć nazwane obszary kontekstowe, aby wykonywać swoje operacje DML, aby uzyskać większą kontrolę nad nim. Jawny kursor powinien być zdefiniowany w sekcji deklaracja bloku PL / SQL i jest tworzony dla instrukcji 'SELECT', która ma być użyta w kodzie.
Poniżej znajdują się kroki związane z pracą z wyraźnymi kursorami.,
- deklarowanie kursora
deklarowanie kursora oznacza po prostu utworzenie jednego nazwanego obszaru kontekstowego dla instrukcji 'SELECT' zdefiniowanej w części deklaracji. Nazwa tego obszaru kontekstowego jest taka sama jak nazwa kursora.
- otwarcie kursora
otwarcie kursora poleci PL / SQL przydzielenie pamięci dla tego kursora. Spowoduje to, że kursor będzie gotowy do pobrania rekordów.
- pobieranie danych z kursora
w tym procesie wykonywane jest polecenie 'SELECT', a pobrane wiersze są przechowywane w przydzielonej pamięci., Są one teraz nazywane zestawami aktywnymi. Pobieranie danych z kursora jest czynnością na poziomie rekordowym, co oznacza, że możemy uzyskać dostęp do danych w sposób rekord po rekordzie.
każda instrukcja fetch pobiera 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 wyrzuci żadnych WYJĄTKÓW.
- zamykanie kursora
Po pobraniu całego rekordu musimy zamknąć kursor tak, aby pamięć przydzielona do tego obszaru kontekstowego została zwolniona.,
składnia:
- w powyższej składni część deklaracji zawiera deklarację kursora i zmiennej kursora, do 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 Ukryty kursor, jak i jawny kursor mają pewne atrybuty, do których można uzyskać dostęp. Atrybuty te dają więcej informacji na temat operacji kursora., Poniżej znajdują się różne atrybuty kursora i ich użycie.
atrybut kursora | opis |
%FOUND | zwraca wynik logiczny 'TRUE' jeśli ostatnia operacja pobierania pobrała rekord pomyślnie, w przeciwnym razie zwróci FALSE. |
%NOTFOUND | to działa odwrotnie do %FOUND zwróci „TRUE”, jeśli ostatnia operacja pobierania nie może pobrać żadnego rekordu., |
%ISOPEN | zwraca wynik logiczny 'TRUE' jeśli dany kursor jest już otwarty, w przeciwnym razie zwraca 'FALSE' |
%ROWCOUNT | Zwraca wartość liczbową. Daje rzeczywistą liczbę rekordów, które zostały dotknięte przez aktywność DML. |
przykład 1: w tym przykładzie zobaczymy, jak zadeklarować, otworzyć, pobrać i zamknąć jawny kursor.
za pomocą kursora wyświetlimy nazwę pracownika z tabeli emp., Użyjemy również atrybutu kursora, aby ustawić pętlę, aby pobrać cały rekord z kursora.
Wyjście
Employee Fetched:BBBEmployee Fetched:XXXEmployee Fetched:YYY Total rows fetched is 3
Wyjaś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: otwarcie kursora guru99_det.
- linia kodu 6: ustawienie podstawowej instrukcji pętli, aby pobierała wszystkie rekordy w 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 cały rekord w kursorze został pobrany. Jeżeli zostanie pobrana, to zwróci „TRUE” I control wyjdzie z pętli, w przeciwnym razie control będzie nadal pobierać dane z kursora i drukować dane.
- linia kodu 11: warunek zakończenia instrukcji loop.
- linia kodu 12: wypisuje pobraną nazwę pracownika.,
- linia kodu 14: użycie atrybutu kursora '% ROWCOUNT', aby znaleźć całkowitą liczbę rekordów, które zostały dotknięte / pobrane w kursorze.
- linia kodu 15: po wyjściu z pętli kursor jest zamknięty, a przydzielona pamięć jest wolna.
Instrukcja For Loop Cursor
Instrukcja”FOR LOOP” może być używana do pracy z kursorami. Możemy podać nazwę kursora zamiast limitu zakresu w instrukcji For loop tak, że pętla będzie działać od pierwszego rekordu kursora do ostatniego rekordu kursora., Zmienna kursora, otwarcie kursora, pobieranie i zamykanie kursora będzie wykonywane domyślnie przez pętlę FOR.
składnia:
DECLARECURSOR <cursor_name> IS <SELECT statement>;BEGIN FOR I IN <cursor_name> LOOP . . END LOOP;END;
- 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 ustawiony 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 całą nazwę pracownika z tabeli emp za pomocą pętli kursor-FOR.
wyjście
Employee Fetched:BBB Employee Fetched:XXXEmployee Fetched:YYY
Wyjaś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 nazwy 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żyć atrybutów kursora, ponieważ otwieranie, pobieranie i zamykanie kursora odbywa się domyślnie za pomocą pętli FOR.