Úvod do kurzoru v SQL

Kurzory jsou dočasné pracovní prostory vytvořené v paměti ke zpracování některých příkazů SQL na hromadě dat. Příliš komplikovaná definice? Rozumíme tomu. Přemýšlejte o kurzorech pro každou smyčku v SQL. Chcete provést úkol na řadě řádků dat, použijte kurzor. Řekněme, že máte zaměstnanecký stůl, který drží plat pro každého zaměstnance organizace. Chcete zvýšit plat každého zaměstnance o určité procento. Zde byste použili kurzor. 'How' je ilustrováno dále v článku.

Kurzory tedy vytvářejí dočasný pracovní prostor s vybranou sadou řádků a ukazatelem, který ukazuje na aktuální řádek. Tato sada řádků, na kterých kurzor provede požadovanou operaci, se nazývá aktivní sada dat. Ukazatel načítá řádky z sady výsledků jeden po druhém. Poté můžete provádět jakoukoli operaci SQL po jednom řádku.

Implicitní kurzory

Implicitní kurzory, jak název napovídá, jsou generovány analyzátorem SQL pro dotazy DML. Dotazy DML jsou dotazy na zpracování dat. Tyto dotazy manipulují nebo mění data. Neovlivňují strukturu ani schéma databáze. Dotazy jako SELECT, INSERT, UPDATE a DELETE generují implicitní kurzor. Implicitní kurzory jsou pro koncového uživatele skryté.

Explicitní kurzory

Explicitní kurzory jsou kurzory generované uživatelem. Když uživatel přikáže analyzátoru SQL, aby vytvořil kurzor pro aktivní sadu, takto vytvořený kurzor se nazývá explicitní kurzor. Aktivní sada je definována pomocí dotazu SELECT uživatelem. V tomto článku bychom podrobně popsali výslovné kurzory.

Akce kurzoru - životní cyklus kurzoru

Životní cyklus kurzoru obvykle zahrnuje pět fází:

1. Deklarovat: Prvním krokem je deklarovat kurzor. Tento krok přikáže systému vygenerovat kurzor s danou datovou sadou. Datová sada je konstruována pomocí příkazu SQL. V této fázi se vytvoří aktivní sada, ale dočasný pracovní prostor kurzoru ještě není v paměti otevřen.

2. Otevřít: Dále je systém vyzván k otevření kurzoru. V této fázi je dočasný pracovní prostor načten do paměti s aktivní sadou a je vygenerován ukazatel, který ukazuje na první řádek v aktivní sadě.

3. Načíst: Toto je opakující se krok v celém procesu. Aktuální řádek ukazovaný ukazatelem je vyvolán a požadovaná úloha je provedena na datech řádku. Ukazatel se přesune na další řádek kurzoru.

4. Zavřít: Po dokončení manipulace s daty musí být kurzor uzavřen.

5. Deallocate: Toto je poslední krok k vymazání kurzoru a uvolnění paměti, procesoru a dalších systémových prostředků přidělených kurzoru.

Explicitní kurzory - v akci!

Dobře, takže nyní máme základní představu o tom, co jsou kurzory a jak fungují. Je čas, abychom si zašpinili ruce a sami si vytvořili výslovný kurzor.

Terminologie kurzoru v SQL

Pojďme pochopit terminologie použité v této syntaxi.

Rozsah kurzoru

  • Rozsah kurzoru může být buď GLOBAL, nebo LOCAL . V celém připojení je k dispozici globální kurzor. Místní kurzor je omezen na pouze uložené procedury, funkce nebo dotaz, který drží kurzor.
  • Toto je funkce specifická pro MS SQL Server. MySQL podporuje pouze lokální kurzory.

Pohyb kurzoru

  • MS SQL Server také dává možnost nastavit pohyb kurzoru. Může to být buď konvenční režim Forward_Only, který přesouvá ukazatel z prvního řádku do posledního řádku po řádku. Nebo jej lze posouvat na první, poslední, předchozí nebo další řádek.
  • Kurzory v MySQL nelze posouvat.

Typ kurzoru

  • Kurzor může být statický, protože v něm může mezipaměť aktivní sady ukládat až do deallokace a může žonglovat vpřed a vzad prostřednictvím této aktivní mezipaměti. Kurzor může být rychlý vpřed pouze ve statickém režimu.
  • Může být také dynamický, aby umožnil přidávání nebo mazání řádků v aktivní sadě, když je kurzor otevřený. Tyto změny nejsou viditelné pro ostatní uživatele kurzoru v režimu sady klíčů. Kurzory v MySQL jsou pouze rychlé.

Zámek kurzoru

  • Zámky kurzoru jsou užitečné v prostředí pro více uživatelů. Uzamknou řádek tak, aby dva uživatelé současně nepracovali na stejných datech. Tím je zajištěna integrita dat.
  • Zámek jen pro čtení uvádí, že řádek nelze aktualizovat.
  • Posuvné zámky uzamknou řádek, když jsou načteny do kurzoru, což zajišťuje úspěšnost úlohy a dostupnost aktualizovaných dat mimo kurzor. Optimistické pokusy aktualizovat řádek bez zámku. Pokud tedy byl řádek aktualizován mimo kurzor, úloha nebude úspěšná.
  • MySQL podporuje pouze zámky pouze pro čtení. To znamená, že MySQL neaktualizuje skutečnou tabulku, spíše by zkopíroval data, aby provedl aktualizační příkazy.

Vidíme tedy, že tyto možnosti jsou dostupné pouze v MS SQL Serveru. Díky tomu je syntaxe kurzorů MySQL ještě jednodušší.

Příklad

Nyní aktualizujme plat zaměstnanců v tabulce Zaměstnanci.

Použili bychom níže uvedená data v těchto kurzorech v příkladu SQL.

Náš kurzorový kód by byl následující:

DECLARE @sal float
DECLARE @newsal float
DECLARE Emp_Cur CURSOR FOR SELECT Salary, Updated_Salary FROM Employees
OPEN Emp_Cur
FETCH NEXT FROM Emp_Cur INTO @sal, @newsal
WHILE @@FETCH_STATUS = 0
BEGIN
SET @newsal = @sal*1.25
UPDATE Employees SET Updated_Salary = @newsal WHERE CURRENT OF Emp_Cur
FETCH NEXT FROM Emp_Cur INTO @sal, @newsal
END
CLOSE Emp_Cur
DEALLOCATE Emp_Cur

A výstup po provedení výše uvedeného příkazu kurzoru by byl:

Závěr - Kurzory v SQL

Viděli jsme tedy, co jsou kurzory, jak je používat a kde jim zabránit. Kurzory se ukázaly jako užitečný nástroj pro vývojáře, ale na úkor výkonu. Buďte opatrní, když se rozhodnete pro kurzory.

Doporučené články

Toto je průvodce kurzory v SQL. Zde diskutujeme typy, životní cyklus a terminologii kurzoru v SQL s příklady. Můžete si také prohlédnout naše další doporučené články -

  1. Typy spojení v SQL
  2. Příkaz SQL Alter
  3. Zobrazení SQL
  4. Nástroje pro správu SQL
  5. Typy kurzoru v PL / SQL
  6. Top 6 typů spojení v MySQL s příklady