Kurzor je dočasná pamäť alebo dočasná pracovná stanica. Prideľuje ho Databáza Server v čase vykonávania operácií DML (Data Manipulation Language) na tabuľke používateľom. Na ukladanie databázových tabuliek sa používajú kurzory.
Existujú 2 typy kurzorov: Implicitné kurzory a Explicitné kurzory. Tieto sú vysvetlené nasledovne.
- Implicitné kurzory: Implicitné kurzory sú známe aj ako predvolené kurzory SQL SERVER. Tieto kurzory prideľuje SQL SERVER, keď používateľ vykonáva operácie DML.
- Explicitné kurzory: Explicitné kurzory vytvárajú používatelia vždy, keď ich používateľ požaduje. Explicitné kurzory sa používajú na načítanie údajov z tabuľky spôsobom riadok po riadku.
Ako vytvoriť explicitný kurzor?
- Deklarovať objekt kurzora
Syntax:
DECLARE meno_kurzora CURSOR FOR SELECT * FROM názov_tabuľky
Dopyt:
DECLARE s1 CURSOR FOR SELECT * FROM studDetails>
2. Otvorte pripojenie kurzora
prečo rozhranie markerov v jave
Syntax:
OTVORTE pripojenie kurzora
Dopyt:
OPEN s1>
Načítanie údajov z kurzora Existuje celkom 6 spôsobov prístupu k údajom z kurzora. Sú nasledovné:
- NAJPRV sa používa na načítanie iba prvého riadku z tabuľky kurzorov.
- POSLEDNÉ sa používa na načítanie iba posledného riadku z tabuľky kurzorov.
- ĎALŠIE sa používa na získanie údajov v smere dopredu z tabuľky kurzorov.
- PREDCHÁDZAJÚCI sa používa na načítanie údajov v spätnom smere z tabuľky kurzorov.
- ABSOLÚTNE n sa používa na získanie presného nthriadok z tabuľky kurzorov.
- PRÍBUZNÝ n sa používa na získavanie údajov inkrementálnym spôsobom, ako aj dekrementálnym spôsobom.
Syntax:
NAČÍTAŤ ĎALŠIE/PRVÉ/POSLEDNÉ/PREDCHÁDZAJÚCE/ABSOLÚTNE n/RELATÍVNE n Z mena_kurzora
Dopyt:
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>
- Zatvorte pripojenie kurzora
Syntax:
ZATVORIŤ názov_kurzora
Dopyt:
CLOSE s1>
- Prideliť pamäť kurzora
Syntax:
DEALLOCATE názov_kurzora
Dopyt:
DEALLOCATE s1>
Ako vytvoriť implicitný kurzor?
Implicitný kurzor je kurzor, ktorý automaticky vytvorí PL/SQL, keď vykonáte príkaz SQL. Implicitný kurzor nemusíte explicitne deklarovať ani otvárať. Namiesto toho PL/SQL spravuje kurzor za vás v zákulisí.
Ak chcete vytvoriť implicitný kurzor v PL/SQL, musíte jednoducho vykonať príkaz SQL. Ak chcete napríklad získať všetky riadky z tabuľky EMP, môžete použiť nasledujúci kód:
Dopyt:
BEGIN FOR emp_rec IN SELECT * FROM emp LOOP DBMS_OUTPUT.PUT_LINE('Employee name: ' || emp_rec.ename); END LOOP; END;> V PL/SQL, keď vystupujeme VLOŽIŤ , AKTUALIZOVAŤ alebo VYMAZAŤ operácií sa automaticky vytvorí implicitný kurzor. Tento kurzor obsahuje údaje, ktoré sa majú vložiť, alebo identifikuje riadky, ktoré sa majú aktualizovať alebo odstrániť. Tento kurzor môžete vo svojom kóde označovať ako kurzor SQL. Tento kurzor SQL má niekoľko užitočných atribútov.
- %FOUND je pravdivé, ak posledná operácia SQL ovplyvnila aspoň jeden riadok.
- %NOTFOUND je pravdivé, ak neovplyvnilo žiadne riadky.
- %ROWCOUNT vráti počet ovplyvnených riadkov.
- %ISOPEN skontroluje, či je kurzor otvorený.
Okrem týchto atribútov sú %BULK_ROWCOUNT a %BULK_EXCEPTIONS špecifické pre príkaz FORALL, ktorý sa používa na vykonávanie viacerých operácií DML naraz. %BULK_ROWCOUNT vráti počet riadkov ovplyvnených každou operáciou DML, zatiaľ čo %BULK_EXCEPTION vráti akúkoľvek výnimku, ktorá sa vyskytla počas operácií.
Dopyt:
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;>
Výkon:
Tento program aktualizuje tabuľku zvýšením platu každého zamestnanca o 1500. Po aktualizácii sa atribút SQL%ROWCOUNT používa na zistenie, koľko riadkov bola operácia ovplyvnená.
Dopyt:
DECLARE total_rows number; BEGIN UPDATE Emp SET Salary = Salary + 1500; total_rows := SQL%ROWCOUNT; dbms_output.put_line(total_rows || ' rows updated.'); END;>
Výkon:
5 Emp selected PL/SQL procedure successfully completed.>
Výnimky kurzora SQL
Kedykoľvek vykonáme SQL dotaz, existuje možnosť neočakávanej chyby. Kurzor prechádza cez každú sadu riadkov, aby sa vrátil v dotaze SQL.
Existuje niekoľko veľmi populárnych výnimiek:
- Duplicitná hodnota: Tento typ chyby sa vyskytuje, keď sa kurzor pokúša vložiť záznam alebo n-ticu, ktoré už v databáze existujú. týmto typom chýb možno predísť správnym spracovaním konf
- Neplatný stav kurzora: Vždy, keď je kurzor v neplatnom stave, tento typ chyby sa zobrazí ako chyba.
- Časový limit uzamknutia: K tomu dochádza, keď sa kurzor pokúša získať zámok na riadok alebo tabuľku, ale zámok už drží iná transakcia.
Potreba kurzora na serveri SQL
- Kurzory nám umožňujú spracovávať údaje riadok po riadku, čo môže byť užitočné, keď potrebujeme vykonávať zložité výpočty alebo transformácie údajov.
- Kurzory nám umožňujú opakovane opakovať množinu výsledkov, čo môže byť užitočné, keď potrebujeme vykonať viacero operácií s rovnakými údajmi.
- Kurzory môžu byť užitočné, keď potrebujeme spojiť viacero tabuliek so zložitými vzťahmi, napríklad pri spracovaní hierarchických dátových štruktúr alebo pri vykonávaní rekurzívnych dotazov.
- Kurzory nám umožňujú vykonávať operácie, ako je aktualizácia, mazanie alebo vkladanie záznamov na základe určitých podmienok alebo kritérií.
- Kurzory sú užitočné najmä pri spracovaní údajov z viacerých tabuliek, kde vzťahy nie sú jednoduché.
Obmedzenia kurzora servera SQL Server
Keďže kurzor má určité obmedzenia, mal by sa používať iba vtedy, keď nie je iná možnosť. Tieto obmedzenia zahŕňajú:
- Pri spracovaní údajov zablokuje podmnožinu alebo celú tabuľku.
- Kurzor aktualizuje záznamy tabuľky po jednom riadku, čo spomaľuje jej výkon.
- Aj keď sú slučky pomalšie ako kurzory, majú väčšiu réžiu.
- Ďalším faktorom, ktorý ovplyvňuje rýchlosť kurzora, je množstvo riadkov a stĺpcov prenesených do kurzora.
FAQ:
Q.1 Ako sa dá vyhnúť kurzorom?
odpoveď:
Primárnou funkciou kurzorov je navigácia v tabuľke riadok po riadku. Nasleduje niekoľko jednoduchých metód, ako sa vyhnúť kurzorom:
Q.2 Ako používať funkciu While Loop v kurzore SQL?
odpoveď:
Použitie cyklu while, ktorý umožňuje vloženie sady výsledkov do dočasnej tabuľky, je najjednoduchší spôsob, ako sa vyhnúť potrebe kurzora.
Q.3 Čo sú používateľom definované funkcie v SQL Cursor?
odpoveď:
Niekedy sa výsledná sada riadkov vypočíta pomocou kurzorov. Môžeme to dosiahnuť použitím užívateľom definovanej funkcie, ktorá je v súlade so špecifikáciami.
Q.4 Používanie spojení s kurzorom SQL?
odpoveď:
V prípadoch, keď je potrebné spracovať veľké záznamy, spojenie znižuje počet riadkov kódu spracovaním iba tých stĺpcov, ktoré spĺňajú zadanú podmienku.