Kurzor je dočasná paměť nebo dočasná pracovní stanice. Je přiděleno Databáze Server v době provádění operací DML (Data Manipulation Language) na Tabulce uživatelem. Kurzory se používají k ukládání databázových tabulek.
Existují 2 typy kurzorů: Implicitní kurzory a Explicitní kurzory. Ty jsou vysvětleny následovně.
- Implicitní kurzory: Implicitní kurzory jsou také známé jako výchozí kurzory SQL SERVER. Tyto kurzory přiděluje SQL SERVER, když uživatel provádí operace DML.
- Explicitní kurzory: Explicitní kurzory jsou vytvářeny uživateli, kdykoli je uživatel požaduje. Explicitní kurzory se používají pro načítání dat z tabulky způsobem řádek po řádku.
Jak vytvořit explicitní kurzor?
- Deklarace objektu kurzoru
Syntax:
DECLARE název_kurzoru CURSOR FOR SELECT * FROM název_tabulky
Dotaz:
DECLARE s1 CURSOR FOR SELECT * FROM studDetails>
2. Otevřete připojení kurzoru
proč rozhraní značek v Javě
Syntax:
OPEN připojení kurzoru
Dotaz:
OPEN s1>
Načíst data z kurzoru K datům z kurzoru lze přistupovat celkem 6 způsoby. Jsou následující:
- PRVNÍ se používá k načtení pouze prvního řádku z kurzorové tabulky.
- POSLEDNÍ se používá k načtení pouze posledního řádku z kurzorové tabulky.
- DALŠÍ se používá k načítání dat v dopředném směru z kurzorové tabulky.
- PŘEDCHOZÍ se používá k načítání dat ve zpětném směru z kurzorové tabulky.
- ABSOLUTNÍ n se používá k získání přesného nčtřádek z tabulky kurzorů.
- PŘÍBUZNÝ n se používá k načítání dat inkrementálním způsobem i dekrementálním způsobem.
Syntax:
NAČÍST DALŠÍ / PRVNÍ / POSLEDNÍ / PŘEDCHOZÍ / ABSOLUTNÍ n / RELATIVNÍ n ZE kurzor_název
Dotaz:
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>
- Zavřete připojení kurzoru
Syntax:
ZAVŘÍT název_kurzoru
Dotaz:
CLOSE s1>
- Udělte přidělení paměti kurzoru
Syntax:
DEALLOCATE název_kurzoru
Dotaz:
DEALLOCATE s1>
Jak vytvořit implicitní kurzor?
Implicitní kurzor je kurzor, který automaticky vytvoří PL/SQL, když spustíte příkaz SQL. Implicitní kurzor nemusíte explicitně deklarovat ani otevírat. Místo toho za vás PL/SQL spravuje kurzor v zákulisí.
Chcete-li vytvořit implicitní kurzor v PL/SQL, stačí provést příkaz SQL. Chcete-li například načíst všechny řádky z tabulky EMP, můžete použít následující kód:
Dotaz:
BEGIN FOR emp_rec IN SELECT * FROM emp LOOP DBMS_OUTPUT.PUT_LINE('Employee name: ' || emp_rec.ename); END LOOP; END;> V PL/SQL, když provádíme VLOŽIT , AKTUALIZACE nebo VYMAZAT operací se automaticky vytvoří implicitní kurzor. Tento kurzor obsahuje data, která mají být vložena, nebo identifikuje řádky, které mají být aktualizovány nebo odstraněny. Tento kurzor můžete ve svém kódu označit jako kurzor SQL. Tento kurzor SQL má několik užitečných atributů.
- %FOUND má hodnotu true, pokud poslední operace SQL ovlivnila alespoň jeden řádek.
- %NOTFOUND je pravdivé, pokud neovlivnilo žádné řádky.
- %ROWCOUNT vrátí počet ovlivněných řádků.
- %ISOPEN zkontroluje, zda je kurzor otevřený.
Kromě těchto atributů jsou %BULK_ROWCOUNT a %BULK_EXCEPTIONS specifické pro příkaz FORALL, který se používá k provádění více operací DML najednou. %BULK_ROWCOUNT vrátí počet řádků ovlivněných každou operací DML, zatímco %BULK_EXCEPTION vrátí všechny výjimky, ke kterým došlo během operací.
Dotaz:
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ýstup:
Tento program aktualizuje tabulku zvýšením platu každého zaměstnance o 1500. Po aktualizaci se atribut SQL%ROWCOUNT používá ke zjištění, kolik řádků bylo operací ovlivněno.
Dotaz:
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ýstup:
5 Emp selected PL/SQL procedure successfully completed.>
Výjimky kurzoru SQL
Kdykoli provádíme SQL dotaz, existuje možnost neočekávané chyby. Kurzor prochází každou sadu řádků, aby se vrátil v dotazu SQL.
Existuje několik velmi populárních výjimek:
- Duplicitní hodnota: K tomuto typu chyby dochází, když se kurzor pokouší vložit záznam nebo n-tici, které již v databázi existují. těmto typům chyb se lze vyhnout správným zpracováním chybového konf
- Neplatný stav kurzoru: Kdykoli je kurzor v neplatném stavu, tento typ chyby se zobrazí jako chyba.
- Časový limit zámku: K tomu dochází, když se kurzor pokusí získat zámek na řádku nebo tabulce, ale zámek je již držen jinou transakcí.
Potřeba kurzoru na serveru SQL
- Kurzory nám umožňují zpracovávat data řádek po řádku, což může být užitečné, když potřebujeme provádět složité výpočty nebo transformace dat.
- Kurzory nám umožňují vícekrát iterovat sadu výsledků, což může být užitečné, když potřebujeme provést více operací se stejnými daty.
- Kurzory mohou být užitečné, když potřebujeme spojit více tabulek se složitými vztahy, například při zpracování hierarchických datových struktur nebo při provádění rekurzivních dotazů.
- Kurzory nám umožňují provádět operace, jako je aktualizace, mazání nebo vkládání záznamů na základě určitých podmínek nebo kritérií.
- Kurzory jsou užitečné zejména při zpracování dat z více tabulek, kde vztahy nejsou přímočaré.
Omezení kurzoru serveru SQL Server
Vzhledem k tomu, že kurzor má určitá omezení, měl by být používán pouze v případě, že neexistuje žádná jiná možnost. Mezi tato omezení patří:
- Při zpracování dat uvaluje zámky na podmnožinu nebo celou tabulku.
- Kurzor aktualizuje záznamy tabulky po jednom řádku, což zpomaluje její výkon.
- Zatímco smyčky jsou pomalejší než kurzory, mají větší režii.
- Dalším faktorem, který ovlivňuje rychlost kurzoru, je množství řádků a sloupců přenesených do kurzoru.
FAQ:
Q.1 Jak se lze vyhnout kurzorům?
Odpovědět:
Primární funkcí kurzorů je navigace v tabulce řádek po řádku. Následuje několik jednoduchých metod, jak se vyhnout kurzorům:
Q.2 Jak používat while Loop v SQL kurzoru?
Odpovědět:
Použití smyčky while, která umožňuje vložení sady výsledků do dočasné tabulky, je nejjednodušší způsob, jak se vyhnout potřebě kurzoru.
Q.3 Co jsou uživatelem definované funkce v SQL Cursor?
Odpovědět:
Někdy se výsledná sada řádků vypočítá pomocí kurzorů. Toho můžeme dosáhnout použitím uživatelsky definované funkce, která odpovídá specifikacím.
Q.4 Použití spojení s kurzorem SQL?
Odpovědět:
V případech, kdy je třeba zpracovat velké záznamy, spojení snižuje počet řádků kódu zpracováním pouze těch sloupců, které splňují zadanou podmínku.