Kurzor (databáze) - Cursor (databases)
![]() | Tento článek má několik problémů. Prosím pomozte vylepši to nebo diskutovat o těchto problémech na internetu diskusní stránka. (Zjistěte, jak a kdy tyto zprávy ze šablony odebrat) (Zjistěte, jak a kdy odstranit tuto zprávu šablony)
|
v počítačová věda, a databáze kurzor je mechanismus, který umožňuje traverz přes evidence v databázi. Kurzory usnadňují následné zpracování ve spojení s procházením, jako je načítání, přidávání a odebírání záznamů databáze. Díky charakteristice databázového kurzoru pro procházení jsou kurzory podobné konceptu programovacího jazyka iterátor.
Kurzory používají programátoři databáze ke zpracování jednotlivých řádků vrácených databázový systém dotazy. Kurzory umožňují manipulaci s celkem sady výsledků najednou. V tomto scénáři kurzor umožňuje sekvenční zpracování řádků ve výsledkové sadě.
V procedurách SQL umožňuje kurzor definovat sadu výsledků (sadu datových řádků) a provádět komplexní logiku na základě jednotlivých řádků. Použitím stejné mechaniky může procedura SQL také definovat sadu výsledků a vrátit ji přímo volajícímu procedury SQL nebo klientské aplikaci.
Kurzor lze zobrazit jako ukazatel na jeden řádek v sadě řádků. Kurzor může odkazovat pouze na jeden řádek najednou, ale podle potřeby se může přesunout na další řádky sady výsledků.
Používání
Chcete-li použít kurzory v procedurách SQL, musíte provést následující:
- Deklarujte kurzor, který definuje sadu výsledků.
- Otevřete kurzor a vytvořte sadu výsledků.
- Načíst data do lokálních proměnných podle potřeby z kurzoru, jeden řádek po druhém.
- Po dokončení zavřete kurzor.
Chcete-li pracovat s kurzory, musíte použít následující příkazy SQL
Tato část představuje způsoby, jak SQL: 2003 Standard definuje, jak používat kurzory v aplikacích ve vestavěném SQL. Ne všechny vazby aplikací pro systémy relačních databází dodržují tento standard a některé (například CLI nebo JDBC ) použít jiné rozhraní.
Programátor dá kurzor na vědomí DBMS pomocí a PROHLÁSIT
... KURZOR
příkaz a přiřazení kurzoru (povinné) jméno:
PROHLÁSIT cursor_name KURZOR JE VYBRÁN ... OD ...
Předtím, než bude mít kód přístup k datům, musí otevřít kurzor pomocí OTEVŘENO
prohlášení. Přímo po úspěšném otevření je umístěn kurzor před první řádek v sadě výsledků.
OTEVŘENO cursor_name
Aplikace umísťují kurzory na konkrétní řádek ve výsledkové sadě pomocí VYNÉST
prohlášení. Operace načtení přenese data řádku do aplikace.
VYNÉST cursor_name DO ...
Jakmile aplikace zpracuje všechny dostupné řádky nebo má být operace načítání umístěna na neexistující řádek (porovnat rolovací kurzory níže) vrátí systém DBMS SQLSTATE „02000“ (obvykle doplněný znakem SQLCODE +100) k označení konce sady výsledků.
Posledním krokem je zavření kurzoru pomocí ZAVŘÍT
prohlášení:
ZAVŘÍT cursor_name
Po zavření kurzoru jej program může znovu otevřít, což znamená, že DBMS přehodnocuje stejný dotaz nebo jiný dotaz a vytvoří novou sadu výsledků.
Posuvné kurzory
Programátoři mohou deklarovat kurzory jako rolovací nebo ne rolovací. Posouvatelnost označuje směr, kterým se může pohybovat kurzor.
S nelze rolovat (nebo pouze vpřed) kurzor, můžete VYNÉST
každý řádek nejvýše jednou a kurzor se automaticky přesune na další řádek. Po načtení posledního řádku, pokud načtete znovu, umístíte kurzor za poslední řádek a získáte následující kód: SQLSTATE 02000 (SQLCODE +100).
Program může umístit a rolovací kurzor kdekoli v sadě výsledků pomocí VYNÉST
Příkaz SQL. Při deklaraci kurzoru musí být zadáno klíčové slovo SCROLL. Výchozí hodnota je ŽÁDNÝ SCROLL
, ačkoli různé jazykové vazby, jako je JDBC, mohou použít jiné výchozí nastavení.
PROHLÁSIT cursor_name citlivost SVITEK KURZOR PRO VÝBĚR ... OD ...
Cílovou pozici pro rolovatelný kurzor lze zadat relativně (od aktuální pozice kurzoru) nebo absolutně (od začátku sady výsledků).
NAČÍST [DALŠÍ | PŘEDCHOZÍ | PRVNÍ | POSLEDNÍ] OD cursor_name
FETCH ABSOLUTE n Z cursor_name
NAČÍTAT RELATIVNÍ n Z cursor_name;
Posuvné kurzory mohou potenciálně přistupovat ke stejnému řádku v sadě výsledků několikrát. Úpravy dat (operace vložení, aktualizace, odstranění) z jiných transakcí by tedy mohly ovlivnit sadu výsledků. Kurzor může být SITITIVNÍ nebo INSENSITIVNÍ k těmto úpravám dat. Citlivý kurzor zachytí úpravy dat ovlivňující sadu výsledků kurzoru a necitlivý kurzor nikoli. Navíc může být kurzor INSENSITIVE, v takovém případě se DBMS pokusí co nejvíce použít citlivost.
„S PODRŽENÍM“
Kurzory se obvykle uzavírají automaticky na konci transakce, tj. Když dojde k COMMIT nebo ROLLBACK (nebo implicitnímu ukončení transakce). Toto chování lze změnit, pokud je kurzor deklarován pomocí klauzule WITH HOLD (výchozí hodnota je BEZ HOLD). Uchopitelný kurzor je udržován otevřený přes COMMIT a zavřený při ROLLBACK. (Některé DBMS se odchylují od tohoto standardního chování a také udržují otevřené kurzory otevřené přes ROLLBACK.)
PROHLÁSIT cursor_name KURZOR S PODRŽENÍM PRO VÝBĚR .... Z ....
Když nastane POVINNOST, umístí se podržitelný kurzor před další řádek. Tak, umístěný AKTUALIZACE nebo umístěna VYMAZAT příkaz bude úspěšný až poté, co v transakci dojde k první operaci FETCH.
Všimněte si, že JDBC definuje kurzory jako výchozí ve výchozím nastavení. To se děje proto, že JDBC ve výchozím nastavení také aktivuje automatické potvrzení.
Umístěné příkazy aktualizace / mazání
Kurzory lze použít nejen k načtení dat z DBMS do aplikace, ale také k identifikaci řádku v tabulce, která má být aktualizována nebo odstraněna. Standard SQL: 2003 pro tento účel definuje poziční aktualizaci a poziční mazání příkazů SQL. Taková prohlášení nepoužívají běžnou KDE klauzule s predikáty. Místo toho řádek identifikuje kurzor. Kurzor musí být otevřen a již umístěn na řádku pomocí VYNÉST
prohlášení.
AKTUALIZACE název_tabulky SET ... KDE AKTUÁL cursor_name
ODSTRANIT Z název_tabulky KDE AKTUÁL cursor_name
Kurzor musí pracovat s aktualizovatelnou sadou výsledků, aby bylo možné úspěšně provést příkaz umístěné aktualizace nebo odstranění. Jinak by DBMS nevěděl, jak aplikovat změny dat na podkladové tabulky uvedené v kurzoru.
Kurzory v distribuovaných transakcích
Používání kurzorů v distribuovaných transakcích (X / Otevřít XA Prostředí), které jsou řízeny pomocí monitoru transakcí, se neliší od kurzorů v nedistribuovaných transakcích.
Při používání je třeba věnovat pozornost držitelný kurzory, nicméně. Připojení mohou používat různé aplikace. Jakmile je tedy transakce ukončena a potvrzena, následná transakce (spuštěná v jiné aplikaci) by mohla zdědit stávající zadržitelné kurzory. Proto si vývojář aplikace musí být této situace vědom.
Kurzory v XQuery
The XQuery jazyk umožňuje vytvářet kurzory pomocí subsekvence() funkce.
Formát je:
nechat $zobrazená sekvence := subsekvence($výsledek, $Start, $počet položek)
Kde $výsledek je výsledkem počátečního XQuery, $ start je číslo položky ke spuštění a $ item-count je počet položek k vrácení.
Ekvivalentně to lze provést také pomocí predikátu:
nechat $zobrazená sekvence := $výsledek[$Start na $konec]
Kde $ konec
je koncová posloupnost.
Úplné příklady viz XQuery / Vyhledávání, stránkování a třídění # stránkování na Wikibooks.
Nevýhody kurzorů
Následující informace se mohou lišit v závislosti na konkrétním databázovém systému.
Načtení řádku z kurzoru může mít za následek a zpáteční síť pokaždé. To využívá mnohem větší šířku pásma sítě, než by bylo obvykle potřeba pro provedení jediného příkazu SQL, jako je DELETE. Opakované zpáteční lety v síti mohou pomocí kurzoru výrazně snížit rychlost operace. Některé DBMS se snaží tento efekt snížit pomocí načítání bloku. Načtení bloku znamená, že se ze serveru klientovi odesílá společně více řádků. Klient uloží celý blok řádků do místní vyrovnávací paměti a odtud načte řádky, dokud není vyčerpána.
Kurzory přidělit zdroje na serveru, například zámky, balíčky, procesy a dočasné úložiště. Například, Microsoft SQL Server implementuje kurzory vytvořením dočasné tabulky a jejím naplněním sadou výsledků dotazu. Pokud není kurzor správně uzavřen (uvolněno), prostředky nebudou uvolněny, dokud nebude uzavřena samotná relace SQL (připojení). Toto plýtvání prostředky na serveru může vést ke snížení výkonu a selhání.
Příklad
TABULKA ZAMĚSTNANCŮ
SQL> popis EMPLOYEES_DETAILS; Jméno Null? Typ ----------------------------------------- -------- -------------------- EMPLOYEE_ID NOT NULL NUMBER (6) FIRST_NAME VARCHAR2 (20) LAST_NAME NENÍ NULL VARCHAR2 (25) E-MAIL NENÍ NULL VARCHAR2 (30) PHONE_NUMBER VARCHAR2 (20) HIRE_DATE NE NULL DATE JOB_ID NENÍ NULL VARCHAR2 (10) PLATOVÉ ČÍSLO (8,2) ČÍSLO KOMISE_PCT (2,2) MANAGER_ID ČÍSLO (6) DEPARTMENT_ID ČÍSLO (4)
VZOREK KURZOR ZNÁMÝ TAK JAKO EEVYTVOŘIT NEBO NAHRADIT POSTUP EE TAK JAKOZAČÍTPROHLÁSIT v_employeeID EMPLOYEES_DETAILS.EMPLOYEE_ID%TYP; v_FirstName EMPLOYEES_DETAILS.JMÉNO%TYP; v_LASTName EMPLOYEES_DETAILS.PŘÍJMENÍ%TYP; v_JOB_ID EMPLOYEES_DETAILS.JOB_ID%TYP:= 'IT_PROG';Kurzor c_EMPLOYEES_DETAILS JE VYBRAT EMPLOYEE_ID, JMÉNO, PŘÍJMENÍ Z EMPLOYEES_DETAILS KDE JOB_ID ='v_JOB_ID';ZAČÍT OTEVŘENO c_EMPLOYEES_DETAILS; SMYČKA VYNÉST c_EMPLOYEES_DETAILS DO v_employeeID,v_FirstName,v_LASTName; DBMS_OUTPUT.put_line(v_employeeID); DBMS_OUTPUT.put_line(v_FirstName); DBMS_OUTPUT.put_line(v_LASTName); VÝSTUP KDYŽ c_EMPLOYEES_DETAILS%NENALEZENO; KONEC SMYČKA; ZAVŘÍT c_EMPLOYEES_DETAILS;KONEC;KONEC;
Viz také
Reference
- Christopher J. Date: Hloubka databázeO'Reilly & Associates, ISBN 0-596-10012-4
- Thomas M. Connolly, Carolyn E. Begg: Databázové systémy, Addison-Wesley, ISBN 0-321-21025-5
- Ramiz Elmasri, Shamkant B. Navathe: Základy databázových systémů, Addison-Wesley, ISBN 0-201-54263-3
- Neil Matthew, Richard Stones: Počáteční databáze s PostgreSQL: od nováčka po profesionála, Apress, ISBN 1-59059-478-9
- Thomas Kyte: Expert jeden na jednoho: Oracle, Apress, ISBN 1-59059-525-4
- Kevin Loney: Oracle Database 10g: Kompletní reference, Oracle Press, ISBN 0-07-225351-7