Kursor to pamięć tymczasowa lub tymczasowa stacja robocza. Jest przydzielany przez Baza danych Serwer w momencie wykonywania przez Użytkownika operacji DML (Data Manipulation Language) na Tabeli. Kursory służą do przechowywania tabel bazy danych.
Istnieją 2 typy kursorów: kursory niejawne i kursory jawne. Wyjaśniono je w następujący sposób poniżej.
- Niejawne kursory: Niejawne kursory są również znane jako domyślne kursory SQL SERVER. Te kursory są przydzielane przez SQL SERVER, gdy użytkownik wykonuje operacje DML.
- Wyraźne kursory: Jawne kursory są tworzone przez użytkowników, gdy użytkownik ich potrzebuje. Jawne kursory służą do pobierania danych z tabeli wiersz po wierszu.
Jak utworzyć wyraźny kursor?
- Zadeklaruj obiekt kursora
Składnia:
DECLARE nazwa_kursora KURSOR DO WYBORU * Z nazwa_tabeli
Zapytanie:
DECLARE s1 CURSOR FOR SELECT * FROM studDetails>
2. Otwórz połączenie kursora
data konwertowana na ciąg
Składnia:
OTWÓRZ połączenie kursora
Zapytanie:
OPEN s1>
Pobierz dane z kursora Dostęp do danych za pomocą kursora można uzyskać w sumie na 6 sposobów. Są one następujące:
- PIERWSZY służy do pobrania tylko pierwszego wiersza z tabeli kursorów.
- OSTATNI służy do pobrania tylko ostatniego wiersza z tabeli kursorów.
- NASTĘPNY służy do pobierania danych w kierunku do przodu z tabeli kursorów.
- WCZEŚNIEJSZY służy do pobierania danych w kierunku wstecznym z tabeli kursorów.
- ABSOLUTNY r służy do pobrania dokładnego ntwiersz z tabeli kursorów.
- KREWNY rz służy do pobierania danych w sposób przyrostowy i dekrementalny.
Składnia:
POBIERZ NASTĘPNY/PIERWSZY/OSTATNI/PRZEDNI/ABSOLUTE n/RELATIVE n FROM nazwa_kursora
Zapytanie:
FETCH FIRST FROM s1 FETCH LAST FROM s1 FETCH NEXT FROM s1 FETCH PRIOR FROM s1 FETCH ABSOLUTE 7 FROM s1 FETCH RELATIVE -2 FROM s1>
- Zamknij połączenie kursora
Składnia:
ZAMKNIJ nazwa_kursora
Zapytanie:
CLOSE s1>
- Zwolnij pamięć kursora
Składnia:
DEALLOCATE nazwa_kursora
Zapytanie:
DEALLOCATE s1>
Jak utworzyć ukryty kursor?
Niejawny kursor to kursor tworzony automatycznie przez PL/SQL podczas wykonywania instrukcji SQL. Nie musisz jawnie deklarować ani otwierać ukrytego kursora. Zamiast tego PL/SQL zarządza kursorem za kulisami.
Aby utworzyć ukryty kursor w PL/SQL, wystarczy wykonać instrukcję SQL. Na przykład, aby pobrać wszystkie wiersze z tabeli EMP, możesz użyć następującego kodu:
Zapytanie:
BEGIN FOR emp_rec IN SELECT * FROM emp LOOP DBMS_OUTPUT.PUT_LINE('Employee name: ' || emp_rec.ename); END LOOP; END;> W PL/SQL, kiedy wykonujemy WSTAWIĆ , AKTUALIZACJA Lub USUWAĆ operacji, automatycznie tworzony jest ukryty kursor. Kursor ten przechowuje dane do wstawienia lub identyfikuje wiersze, które należy zaktualizować lub usunąć. Możesz odwoływać się do tego kursora jako kursora SQL w swoim kodzie. Kursor SQL ma kilka przydatnych atrybutów.
- %FOUND ma wartość true, jeśli ostatnia operacja SQL miała wpływ na co najmniej jeden wiersz.
- %NOTFOUND ma wartość true, jeśli nie miało wpływu na żadne wiersze.
- %ROWCOUNT zwraca liczbę wierszy, których to dotyczy.
- %ISOPEN sprawdza, czy kursor jest otwarty.
Oprócz tych atrybutów %BULK_ROWCOUNT i %BULK_EXCEPTIONS są specyficzne dla instrukcji FORALL, która służy do jednoczesnego wykonywania wielu operacji DML. %BULK_ROWCOUNT zwraca liczbę wierszy, na które wpływa każda operacja DML, natomiast %BULK_EXCEPTION zwraca każdy wyjątek, który wystąpił podczas operacji.
Zapytanie:
CREATE TABLE Emp( EmpID INT PRIMARY KEY, Name VARCHAR(50), Country VARCHAR(50), Age int(2), Salary int(10) ); -- Insert some sample data into the Customers table INSERT INTO Emp (EmpID, Name,Country, Age, Salary) VALUES (1, 'Shubham', 'India','23','30000'), (2, 'Aman ', 'Australia','21','45000'), (3, 'Naveen', 'Sri lanka','24','40000'), (4, 'Aditya', 'Austria','21','35000'), (5, 'Nishant', 'Spain','22','25000'); Select * from Emp;>
Wyjście:
Program ten aktualizuje tabelę poprzez zwiększenie wynagrodzenia każdego pracownika o 1500. Po aktualizacji atrybut SQL%ROWCOUNT służy do sprawdzenia, na ile wierszy miała wpływ operacja.
Zapytanie:
DECLARE total_rows number; BEGIN UPDATE Emp SET Salary = Salary + 1500; total_rows := SQL%ROWCOUNT; dbms_output.put_line(total_rows || ' rows updated.'); END;>
Wyjście:
5 Emp selected PL/SQL procedure successfully completed.>
Wyjątki kursora SQL
Za każdym razem, gdy wykonujemy zapytanie SQL, istnieje możliwość wystąpienia nieoczekiwanego błędu. Kursor przechodzi przez każdy zestaw wierszy, aby zwrócić się w zapytaniu SQL.
Istnieje kilka bardzo popularnych wyjątków:
- Zduplikowana wartość: Ten typ błędu występuje, gdy kursor próbuje wstawić rekord lub krotkę, która już istnieje w bazie danych. tego typu błędów można uniknąć, obsługując odpowiednią konfigurację błędów
- Nieprawidłowy stan kursora: Ilekroć kursor znajduje się w nieprawidłowym stanie, ten typ błędu będzie wyświetlany jako błąd.
- Limit czasu blokady: Dzieje się tak, gdy kursor próbuje uzyskać blokadę wiersza lub tabeli, ale blokada jest już wstrzymana przez inną transakcję.
Potrzeba kursora w serwerze SQL
- Kursory pozwalają nam przetwarzać dane wiersz po wierszu, co może być przydatne, gdy musimy wykonać skomplikowane obliczenia lub transformacje danych.
- Kursory pozwalają nam na wielokrotną iterację po zestawie wyników, co może być przydatne, gdy musimy wykonać wiele operacji na tych samych danych.
- Kursory mogą być przydatne, gdy musimy połączyć wiele tabel złożonymi relacjami, na przykład podczas przetwarzania hierarchicznych struktur danych lub podczas wykonywania zapytań rekurencyjnych.
- Kursory umożliwiają nam wykonywanie operacji, takich jak aktualizowanie, usuwanie lub wstawianie rekordów w oparciu o pewien warunek lub kryteria.
- Kursory są szczególnie przydatne podczas przetwarzania danych z wielu tabel, w których relacje nie są proste.
Ograniczenia kursora SQL Server
Ponieważ kursor ma pewne ograniczenia, należy go używać tylko wtedy, gdy nie ma innego wyboru. Ograniczenia te obejmują:
- Podczas przetwarzania danych nakłada blokady na podzbiór lub całą tabelę.
- Kursor aktualizuje rekordy tabeli po jednym wierszu na raz, co spowalnia jej działanie.
- Chociaż pętle są wolniejsze niż kursory, wiążą się z większym obciążeniem.
- Innym czynnikiem wpływającym na szybkość kursora jest liczba wierszy i kolumn wprowadzanych do kursora.
Często zadawane pytania:
P.1 Jak można unikać kursorów?
Odpowiedź:
Podstawową funkcją kursorów jest nawigacja po tabeli wiersz po wierszu. Oto kilka prostych metod unikania kursorów:
P.2 Jak używać pętli while w kursorze SQL?
Odpowiedź:
Użycie pętli while, która umożliwia wstawienie zestawu wyników do tabeli tymczasowej, to najprostszy sposób na uniknięcie konieczności używania kursora.
P.3 Co to są funkcje zdefiniowane przez użytkownika w kursorze SQL?
Odpowiedź:
Czasami wynikowy zestaw wierszy jest obliczany przy użyciu kursorów. Możemy to osiągnąć poprzez zastosowanie funkcji zdefiniowanej przez użytkownika, która jest zgodna ze specyfikacjami.
P.4 Używanie złączeń z kursorem SQL?
Odpowiedź:
W przypadkach, gdy konieczne jest przetworzenie ogromnych rekordów, Join zmniejsza liczbę wierszy kodu, przetwarzając tylko te kolumny, które spełniają określony warunek.