Uložené procedúry v T-SQL - vytváranie, úprava, mazanie. Ako správne písať uložené procedúry v SQL Server Uložené procedúry v databáze

Uložené procedúry v T-SQL - vytváranie, úprava, mazanie.  Ako správne písať uložené procedúry v SQL Server Uložené procedúry v databáze
Uložené procedúry v T-SQL - vytváranie, úprava, mazanie. Ako správne písať uložené procedúry v SQL Server Uložené procedúry v databáze

Vyhlásenie o postupe

VYTVORIŤ POSTUP [({IN|OUT|INOUT} [,…])]
[SADA DYNAMICKÝCH VÝSLEDKOV ]
ZAČAŤ [ATOMIC]

KONIEC

Kľúčové slová
. IN (Input) – vstupný parameter
. OUT (Output) – výstupný parameter
. INOUT – vstup a výstup, ako aj pole (bez parametrov)
. DYNAMIC RESULT SET označuje, že procedúra môže otvoriť určený počet kurzorov, ktoré zostanú otvorené po návrate procedúry

Poznámky
Neodporúča sa používať veľa parametrov v uložených procedúrach (predovšetkým veľké čísla a reťazce znakov) kvôli preťaženiu siete a zásobníka. V praxi sa existujúce dialekty Transact-SQL, PL/SQL a Informix výrazne odlišujú od štandardu, a to ako v deklarácii a používaní parametrov, deklarácií premenných, tak aj vo volaní podprogramov. Spoločnosť Microsoft odporúča použiť nasledujúcu aproximáciu na odhad veľkosti vyrovnávacej pamäte uloženej procedúry:
=(maximálny počet súbežných používateľov)*(veľkosť najväčšieho plánu realizácie)*1,25. Určenie veľkosti vykonávacieho plánu na stránkach je možné vykonať pomocou príkazu: DBCC MEMUSAGE.

Vyvolanie procedúry

V mnohých existujúcich DBMS sa uložené procedúry volajú pomocou operátora:

VYKONAŤ POSTUP [(][)]

Poznámka: Volania uložených procedúr možno uskutočniť z aplikácie, inej uloženej procedúry alebo interaktívne.

Príklad vyhlásenia o postupe

VYTVORIŤ POSTUP Proc1 AS //deklarovať postup
DECLARE Cur1 CURSOR FOR SELECT SName, City FROM SalesPeople WHERE Rating>200 //deklarujte kurzor
OPEN Cur1 //otvorenie kurzora
FETCH NEXT FROM Cur1 //prečítanie údajov z kurzora
WHILE @@Fetch_Status=0
ZAČAŤ
NAČÍTAJTE ĎALEJ Z Cur1
KONIEC
CLOSE Cur1 //zatvorenie kurzora
DEALOCATE Cur1
EXECUTE Proc1 //spustite procedúru

Polymorfizmus
Dva podprogramy s rovnakým názvom môžu byť vytvorené v rovnakej schéme, ak sú parametre týchto dvoch podprogramov navzájom dostatočne odlišné, aby sa dali rozlíšiť. Na rozlíšenie medzi dvoma rutinami s rovnakým názvom v rovnakej schéme je každej pridelený alternatívny a jedinečný názov (špecifický názov). Takýto názov môže byť explicitne špecifikovaný pri definovaní podprogramu. Pri volaní podprogramov s niekoľkými rovnakými názvami sa určenie požadovaného podprogramu vykonáva v niekoľkých krokoch:
. Na začiatku sú definované všetky procedúry so zadaným názvom a ak neexistujú žiadne, tak všetky funkcie s daným názvom.
. Pre ďalšiu analýzu sa zachovajú len tie podprogramy, pre ktoré má užívateľ privilégium EXECUTE.
. Pre nich sa vyberú tie, ktorých počet parametrov zodpovedá počtu volacích argumentov. Kontrolujú sa špecifikované dátové typy parametrov a ich polohy.
. Ak zostáva viac ako jeden podprogram, vyberie sa ten, ktorého kvalifikačný názov je kratší.
V praxi je v Oracle polymorfizmus podporovaný pre funkcie deklarované iba v balíku, DB@ - v rôznych schémach a v Sybase a MS SQL Server je preťaženie zakázané.

Odstránenie a zmena postupov
Ak chcete odstrániť postup, použite operátor:

Ak chcete zmeniť postup, použite operátor:

ZMENIŤ POSTUP [([{IN|OUT|INOUT}])]
ZAČAŤ [ATOMIC]

KONIEC

Oprávnenia vykonávať procedúry

GRANT VYKONAŤ TO |VEREJNOSŤ [S MOŽNOSŤOU GRANTU]

Systémové postupy
Mnohé DBMS (vrátane servera SQL Server) majú určitú sadu vstavaných systémových uložených procedúr, ktoré môžete použiť na svoje vlastné účely.

uložená procedúra je možné len vtedy, ak sa vykonáva v kontexte databázy, v ktorej sa postup nachádza.

Typy uložených procedúr

SQL Server má niekoľko typov uložené procedúry.

  • Systém uložené procedúry určené na vykonávanie rôznych administratívnych úkonov. Takmer všetky činnosti správy servera sa vykonávajú s ich pomocou. Dá sa povedať, že systémové uložené procedúry sú rozhranie, ktoré poskytuje prácu so systémovými tabuľkami, čo v konečnom dôsledku spočíva v zmene, pridávaní, odstraňovaní a získavaní údajov zo systémových tabuliek používateľských aj systémových databáz. Systém uložené procedúry majú predponu sp_, sú uložené v systémovej databáze a možno ich volať v kontexte akejkoľvek inej databázy.
  • Vlastné uložené procedúry vykonávať určité akcie. Uložené procedúry– plnohodnotný databázový objekt. V dôsledku toho každý uložená procedúra sa nachádza v špecifickej databáze, kde sa vykonáva.
  • Dočasné uložené procedúry existujú iba chvíľu, potom ich server automaticky zničí. Delia sa na lokálne a globálne. Miestne dočasné uložené procedúry možno volať len zo spojenia, v ktorom boli vytvorené. Pri vytváraní takejto procedúry jej musíte dať názov, ktorý začína jedným znakom #. Ako všetky dočasné predmety, uložené procedúry tohto typu sa automaticky vymažú, keď sa používateľ odpojí alebo sa server reštartuje alebo zastaví. Globálne dočasné uložené procedúry sú dostupné pre všetky pripojenia zo servera, ktorý má rovnaký postup. Ak ho chcete definovať, stačí mu dať názov začínajúci znakmi ## . Tieto procedúry sa vymažú, keď sa server reštartuje alebo zastaví, alebo keď sa zatvorí pripojenie v kontexte, v ktorom boli vytvorené.

Vytvárajte, upravujte a odstraňovajte uložené procedúry

Tvorba uložená procedúra zahŕňa riešenie nasledujúcich problémov:

  • určenie typu vytvoreného uložená procedúra: dočasné alebo zvykové. Okrem toho si môžete vytvoriť svoj vlastný systém uložená procedúra, pričom mu dáte názov s predponou sp_ a umiestnite ho do systémovej databázy. Tento postup bude dostupný v kontexte akejkoľvek databázy lokálneho servera;
  • plánovanie prístupových práv. Pri tvorbe uložená procedúra treba brať do úvahy, že bude mať rovnaké prístupové práva k databázovým objektom ako používateľ, ktorý ho vytvoril;
  • definícia parametre uloženej procedúry. Podobne ako postupy zahrnuté vo väčšine programovacích jazykov, uložené procedúry môže mať vstupné a výstupné parametre;
  • vývoj kódu uložená procedúra. Kód procedúry môže obsahovať sekvenciu ľubovoľných príkazov SQL vrátane volaní iných uložené procedúry.

Vytvorenie nového a zmena existujúceho uložená procedúra vykonať pomocou nasledujúceho príkazu:

<определение_процедуры>::= (CREATE | ALTER ) procedure_name [;number] [(@parameter_name data_type ) [=predvolene] ][,...n] AS sql_operator [...n]

Pozrime sa na parametre tohto príkazu.

Pomocou predpôn sp_ ​​, # , ## môže byť vytvorená procedúra definovaná ako systémová alebo dočasná. Ako je zrejmé zo syntaxe príkazu, nie je dovolené zadať meno vlastníka, ktorý bude vlastniť vytvorenú procedúru, ako aj názov databázy, kde sa má nachádzať. Aby sa teda umiestnilo vytvorené uložená procedúra v konkrétnej databáze musíte zadať príkaz CREATE PROCEDURE v kontexte tejto databázy. Pri odbočovaní od tela uložená procedúra skrátené názvy možno použiť pre objekty tej istej databázy, t.j. bez zadania názvu databázy. Keď potrebujete získať prístup k objektom umiestneným v iných databázach, zadanie názvu databázy je povinné.

Číslo v názve je identifikačné číslo uložená procedúra, ktorý ho jednoznačne identifikuje v skupine postupov. Pre uľahčenie riadenia sú postupy logicky rovnakého typu uložené procedúry môžu byť zoskupené tak, že im dáte rovnaký názov, ale rôzne identifikačné čísla.

Na prenos vstupných a výstupných údajov vo vytvorenom uložená procedúra môžu byť použité parametre, ktorých názvy, podobne ako názvy lokálnych premenných, musia začínať symbolom @. Jeden uložená procedúra Môžete zadať viacero parametrov oddelených čiarkami. Telo procedúry by nemalo používať lokálne premenné, ktorých názvy sa zhodujú s názvami parametrov tejto procedúry.

Na určenie typu údajov, ktoré zodpovedajú parameter uloženej procedúry, vhodné sú akékoľvek dátové typy SQL, vrátane užívateľsky definovaných. Dátový typ CURSOR je však možné použiť len ako výstupný parameter uložená procedúra, t.j. zadaním kľúčového slova OUTPUT.

Prítomnosť kľúčového slova OUTPUT znamená, že príslušný parameter je určený na vrátenie údajov z uložená procedúra. To však neznamená, že parameter nie je vhodný na odovzdávanie hodnôt uložená procedúra. Zadanie kľúčového slova OUTPUT dáva serveru pokyn na ukončenie uložená procedúra priraďte aktuálnu hodnotu parametra lokálnej premennej, ktorá bola zadaná pri volaní procedúry ako hodnota parametra. Všimnite si, že pri zadávaní kľúčového slova OUTPUT je možné hodnotu zodpovedajúceho parametra pri volaní procedúry nastaviť len pomocou lokálnej premennej. Akékoľvek výrazy alebo konštanty, ktoré sú povolené pre regulárne parametre, nie sú povolené.

Kľúčové slovo VARYING sa používa v spojení s

Uložené procedúry

Predmetom tejto kapitoly je jeden z najvýkonnejších nástrojov ponúkaných vývojárom databázových aplikácií InterBase na implementáciu obchodnej logiky Uložené procedúry (anglické, stoied proceduies) umožňujú implementovať významnú časť aplikačnej logiky na úrovni databázy a tým zvýšiť. výkon celej aplikácie, centralizovať spracovanie dát a znížiť množstvo kódu potrebného na dokončenie zadaných úloh Takmer žiadna pomerne zložitá databázová aplikácia sa nezaobíde bez použitia uložených procedúr.
Okrem týchto dobre známych výhod používania uložených procedúr, spoločných pre väčšinu relačných DBMS, môžu uložené procedúry InterBase fungovať ako takmer úplné súbory údajov, čo umožňuje, aby sa výsledky, ktoré vracajú, použili v bežných SQL dotazoch.
Začiatočníci si často predstavujú uložené procedúry jednoducho ako množinu špecifických SQL dotazov, ktoré robia niečo v databáze, a existuje názor, že práca s uloženými procedúrami je oveľa ťažšia ako implementácia rovnakej funkcionality v klientskej aplikácii vo vysoko- jazyk na úrovni
Čo sú teda uložené procedúry v InterBase?
Uložená procedúra (SP) je súčasťou databázových metadát, čo je podprogram zostavený do internej reprezentácie InterBase, napísaný v špeciálnom jazyku, ktorého kompilátor je zabudovaný do jadra servera InteiBase.
Uloženú procedúru možno volať z klientskych aplikácií, zo spúšťačov az iných uložených procedúr. Uložená procedúra beží v rámci serverového procesu a môže manipulovať s údajmi v databáze, ako aj vracať výsledky svojho vykonania klientovi, ktorý ju zavolal (t. j. spúšťač, HP, aplikácia)
Základom výkonných schopností vlastných HP je procedurálny programovací jazyk, ktorý zahŕňa ako modifikované príkazy bežného SQL, ako INSERT, UPDATE a SELECT, tak aj nástroje na organizáciu vetiev a slučiek (IF, WHILE), ako aj nástroje na riešenie chýb a výnimočné situácie Jazyk uložených procedúr umožňuje implementovať zložité algoritmy na prácu s údajmi a vzhľadom na zameranie na prácu s relačnými údajmi je HP oveľa kompaktnejšie ako podobné postupy v tradičných jazykoch.
Treba poznamenať, že pre spúšťače sa používa rovnaký programovací jazyk, s výnimkou množstva funkcií a obmedzení. Rozdiely medzi podmnožinou jazyka používaného v spúšťačoch a jazykom HP sú podrobne diskutované v kapitole „Spúšťače“ (časť 1).

Príklad jednoduchej uloženej procedúry

Je čas vytvoriť svoju prvú uloženú procedúru a použiť ju ako príklad, aby ste sa naučili proces vytvárania uložených procedúr. Najprv by sme si však mali povedať pár slov o tom, ako pracovať s uloženými procedúrami. Faktom je, že HP vďačí za svoju povesť nejasného a nepohodlného nástroja extrémne slabým štandardným nástrojom na vývoj a ladenie uložených procedúr. Dokumentácia InterBase odporúča vytvárať procedúry pomocou súborov SQL skriptov obsahujúcich HP text, ktoré sú dodávané ako vstup pre interpreta isql, a teda vytvárať a upravovať HP If v tomto SQL skripte, vo fáze zostavovania textu procedúry v BLR (o BLR, pozri kapitolu "Štruktúra databázy InterBase" (časť 4)), ak sa vyskytne chyba, isql zobrazí správu o tom, na ktorom riadku súboru skriptu SQL sa táto chyba vyskytla. Opravte chybu a urobte to znova. Vôbec sa nehovorí o ladení v modernom zmysle slova, t. j. o sledovaní vykonávania s možnosťou zobraziť medzihodnoty premenných. Je zrejmé, že tento prístup neprispieva k rastu atraktivity uložených procedúr v očiach vývojára
Okrem štandardného minimalistického prístupu k vývoju HP<_\ществ\ют также инструменты сторонних разработчиков, которые делают работу с хранимыми процедурами весьма удобной Большинство универсальных продуктов для работы с InterBase, перечисленных в приложении "Инструменты администратора и разработчика InterBase", предоставляют удобный инструментарий для работы с ХП. Мы рекомендуем обязательно воспользоваться одним из этих инструментов для работы с хранимыми процедурами и изложение материала будем вести в предположении, что у вас имеется удобный GUI-инструмент, избавляющий от написания традиционных SQL-скриптов
Syntax uložených procedúr je opísaná takto:

Názov postupu VYTVORENIA
[ (param datatype [, param datatype ...]) ]
)]
AS
;
< procedure_body> = []
< block>
< vanable_declaration_list> =
DECLARE VARIABLE var datatype;

=
ZAČAŤ
< compound_statement>
[< compound_statement> ...]
KONIEC
< compound_statement> = (vyhlásenie ;)

Vyzerá dosť objemne a možno aj ťažkopádne, no v skutočnosti je všetko veľmi jednoduché, aby sme si postupne osvojili syntax, pozrime sa na postupne zložitejšie príklady.
Tu je príklad veľmi jednoduchej uloženej procedúry, ktorá berie ako vstup dve čísla, pridáva ich a vracia výsledok:

CREATE PROCEDURE SP_Add(first_arg DOUBLE PRECISION,
second_arg DVOJNÁSOBNÁ PRESNOSŤ)
VRÁTENIE (výsledok DVOJNÁSOBNÁ PRESNOSŤ)
AS
ZAČAŤ
Vysledok=prvy_argument+druhy_argument;
ZASTAVIŤ;
KONIEC

Ako vidíte, všetko je jednoduché: po príkaze CREATE PROCEDURE je uvedený názov novovytvorenej procedúry (ktorý musí byť jedinečný v rámci databázy) - v tomto prípade SP_Add, potom sú vstupné parametre HP - first_arg a second_arg - uvedené v zátvorkách oddelené čiarkami s uvedením ich typu.
Zoznam vstupných parametrov je voliteľnou súčasťou príkazu CREATE PROCEDURE - sú prípady, keď procedúra dostane všetky dáta pre svoju prácu prostredníctvom dotazov do tabuliek v tele procedúry.

Uložené procedúry používajú akékoľvek skalárne dátové typy InteiBase Neumožňuje použitie polí a užívateľom definovaných typov - domén

Nasleduje kľúčové slovo RETURNS, za ktorým sú vrátené parametre uvedené v zátvorkách s uvedením ich typov – v tomto prípade iba jedného – Result.
Ak by procedúra nemala vrátiť parametre, potom chýba slovo RETURNS a zoznam vrátených parametrov.
Po RETURNSQ je špecifikované kľúčové slovo AS. Pred prejdením kľúčového slova AS titul, a potom - techo postupy.
Telo uloženej procedúry je zoznam popisov jej interných (lokálnych) premenných (ak existujú, podrobnejšie sa na ne pozrieme nižšie), oddelených bodkočiarkou (;) a blokom príkazov uzavretým v zátvorkách operátora ZAČIATOK KONIEC. V tomto prípade je telo HP veľmi jednoduché - požiadame o pridanie dvoch vstupných argumentov a ich výsledok priradíme výstupnému a potom zavoláme príkaz SUSPEND. O niečo neskôr vysvetlíme podstatu činnosti tohto príkazu, ale zatiaľ si všimneme, že je potrebné preniesť návratové parametre tam, odkiaľ bola uložená procedúra volaná.

Oddeľovače v uložených procedúrach

Všimnite si, že príkaz v rámci procedúry končí bodkočiarkou (;). Ako viete, bodkočiarka je štandardný oddeľovač príkazov v SQL - je to signál pre interpreta SQL, že text príkazu bol zadaný celý a mal by ho začať spracovávať. Nedopadlo by to tak, že ak SQL interpret nájde v strede HP bodkočiarku, bude predpokladať, že príkaz bol zadaný celý a pokúsi sa vykonať časť uloženej procedúry? Tento predpoklad nie je bezvýznamný. V skutočnosti, ak vytvoríte súbor, do ktorého napíšete vyššie uvedený príklad, pridáte príkaz na pripojenie z databázy a pokúsite sa spustiť tento SQL skript pomocou tlmočníka isql, vráti sa chyba v dôsledku neočakávaného, ​​podľa tlmočníka, ukončenia príkazu na vytvorenie uloženej procedúry. Ak vytvárate uložené procedúry pomocou súborov skriptov SQL bez použitia špecializovaných vývojárskych nástrojov InterBase, potom pred každým príkazom na vytvorenie HP (to isté platí pre spúšťače) musíte zmeniť oddeľovač príkazov skriptu na iný znak iný ako bodkočiarku a za textom HP obnoviť ho späť. Príkaz isql, ktorý mení oddeľovač klauzuly SQL, vyzerá takto:

SET TERM

Pre typický prípad vytvorenia uloženej procedúry to vyzerá takto:

SET TERM^;
VYTVORIŤ POSTUP nejaký_postup
... . .
KONIEC
^
NASTAVENÝ TERMÍN ;^

Vyvolanie uloženej procedúry

Ale vráťme sa k našej uloženej procedúre. Teraz, keď bol vytvorený, musíte ho nejako zavolať, odovzdať mu parametre a vrátiť výsledky. Je to veľmi jednoduché - stačí napísať dotaz SQL takto:

VYBRAŤ *
FROM Sp_add(181,35, 23,09)

Tento dotaz nám vráti jeden riadok obsahujúci práve jedno pole Výsledok, ktorý bude obsahovať súčet čísel 181,35 a 23,09, teda 204,44.
Náš postup je teda možné použiť v bežných SQL dotazoch vykonávaných ako v klientskych programoch, tak aj v iných HP alebo spúšťačoch. Toto použitie našej procedúry je možné pomocou príkazu SUSPEND na konci uloženej procedúry.
Faktom je, že v InterBase (a vo všetkých jeho klonoch) existujú dva typy uložených procedúr: voliteľné procedúry a spustiteľné procedúry. Rozdiel vo fungovaní týchto dvoch typov HP je v tom, že procedúry vzorkovania zvyčajne vracajú veľa súborov výstupných parametrov, zoskupených po riadkoch, ktoré vyzerajú ako súbor údajov, zatiaľ čo spustiteľné procedúry buď nemôžu vrátiť parametre vôbec, alebo vrátiť iba jedna sada výstupných parametrov, uvedená v Returns, kde jeden riadok parametrov. Procedúry Select sa volajú v dotazoch SELECT a spustiteľné procedúry sa volajú pomocou príkazu EXECUTE PROCEDURE.
Oba typy uložených procedúr majú rovnakú syntax vytvárania a formálne sa nelíšia, takže v dotaze SELECT možno volať ľubovoľnú spustiteľnú procedúru a pomocou EXECUTE PROCEDURE možno volať ľubovoľnú výberovú procedúru. Otázkou je, ako sa bude HP správať pri rôznych typoch hovorov. Inými slovami, rozdiel spočíva v navrhovaní postupu pre konkrétny typ hovoru. To znamená, že procedúra select je špecificky vytvorená na volanie z dotazu SELECT a spustiteľná procedúra je špecificky vytvorená na volanie pomocou EXECUTE PROCEDURE. Pozrime sa, aké sú rozdiely v dizajne týchto dvoch typov HP.
Aby ste pochopili, ako postup odberu vzoriek funguje, budete sa musieť ponoriť trochu hlbšie do teórie. Predstavme si bežný SQL dotaz ako SELECT ID, NAME FROM Table_example. V dôsledku jej vykonania dostaneme tabuľku pozostávajúcu z dvoch stĺpcov (ID a NAME) a ​​určitého počtu riadkov (rovnajúceho sa počtu riadkov v tabuľke Table_example). Tabuľka vrátená ako výsledok tohto dotazu sa tiež nazýva množina údajov SQL Zamyslime sa nad tým, ako sa množina údajov vytvára počas vykonávania tohto dotazu, server po prijatí dotazu určí, na ktoré tabuľky sa vzťahuje, a potom ich nájde zistiť, ktorá podmnožina záznamov z týchto tabuliek musí byť zahrnutá do výsledku dotazu. Ďalej server načíta každý záznam, ktorý vyhovuje výsledkom dotazu, vyberie z neho požadované polia (v našom prípade ID a NAME) a ​​odošle ich klientovi. Potom sa proces znova opakuje - a tak ďalej pre každý vybraný záznam.
Celá táto odbočka je potrebná, aby milý čitateľ pochopil, že všetky množiny údajov SQL sa generujú riadok po riadku, vrátane uložených procedúr! A hlavný rozdiel medzi procedúrami načítania a spustiteľnými procedúrami je v tom, že prvé sú navrhnuté tak, aby vrátili veľa riadkov, zatiaľ čo druhé sú navrhnuté tak, aby vrátili iba jeden. Preto sa používajú inak: procedúra select sa volá pomocou príkazu SELECT, ktorý „vyžaduje“, aby sa procedúra vzdala všetkých záznamov, ktoré môže vrátiť. Spustiteľný postup sa volá pomocou EXECUTE PROCEDURE, ktorý „vyberie“ iba jeden riadok z HP a ostatné ignoruje (aj keď existujú!).
Pozrime sa na príklad postupu vzorkovania, aby to bolo jasnejšie. Pre > odpustenie, vytvorme uloženú procedúru, ktorá funguje presne ako dotaz SELECT ID, NAME FROM Table_Example, to znamená, že jednoducho vyberie polia ID a NAME z celej tabuľky. Tu je tento príklad:

POSTUP VYTVORENIA Simple_Select_SP
VRÁTENIE SA (
procID INTEGER,
procNAME VARCHAR(80))
AS
ZAČAŤ
PRE
SELECT ID, NAME FROM table_example
INTO:procID, :procNAME
DO
ZAČAŤ
ZASTAVIŤ;
KONIEC
KONIEC

Pozrime sa na kroky tohto postupu s názvom Simple_Select_SP. Ako vidíte, nemá žiadne vstupné parametre a má dva výstupné parametre – ID a NAME. Najzaujímavejšia vec sa samozrejme skrýva v tele procedúry. Tu sa používa konštrukcia FOR SELECT:

PRE
SELECT ID, NAME FROM table_example
INTO:procID, :procNAME
DO
ZAČAŤ

/*urobte niečo s premennými procID a procName*/

KONIEC

Tento kúsok kódu znamená nasledovné: pre každý riadok vybraný z tabuľky Table_example vložte vybrané hodnoty do premenných procID a procName a potom s týmito premennými niečo urobte.
Môžete urobiť prekvapený výraz a opýtať sa: "Premenné? Aké ďalšie premenné? 9" Je akýmsi prekvapením tejto kapitoly, že môžeme použiť premenné v uložených procedúrach. V jazyku HP môžete deklarovať svoje vlastné lokálne premenné v rámci procedúry a použiť vstupné a výstupné parametre ako premenné.
Ak chcete deklarovať lokálnu premennú v uloženej procedúre, musíte jej popis umiestniť za kľúčové slovo AS a pred prvé slovo BEGIN Popis lokálnej premennej vyzerá takto:

VYHLÁSIŤ PREMENNÚ ;

Napríklad, ak chcete deklarovať celočíselnú lokálnu premennú Mylnt, medzi AS a BEGIN by ste vložili nasledujúcu deklaráciu

DECLARE VARIABLE Mylnt INTEGER;

Premenné v našom príklade začínajú dvojbodkou. Je to spôsobené tým, že sa k nim pristupuje v rámci príkazu FOR SELECT SQL, takže na rozlíšenie medzi poľami v tabuľkách, ktoré sa používajú v SELECTe, a premennými musí pred premennými predchádzať dvojbodka. Koniec koncov, premenné môžu mať presne rovnaký názov ako polia v tabuľkách!
Dvojbodka pred názvom premennej by sa však mala používať iba v rámci dotazov SQL. Mimo textov sa premenná označuje bez dvojbodky, napríklad:

procName="Niektoré meno";

Ale vráťme sa k telu nášho postupu. Klauzula FOR SELECT vracia údaje nie vo forme tabuľky – množiny údajov, ale po jednom riadku. Každé vrátené pole musí byť umiestnené vo svojej vlastnej premennej: ID => procID, NAME => procName. V časti DO sú tieto premenné odoslané klientovi, ktorý volal procedúru pomocou príkazu SUSPEND
Príkaz FOR SELECT...DO teda prechádza cez záznamy vybrané v časti SELECT príkazu. V tele slučky tvorenej časťou DO sa nasledujúci vygenerovaný záznam prenesie na klienta pomocou príkazu SUSPEND.
Procedúra výberu je teda navrhnutá tak, aby vrátila jeden alebo viac riadkov, pre ktoré je v tele HP organizovaná slučka, ktorá vypĺňa výsledné premenné parametre. A na konci tela tohto cyklu je vždy príkaz SUSPEND, ktorý vráti klientovi ďalší riadok údajov.

Slučky a príkazy vetvy

Okrem príkazu FOR SELECT...DO, ktorý organizuje slučku cez záznamy výberu, existuje ďalší typ slučky - WHILE...DO, ktorý umožňuje organizovať slučku na základe kontroly akýchkoľvek podmienok. Tu je príklad HP pomocou slučky WHILE..DO. Tento postup vráti druhé mocniny celých čísel od 0 do 99:

VYTVORTE PROCEDJRE QUAD
NÁVRATKY (QUADRAT INTEGER)
AS
DECLARE PREMENNÁ I CELÉ ČÍSLO;
ZAČAŤ
I = 1;
Kým<100) DO
ZAČAŤ
QUADRAT= I*I;
I = 1+1;
ZASTAVIŤ;
KONIEC
KONIEC

V dôsledku vykonania dopytu SELECT FROM QUAD dostaneme tabuľku obsahujúcu jeden stĺpec QUADRAT, ktorý bude obsahovať druhé mocniny celých čísel od 1 do 99
Jazyk uloženej procedúry okrem iterovania výsledkov vzorky SQL a klasickej slučky využíva operátor IF...THEN..ELSE, ktorý umožňuje organizovať vetvenie v závislosti od vykonania akýchkoľvek podmienok. Jeho syntax je podobná pre väčšinu operátorov vetvenia vo vysokoúrovňových programovacích jazykoch, ako sú Pascal a C.
Pozrime sa na zložitejší príklad uloženej procedúry, ktorá robí nasledovné.

  1. Vypočíta priemernú cenu v tabuľke Table_example (pozri kapitolu "Primárne kľúče a generátory tabuliek")
  2. Ďalej pre každý záznam v tabuľke vykoná nasledujúcu kontrolu: ak je existujúca cena (PRICE) vyššia ako priemerná cena, potom nastaví cenu rovnajúcu sa priemernej cene plus stanovené pevné percento.
  3. Ak je existujúca cena nižšia alebo rovná priemernej cene, potom sa nastaví cena rovnajúca sa predchádzajúcej cene plus polovica rozdielu medzi predchádzajúcou a priemernou cenou.
  4. Vráti všetky upravené riadky v tabuľke.

Najprv si definujme názov HP, ako aj vstupné a výstupné parametre To všetko je napísané v hlavičke uloženej procedúry.

VYTVORIŤ POSTUP Zvýšiť ceny (
Percento2lnzvýšenie DVOJNÁSOBNEJ PRESNOSŤ)
VRÁTENIE (INTEGER INTEGER, NAME VARCHAR(SO), new_price DOUBLE
PRESNOSŤ AKO

Procedúra sa bude volať ZvýšiťCeny, má jeden vstupný parameter Peiceni21nciease typu DOUBLE PRECISION a 3 výstupné parametre - ID, NAME a new_pnce. Všimnite si, že prvé dva výstupné parametre majú rovnaké názvy ako polia v tabuľke Table_example, s ktorou budeme pracovať. Umožňujú to pravidlá jazyka uložených procedúr.
Teraz musíme deklarovať lokálnu premennú, ktorá sa použije na uloženie priemernej hodnoty.

DECLARE VARIABLE avg_price DOUBLE PRECISION;

Teraz prejdime k telu uloženej procedúry Otvorte telo HP kľúčové slovo BEGIN.
Najprv musíme vykonať prvý krok nášho algoritmu – vypočítať priemernú cenu. Na tento účel použijeme nasledujúci typ dotazu:

SELECT AVG(Cena_l)
FROM Table_Example
INTO:priem.cena,-

Tento dotaz používa súhrnnú funkciu AVG, ktorá vracia priemer poľa PRICE_1 medzi vybratými riadkami dotazu – v našom prípade priemer hodnoty PRICE_1 v celej tabuľke Table_example. Hodnota vrátená požiadavkou sa umiestni do premennej avg_price. Všimnite si, že pred premennou avg_pnce je dvojbodka, aby sa odlíšila od polí použitých v požiadavke.
Zvláštnosťou tohto dotazu je, že vždy vráti presne jeden záznam. Takéto dopyty sa nazývajú jednoduché dopyty a iba takéto výbery možno použiť v uložených procedúrach. Ak dotaz vráti viac ako jeden riadok, musí byť naformátovaný ako konštrukcia FOR SELECT...DO, ktorá organizuje cyklus na spracovanie každého vráteného riadka.
Takže sme dostali priemernú cenu. Teraz musíte prejsť celú tabuľku, porovnať hodnotu ceny v každom zázname s priemernou cenou a podniknúť príslušné kroky
Od začiatku organizujeme vyhľadávanie každého záznamu z tabuľky Table_example

PRE
SELECT ID, NAME, PRICE_1
FROM Table_Example
INTO:ID, :NAME, :new_price
DO
ZAČAŤ
/*_tu popisujeme každý záznam*/
KONIEC

Keď je táto konštrukcia vykonaná, údaje budú extrahované z tabuľky Table_example riadok po riadku a hodnoty polí v každom riadku budú priradené premenným ID, NAME a new_pnce. Samozrejme si zapamätajte, že tieto premenné sú deklarované ako výstupné parametre, ale nie je potrebné sa obávať, že sa vybrané dáta vrátia ako výsledky: to, že výstupným parametrom je niečo priradené, neznamená, že klient volajúci HP okamžite dostane tieto hodnoty! Parametre sa odovzdávajú iba pri vykonaní príkazu SUSPEND a predtým môžeme použiť výstupné parametre ako obyčajné premenné – v našom príklade to robíme práve s parametrom new_price.
Takže v tele cyklu BEGIN... END môžeme spracovať hodnoty každého riadku. Ako si pamätáte, musíme zistiť, ako je súčasná cena v porovnaní s priemerom, a prijať príslušné opatrenia. Tento postup porovnávania implementujeme pomocou príkazu IF:

IF (new_price > avg_price) THEN /*ak je existujúca cena väčšia ako priemerná cena*/
ZAČAŤ
/*potom nastavíme novú cenu rovnajúcu sa priemernej cene plus pevné percento */
nová_cena = (priem.cena + priem.cena*(percento2zvýšenie/100));
UPDATE Table_example
SET PRICE_1 = :nová_cena
WHERE ID = :ID;
KONIEC
ELSE
ZAČAŤ
/* Ak je existujúca cena nižšia alebo rovná priemernej cene, potom nastavte cenu rovnajúcu sa predchádzajúcej cene plus polovicu rozdielu medzi predchádzajúcou a priemernou cenou */
nová_cena = (nová_cena + ((priem. nová_cena_pnce)/2)) ;
UPDATE Table_example
SET PRICE_1 = :nová_cena
WHERE ID = .ID;
KONIEC

Ako vidíte, výsledkom je pomerne veľký konštrukt IF, ktorému by bolo ťažké porozumieť, nebyť komentárov uzavretých v symboloch /**/.
Na zmenu ceny v súlade s vypočítaným rozdielom použijeme výpis UPDATE, ktorý nám umožňuje upraviť existujúce záznamy - jeden alebo viac. Aby sme jednoznačne označili, v ktorom zázname je potrebné cenu zmeniť, použijeme v podmienke WHERE pole primárneho kľúča, ktoré porovnáme s hodnotou premennej, v ktorej je uložená hodnota ID pre aktuálny záznam: ID=:ID. Všimnite si, že pred premennou ID je dvojbodka.
Po vykonaní konštrukcie IF...THEN...ELSE obsahujú premenné ID, NAME a new_price údaje, ktoré musíme vrátiť klientovi, ktorý procedúru volal. Na to je potrebné za IF vložiť príkaz SUSPEND, ktorý odošle údaje tam, odkiaľ bolo volané HP Pri prenose sa procedúra pozastaví a pri požiadavke na nový záznam z HP aj bude opäť pokračovať - ​​a to bude pokračovať, kým FOR SELECT...DO neprejde všetky záznamy vo svojom dotaze.
Treba si uvedomiť, že okrem príkazu SUSPEND, ktorý iba pozastaví uloženú procedúru, existuje príkaz EXIT, ktorý po prejdení reťazca uloženú procedúru ukončí. Príkaz EXIT sa však používa pomerne zriedka, pretože je potrebný hlavne na prerušenie cyklu pri dosiahnutí podmienky
Avšak v prípade, keď bola procedúra zavolaná s príkazom SELECT a dokončená s EXIT, posledný získaný riadok sa nevráti. To znamená, že ak potrebujete prerušiť procedúru a napriek tomu >získať tento reťazec, musíte použiť sekvenciu

ZASTAVIŤ;
VÝCHOD;

Hlavným účelom EXITu je prijímať jednotlivé súbory údajov, vrátené parametre volaním EXECUTE PROCEDURE. V tomto prípade sú hodnoty výstupných parametrov nastavené, ale množina údajov SQL sa z nich negeneruje a vykonávanie procedúry končí.
Zapíšme si celý text našej uloženej procedúry, aby sme mohli na prvý pohľad zachytiť jej logiku:

VYTVORIŤ POSTUP Zvýšiť ceny (
Percent2Increase DOUBLE PRECISION)
VRÁTI SA (ID INTEGER, NAME VARCHAR(80),
nová_cena DVOJNÁSOBNÁ PRESNOSŤ) AS
DECLARE VARIABLE avg_price DOUBLE PRECISION;
ZAČAŤ
SELECT AVG(Cena_l)
FROM Table_Example
INTO:priem.cena;
PRE
SELECT ID, NAME, PRICE_1
FROM Table_Example
INTO:ID, :NAME, :new_price
DO
ZAČAŤ
/*spracuj každý záznam tu*/
IF (new_pnce > avg_price) THEN /*ak je existujúca cena väčšia ako priemerná cena*/
ZAČAŤ
/*nastaviť novú cenu rovnajúcu sa priemernej cene plus pevné percento */
nová_cena = (priemerná_cena + priemerná_cena*(percento 2lnzvýšenie/100));
UPDATE Table_example
SET PRICE_1 = :nová_cena
WHERE ID = :ID;
KONIEC
ELSE
ZAČAŤ
/* Ak je existujúca cena nižšia alebo rovná priemernej cene, potom sa nastaví cena rovnajúca sa predchádzajúcej cene plus polovica rozdielu medzi predchádzajúcou a priemernou cenou */
nová_cena = (nová_cena + ((priem.cena - nová_cena)/2));
UPDATE Table_example
SET PRICE_1 = :nová_cena
WHERE ID = :ID;
KONIEC
ZASTAVIŤ;
KONIEC
KONIEC

Tento príklad uloženej procedúry ilustruje použitie základných konštrukcií a spúšťačov jazyka uložených procedúr. Ďalej sa pozrieme na spôsoby použitia uložených procedúr na riešenie niektorých bežných problémov.

Rekurzívne uložené procedúry

Uložené procedúry InterBase môžu byť rekurzívne. To znamená, že uložená procedúra môže volať sama seba. Je povolených až 1 000 úrovní vnorenia uložených procedúr, ale musíme si uvedomiť, že voľné zdroje na serveri sa môžu minúť skôr, ako sa dosiahne maximálne vnorenie HP.
Jedným z bežných použití uložených procedúr je spracovanie stromových štruktúr uložených v databáze. Stromy sa často používajú v zložení produktov, skladoch, personálu a iných bežných aplikáciách.
Pozrime sa na príklad uloženej procedúry, ktorá vyberie všetky produkty určitého typu, počnúc od určitej úrovne vnorenia.
Zoberme si nasledujúcu formuláciu problému: máme adresár tovaru s hierarchickou štruktúrou tohto typu:

Tovar
- Spotrebiče
- Chladničky
- Trojkomorový
- Dvojitá komora
- Jednokomorový
- Práčky
- Vertikálne
- Vpredu
- Klasické
- Úzky
- Počítačová technológia
....

Táto štruktúra adresára kategórie produktov môže mať vetvy rôznej hĺbky. a časom sa tiež zvyšuje. Našou úlohou je zabezpečiť výber všetkých konečných prvkov z adresára s „rozšírením celého mena“, počnúc od akéhokoľvek uzla. Ak napríklad vyberieme uzol „Práčky“, musíme získať nasledujúce kategórie:

Práčky - Vertikálne
Práčky - Predné Classic
Práčky - Predná Úzka

Definujme štruktúru tabuľky na ukladanie informácií o adresári produktov. Na usporiadanie stromu v jednej tabuľke používame zjednodušenú schému:

VYTVORIŤ TABUĽKU Strom tovaru
(ID_GOOD INTEGER NIE JE NULL,
ID_PARENT_GOOD INTEGER,
GOOD_NAME VARCHAR(80),
obmedzenie primárny kľúč pkGooci (ID_GOOD));

Vytvoríme jednu tabuľku Tovarový strom, v ktorej sú len 3 polia: ID_GOOD - inteligentný identifikátor kategórie, ID_PARENT_GOOD - identifikátor materskej spoločnosti pre túto kategóriu a GOOD_NAME - názov kategórie. Aby sme zabezpečili integritu údajov v tejto tabuľke, zavedieme pre túto tabuľku obmedzenie cudzieho kľúča:

ALTER TABLE Tovar Strom
PRIDAŤ OBMEDZENIE FK_goodstree
CUDZÍ KĽÚČ (ID_PARENT_GOOD)
REFERENCIE GOODSTPEE (ID__GOOD)

Tabuľka odkazuje sama na seba a tento cudzí kľúč to sleduje. aby tabuľka neobsahovala odkazy na neexistujúcich rodičov a tiež zabránila pokusom o vymazanie kategórií produktov, ktoré majú deti.
Do našej tabuľky zadáme nasledujúce údaje:

ID_GOOD

1
2
3
4
5
6
7
8
9
10
11
12

ID_PARENT_GOOD

0
1
1
2
2
4
4
4
5
5
10
10

DOBRÉ MENO

TOVAR
Spotrebiče
Počítače a komponenty
Chladničky
Práčky
Trojkomorový
Dvojkomorový
Jednokomorový
Vertikálne
Predné
Úzky
klasické

Teraz, keď máme miesto na uloženie údajov, môžeme začať vytvárať uloženú procedúru, ktorá vypíše všetky „finálne“ kategórie produktov v „rozšírenej“ forme – napríklad pre kategóriu „Trojkomorové“ bude celá kategória názov by bol "Chladničky pre domácnosť" Trojkomorové".
Uložené procedúry, ktoré spracúvajú stromové štruktúry, majú svoju vlastnú terminológiu. Každý prvok stromu sa nazýva uzol; a vzťah medzi uzlami, ktoré sa navzájom odkazujú, sa nazýva vzťah rodič-dieťa. Uzly, ktoré sú na samom konci stromu a nemajú žiadne deti, sa nazývajú „listy“.
Pre túto uloženú procedúru bude vstupným parametrom identifikátor kategórie, od ktorého budeme musieť spustiť rozbor. Uložená procedúra bude vyzerať takto:

VYTVORIŤ POSTUP GETFULLNAME (ID_GOOD2SHOW INTEGER)
VRÁTENIE (FULL_GOODS_NAME VARCHAR(1000),
ID_CHILD_GOOD INTEGER)
AS
DECLARE VARIABLE CURR_CHILD_NAME VARCHAR(80);
ZAČAŤ
/*0organizujte vonkajší cyklus FOR SELECT podľa bezprostredných potomkov produktu s ID_GOOD=ID_GOOD2SHOW */
FOR SELECT gtl.id_good, gtl.good_name
FROM GoodsTree gtl
WHERE gtl.id_parent_good=:ID_good2show
INTO:ID_CHILD_GOOD, :full_goods_name
DO
ZAČAŤ
/"Skontrolujte pomocou funkcie EXISTS, ktorá vráti TRUE, ak dotaz v zátvorkách vráti aspoň jeden riadok. Ak nájdený uzol s ID_PARENT_GOOD = ID_CHILD_GOOD nemá žiadne potomky, potom je to „list“ stromu a je zahrnutý vo výsledkoch */
AK (NEEXISTUJE(
VYBERTE * ZO Stromu tovaru
WHERE GoodsTree.id_parent_good=:id_child_good))
POTOM
ZAČAŤ
/* Odovzdajte „list“ stromu k výsledkom */
ZASTAVIŤ;
KONIEC
ELSE
/* Pre uzly, ktoré majú deti*/
ZAČAŤ
/*uložte názov nadradeného uzla do dočasnej premennej */
CURR_CHILD_NAME=úplný_názov_tovaru;
/* spustiť túto procedúru rekurzívne */
PRE
SELECT ID_CHILD_GOOD, celý_názov_tovaru
FROM GETFULLNAME (:ID_CHILD_GOOD)
INTO:ID_CHILD_GOOD, :full_goods_name
ZAČNITE
/*pridanie názvu nadradeného uzla k nájdenému názvu potomka pomocou operácie zreťazenia reťazcov || */
full_goods_name=CURR_CHILD_NAME| " " | celý_názov_tovaru,-
ZASTAVIŤ; /* vrátiť celý názov produktu*/
KONIEC
KONIEC
KONIEC
KONIEC

Ak tento postup vykonáme so vstupným parametrom ID_GOOD2SHOW= 1, dostaneme nasledovné:

Ako môžete vidieť, pomocou rekurzívnej uloženej procedúry sme prešli celý strom kategórií a zobrazili sme celý názov „listových“ kategórií, ktoré sa nachádzajú na úplných špičkách vetiev.

Záver

Toto uzatvára našu úvahu o hlavných vlastnostiach jazyka uložených procedúr. Je zrejmé, že nie je možné úplne zvládnuť vývoj uložených procedúr len v jednej kapitole, ale tu sme sa pokúsili predstaviť a vysvetliť základné pojmy spojené s uloženými procedúrami. Popísané návrhy a techniky navrhovania HP možno použiť vo väčšine databázových aplikácií
Niektorým dôležitým otázkam súvisiacim s vývojom uložených procedúr sa budeme venovať v nasledujúcej kapitole – „Pokročilé možnosti jazyka uložených procedúr InterBase“, ktorá je venovaná obsluhe výnimiek, riešeniu chybových situácií v uložených procedúrach a práci s poľami.

SQL - Lekcia 15. Uložené procedúry. Časť 1.

Spravidla pri práci s databázou používame rovnaké dotazy, prípadne množinu sekvenčných dotazov. Uložené procedúry vám umožňujú kombinovať postupnosť dotazov a ukladať ich na server. Toto je veľmi pohodlný nástroj a teraz to uvidíte. Začnime syntaxou:

CREATE PROCEDURE názov_postupu (parametre) begin príkazy koniec

Parametre sú údaje, ktoré postupujeme pri jej volaní, a operátori sú samotné požiadavky. Napíšeme si náš prvý postup a presvedčíme sa, že je to pohodlné. V lekcii 10, keď sme pridávali nové záznamy do databázy obchodu, sme použili štandardný dotaz na pridanie formulára:

INSERT INTO customers (meno, email) VALUE ("Ivanov Sergey", " [chránený e-mailom]");

Pretože Podobnú požiadavku použijeme vždy, keď potrebujeme pridať nového zákazníka, preto je celkom vhodné ju formalizovať vo forme postupu:

CREATE PROCEDURE ins_cust(n CHAR(50), e CHAR(50)) začať vkladať do zákazníkov (meno, email) hodnotu (n, e); koniec

Venujte pozornosť tomu, ako sú parametre špecifikované: musíte parametru pomenovať a uviesť jeho typ a v tele procedúry už používame názvy parametrov. Jedno upozornenie. Ako si pamätáte, bodkočiarka znamená koniec žiadosti a odošle ju na vykonanie, čo je v tomto prípade neprijateľné. Preto pred napísaním procedúry je potrebné predefinovať oddeľovač c; na "//", aby sa žiadosť neodoslala vopred. Toto sa vykonáva pomocou operátora DELIMITER //:

Preto sme DBMS naznačili, že príkazy by sa teraz mali vykonávať po //. Malo by sa pamätať na to, že predefinovanie oddeľovača sa vykonáva iba pre jednu reláciu, t.j. pri ďalšej práci s MySql sa oddeľovač opäť zmení na bodkočiarku a v prípade potreby sa bude musieť znova definovať. Teraz môžete zadať postup:

CREATE PROCEDURE ins_cust(n CHAR(50), e CHAR(50)) začať vkladať do zákazníkov (meno, email) hodnotu (n, e); koniec //


Postup je teda vytvorený. Teraz, keď potrebujeme zadať nového zákazníka, stačí mu zavolať a zadať potrebné parametre. Na zavolanie uloženej procedúry použite príkaz CALL, za ktorým nasleduje názov procedúry a jej parametre. Pridajme nového zákazníka do našej tabuľky Zákazníci:

call ins_cust("Sychov Valery", " [chránený e-mailom]")//


Súhlaste s tým, že je to oveľa jednoduchšie ako zakaždým písať celú žiadosť. Skontrolujeme, či postup funguje tak, že sa pozrieme, či sa v tabuľke Zákazníci objavil nový zákazník:

Zobrazený postup funguje a bude fungovať vždy, kým ho neodstránime pomocou operátora DROP PROCEDURE názov_postupu.

Ako bolo spomenuté na začiatku lekcie, procedúry vám umožňujú kombinovať postupnosť dotazov. Pozrime sa, ako sa to robí. Pamätáte si, že v lekcii 11 sme chceli vedieť, za koľko nám dodávateľ “House of Printing” priniesol tovar? Na to sme museli použiť poddotazy, spojenia, vypočítané stĺpce a zobrazenia. Čo ak chceme vedieť, za koľko nám tovar priniesol druhý dodávateľ? Budete musieť vytvoriť nové dopyty, spojenia atď. Jednoduchšie je napísať uloženú procedúru pre túto akciu.

Zdalo by sa, že najjednoduchším spôsobom je zobrať pohľad a dotaz naň už napísaný v lekcii 11, skombinovať ho do uloženej procedúry a urobiť z identifikátora dodávateľa (id_vendor) vstupný parameter, ako je tento:

VYTVORIŤ POSTUP sum_vendor(i INT) begin VYTVORIŤ ZOBRAZIŤ report_vendor AKO VYBERTE časopis_prichádzajúci.id_produkt,_dostupné_množstvo,ceny.cena,_dostupné_množstvo*ceny.cena AKO suma Z_dostupneho_magazínu, ceny KDE_prichádzajúci_časopis.ID_produkt= id_vstupu=produktu SELECT id_incoming FROM incoming WHERE id_vendor=i); SELECT SUM(summa) FROM report_vendor; koniec //

Ale postup nebude fungovať týmto spôsobom. Celá pointa je v tom zobrazenia nemôžu používať parametre. Preto budeme musieť mierne zmeniť poradie požiadaviek. Najprv si vytvoríme pohľad, ktorý bude zobrazovať ID dodávateľa (id_vendor), ID produktu (id_product), množstvo (množstvo), cenu (cena) a sumu (summa) z troch tabuliek Zásoby (prichádzajúce), Zásobník (dochádzajúce časopisy) , Ceny ( ceny):

VYTVORIŤ ZOBRAZIŤ report_vendor AKO VYBERTE prichádzajúce.id_vendor, časopis_prichádzajúci.id_produkt, časopis_prichádzajúce.množstvo, ceny.cena, časopis_prichádzajúce.množstvo*ceny.cena AKO súčet Z prichádzajúcich, došlých_časopisov, cien KDE časopis_prichádzajúci.id_produkt=prichádzajúce_identifikátor.id_prichádzajúci_prichádzajúci_časopis .id_incoming;

A potom vytvoríme dotaz, ktorý bude sumarizovať množstvá dodávateľa, o ktorého máme záujem, napríklad s id_vendor=2:

Teraz môžeme spojiť tieto dva dotazy do uloženej procedúry, kde vstupným parametrom bude identifikátor dodávateľa (id_vendor), ktorý bude nahradený do druhého dotazu, ale nie do zobrazenia:

VYTVORIŤ POSTUP sum_vendor(i INT) begin VYTVORIŤ ZOBRAZIŤ report_vendor AKO VYBERTE prich.id_vendor, casopis_prichadzajuci.id_produkt, casopis_dochod.množstvo, ceny.cena, casopis_dostupne.množstvo*ceny.cena AS summa Z prich., casopis_prichadzajuce, ceny KDE_prijaty_produkt_vstup do casopisu. .id_product AND magazine_incoming.id_incoming= incoming.id_incoming; SELECT SUM(summa) FROM report_vendor WHERE id_vendor=i; koniec //


Pozrime sa na fungovanie postupu s rôznymi vstupnými parametrami:


Ako vidíte, procedúra sa spustí raz a potom vyvolá chybu, ktorá nám oznámi, že zobrazenie report_vendor už v databáze existuje. Pri prvom volaní procedúry sa totiž vytvorí pohľad. Pri druhom prístupe sa pokúsi znova vytvoriť zobrazenie, ale už existuje, a preto sa zobrazí chyba. Aby sa tomu zabránilo, existujú dve možnosti.

Prvým je vyradenie zastúpenia z konania. To znamená, že pohľad vytvoríme raz a procedúra k nemu iba pristúpi, ale nevytvorí ho. Nezabudnite vymazať už vytvorenú procedúru a najskôr si pozrieť:

PUSTIŤ POSTUP súčet_vendor// ZOBRAZIŤ ZOBRAZIŤ report_vendor// VYTVORIŤ ZOBRAZENIE report_vendor AKO VYBERTE prichádzajúce.id_vendor, časopis_prichádzajúci.id_produkt, časopis_prichádzajúce.množstvo, ceny.cena,_časopis_prichádzajúce.množstvo*price.cena AKO summa Z prich.,priceny_vstup_magazinu.dostupny časopis = prices.id_product AND magazine_incoming.id_incoming= incoming.id_incoming // VYTVORENIE POSTUPU sum_vendor(i INT) begin SELECT SUM(summa) FROM report_vendor WHERE id_vendor=i; koniec //


Kontrola práce:

call sum_vendor(1)// call sum_vendor(2)// call sum_vendor(3)//


Druhou možnosťou je pridať príkaz priamo do procedúry, ktorá odstráni pohľad, ak existuje:

CREATE PROCEDURE sum_vendor(i INT) begin DROP VIEW AK EXISTUJE report_vendor; VYTVORIŤ ZOBRAZIŤ report_vendor AKO VYBERTE prichádzajúce.id_vendor, časopis_prichádzajúci.id_produkt, časopis_prichádzajúce.množstvo, ceny.cena, časopis_prichádzajúce.množstvo*ceny.cena AKO súčet Z prichádzajúcich, došlých_časopisov, cien KDE časopis_prichádzajúci.id_produkt=prichádzajúce_identifikátor.id_prichádzajúci_prichádzajúci_časopis .id_incoming; SELECT SUM(summa) FROM report_vendor WHERE id_vendor=i; koniec //

Pred použitím tejto voľby nezabudnite odstrániť procedúru sum_vendor a potom otestujte prácu:

Ako vidíte, je skutočne jednoduchšie formalizovať zložité dotazy alebo ich postupnosť raz do uloženej procedúry a potom k nej jednoducho pristupovať a špecifikovať potrebné parametre. To výrazne redukuje kód a robí prácu s dotazmi logickejšou.

Cieľ práce– naučiť sa vytvárať a používať uložené procedúry na databázovom serveri.

1. Prepracujte všetky príklady, analyzujte výsledky ich vykonania v nástroji SQL Server Management Studio. Kontrola prítomnosti vytvorených procedúr v aktuálnej databáze.

2. Vyplnenie všetkých príkladov a úloh počas laboratórnych prác.

3. Plnenie jednotlivých úloh podľa možností.

Vysvetlivky k vykonávaniu práce

Na naučenie sa programovania uložených procedúr používame príklad databázy tzv DB_Books, ktorý vznikol v laboratórnej práci č.1. Pri vypĺňaní príkladov a úloh dbajte na zhodu názvov databázy, tabuliek a iných objektov projektu.

Uložené procedúry sú množinou príkazov, ktoré pozostávajú z jedného alebo viacerých SQL príkazov alebo funkcií a sú uložené v databáze v kompilovanej forme.

Typy uložených procedúr

Systémové uložené procedúry sú určené na vykonávanie rôznych administratívnych akcií. Takmer všetky činnosti správy servera sa vykonávajú s ich pomocou. Môžeme povedať, že systémové uložené procedúry sú rozhraním, ktoré zabezpečuje prácu so systémovými tabuľkami. Systémové uložené procedúry majú predponu sp_, sú uložené v systémovej databáze a možno ich volať v kontexte akejkoľvek inej databázy.

Vlastné uložené procedúry implementujú určité akcie. Uložené procedúry sú plnohodnotným databázovým objektom. V dôsledku toho sa každá uložená procedúra nachádza v konkrétnej databáze, kde sa vykonáva.

Dočasne uložené procedúry existujú len krátky čas, po ktorom ich server automaticky zničí. Delia sa na lokálne a globálne. Lokálne dočasne uložené procedúry možno volať len z pripojenia, v ktorom sú vytvorené. Pri vytváraní takejto procedúry jej musíte dať názov, ktorý začína jedným znakom #. Rovnako ako všetky dočasné objekty, uložené procedúry tohto typu sa automaticky vymažú, keď sa užívateľ odpojí alebo sa server reštartuje alebo zastaví. Globálne dočasne uložené procedúry sú dostupné pre každé pripojenie zo servera, ktorý má rovnakú procedúru. Ak ho chcete definovať, stačí mu dať názov začínajúci znakmi ##. Tieto procedúry sa vymažú, keď sa server reštartuje alebo zastaví, alebo keď sa zatvorí pripojenie v kontexte, v ktorom boli vytvorené.

Vytváranie, úprava uložených procedúr

Vytvorenie uloženej procedúry zahŕňa riešenie nasledujúcich problémov: plánovanie prístupových práv. Keď vytvoríte uloženú procedúru, uvedomte si, že bude mať rovnaké prístupové práva k databázovým objektom ako používateľ, ktorý ju vytvoril; definovanie parametrov uloženej procedúry môžu mať vstupné a výstupné parametre; vývoj kódu uloženej procedúry. Kód procedúry môže obsahovať sekvenciu ľubovoľných príkazov SQL vrátane volaní iných uložených procedúr.

Syntax operátora na vytvorenie novej alebo zmenu existujúcej uloženej procedúry v zápise MS SQL Server:

( CREATE | ALTER ) PROC[ EDURE] názov_procedúry [ ;číslo] [ ( @názov_parametra typ_údajov ) [ VARYING ] [ = PREDCHOZÍ ] [ VÝSTUP ] ] [ ,... n] [ S ( ZNOVU KOMPILOVAŤ | ŠIFROVAŤ | ZNOVU KOMPILOVAŤ, ŠIFROVAŤ )] ] [ PRE REPLIKÁCIU] AKO príkaz sql [ ... n]

Pozrime sa na parametre tohto príkazu.

Pomocou predpôn sp_, #, ## možno vytvorenú procedúru definovať ako systémovú alebo dočasnú. Ako je zrejmé zo syntaxe príkazu, nie je dovolené zadať meno vlastníka, ktorý bude vlastniť vytvorenú procedúru, ako aj názov databázy, kde sa má nachádzať. Preto, ak chcete umiestniť uloženú procedúru, ktorú vytvárate, do špecifickej databázy, musíte zadať príkaz CREATE PROCEDURE v kontexte tejto databázy. Pri prístupe k objektom tej istej databázy z tela uloženej procedúry môžete použiť skrátené názvy, t.j. bez zadania názvu databázy. Keď potrebujete získať prístup k objektom umiestneným v iných databázach, zadanie názvu databázy je povinné.

Ak chcete odovzdať vstupné a výstupné údaje, názvy parametrov v uloženej procedúre, ktorú vytvoríte, musia začínať znakom @. V jednej uloženej procedúre môžete zadať viacero parametrov oddelených čiarkami. Telo procedúry by nemalo používať lokálne premenné, ktorých názvy sa zhodujú s názvami parametrov tejto procedúry. Akýkoľvek dátový typ SQL, vrátane užívateľom definovaných, je vhodný na určenie dátového typu parametrov uloženej procedúry. Dátový typ CURSOR je však možné použiť len ako výstupný parameter uloženej procedúry, t.j. zadaním kľúčového slova OUTPUT.

Prítomnosť kľúčového slova OUTPUT znamená, že príslušný parameter je určený na vrátenie údajov z uloženej procedúry. To však neznamená, že parameter nie je vhodný na odovzdávanie hodnôt do uloženej procedúry. Zadanie kľúčového slova OUTPUT dáva serveru pokyn, aby pri ukončení uloženej procedúry priradil aktuálnu hodnotu parametra lokálnej premennej, ktorá bola zadaná ako hodnota parametra pri volaní procedúry. Všimnite si, že pri zadávaní kľúčového slova OUTPUT je možné hodnotu zodpovedajúceho parametra pri volaní procedúry nastaviť len pomocou lokálnej premennej. Akékoľvek výrazy alebo konštanty, ktoré sú povolené pre normálne parametre, nie sú povolené. Kľúčové slovo VARYING sa používa v spojení s parametrom OUTPUT, ktorý je typu CURSOR. Špecifikuje, že výstupom bude množina výsledkov.

Kľúčové slovo DEFAULT predstavuje hodnotu, ktorú bude mať príslušný parameter štandardne. Pri volaní procedúry teda nemusíte explicitne špecifikovať hodnotu zodpovedajúceho parametra.

Keďže server ukladá do vyrovnávacej pamäte plán vykonávania dotazu a skompilovaný kód, pri ďalšom volaní procedúry sa použijú pripravené hodnoty. V niektorých prípadoch je však stále potrebné prekompilovať kód procedúry. Zadanie kľúčového slova RECOMPILE inštruuje systém, aby vytvoril plán vykonávania pre uloženú procedúru pri každom jej volaní.

Parameter FOR REPLICATION sa vyžaduje pri replikácii údajov a zahrnutí vytvorenej uloženej procedúry ako článku v publikácii. Kľúčové slovo ENCRYPTION dáva serveru pokyn, aby zašifroval kód uloženej procedúry, čo môže poskytnúť ochranu pred použitím proprietárnych algoritmov, ktoré implementujú uloženú procedúru. Kľúčové slovo AS je umiestnené na začiatku samotného tela uloženej procedúry. Telo procedúry môže používať takmer všetky príkazy SQL, deklarovať transakcie, nastavovať zámky a volať ďalšie uložené procedúry. Uloženú procedúru môžete ukončiť pomocou príkazu RETURN.

Odstránenie uloženej procedúry

ZAKÁZAŤ PROCEDURE (názov_procedúry) [,...n]

Vykonanie uloženej procedúry

Na vykonanie uloženej procedúry použite príkaz: [ [ EXEC [ UTE] názov_procedúry [ ;číslo] [ [ @názov_parametra= ] ( hodnota | @názov_premennej) [ VÝSTUP ] | [ VÝCHOZÍ ] ] [ ,... n]

Ak volanie uloženej procedúry nie je jediným príkazom v dávke, potom je potrebný príkaz EXECUTE. Okrem toho je tento príkaz potrebný na volanie procedúry z tela inej procedúry alebo spúšťača.

Použitie kľúčového slova OUTPUT pri volaní procedúry je povolené len pre parametre, ktoré boli deklarované pri vytváraní procedúry s kľúčovým slovom OUTPUT.

Keď je pri volaní procedúry pre parameter zadané kľúčové slovo DEFAULT, použije sa predvolená hodnota. Prirodzene, zadané slovo DEFAULT je povolené len pre tie parametre, pre ktoré je definovaná predvolená hodnota.

Syntax príkazu EXECUTE ukazuje, že názvy parametrov možno pri volaní procedúry vynechať. V tomto prípade však musí používateľ zadať hodnoty parametrov v rovnakom poradí, v akom boli uvedené pri vytváraní procedúry. Nemôžete priradiť predvolenú hodnotu parametru tak, že ho jednoducho vynecháte počas enumerácie. Ak chcete vynechať parametre, ktoré majú predvolenú hodnotu, stačí pri volaní uloženej procedúry explicitne zadať názvy parametrov. Navyše týmto spôsobom môžete uviesť parametre a ich hodnoty v ľubovoľnom poradí.

Všimnite si, že pri volaní procedúry sú zadané buď názvy parametrov s hodnotami, alebo len hodnoty bez názvu parametra. Ich kombinovanie nie je povolené.

Použitie RETURN v uloženej procedúre

Umožňuje vám ukončiť postup v ktoromkoľvek bode podľa špecifikovanej podmienky a tiež vám umožňuje vyjadriť výsledok postupu ako číslo, pomocou ktorého môžete posúdiť kvalitu a správnosť postupu. Príklad vytvorenia procedúry bez parametrov:

VYTVORIŤ POSTUP Count_Books AS SELECT COUNT (číselník) FROM Books GO

Cvičenie 1.

EXEC Count_Books

Skontrolujte výsledok.

Príklad vytvorenia procedúry so vstupným parametrom:

POSTUP VYTVORENIA Count_Books_Pages @Count_pages AS INT AS SELECT COUNT (Code_book) FROM Books WHERE Pages>= @Count_pages GO

Úloha 2. Vytvorte túto procedúru v časti Uložené procedúry databázy DB_Books pomocou pomôcky SQL Server Management Studio. Spustite ho pomocou príkazu

EXEC Count_Books_Pages 100

Skontrolujte výsledok.

Príklad vytvorenia procedúry so vstupnými parametrami:

CREATE PROCEDURE Count_Books_Title @Count_pages AS INT , @Title AS CHAR (10 ) AS SELECT COUNT (Code_book) FROM Books WHERE Pages>= @Count_pages AND Title_book LIKE @Title GO

Úloha 3. Vytvorte túto procedúru v časti Uložené procedúry databázy DB_Books pomocou pomôcky SQL Server Management Studio. Spustite ho pomocou príkazu

EXEC Count_Books_Title 100, "P%"

Skontrolujte výsledok.

Príklad vytvorenia procedúry so vstupnými parametrami a výstupným parametrom:

POSTUP VYTVORENIA Count_Books_Itogo @Count_pages INT , @Title CHAR (10) , @Itogo INT OUTPUT AS SELECT @Itogo = COUNT (Code_book) FROM Books WHERE Pages>= @Count_pages AND Title_book LIKE @Title GO

Úloha 4. Vytvorte túto procedúru v časti Uložené procedúry databázy DB_Books pomocou pomôcky SQL Server Management Studio. Spustite pomocou sady príkazov:

Sql> Declare @q As int EXEC Count_Books_Itogo 100, "P%", @q output select @q

Skontrolujte výsledok.

Príklad vytvorenia procedúry so vstupnými parametrami a RETURN:

CREATE PROCEDURE kontrolné meno @param INT AS IF (SELECT Name_author FROM autorov WHERE Code_author = @param) = "Pushkin A.S." VRÁTIŤ 1 ELŠIE VRAŤ 2

Úloha 5. Vytvorte túto procedúru v časti Uložené procedúry databázy DB_Books pomocou pomôcky SQL Server Management Studio. Spustite ho pomocou príkazov:

DECLARE @return_status INT EXEC @return_status = kontrolné meno 1 VYBERTE "Stav vrátenia" = @return_status

Príklad vytvorenia postupu bez parametrov na 2-násobné zvýšenie hodnoty kľúčového poľa v tabuľke Nákupy:

CREATE PROC update_proc AS UPDATE Nákupy SET Code_purchase = Code_purchase* 2

Úloha 6. Vytvorte túto procedúru v časti Uložené procedúry databázy DB_Books pomocou pomôcky SQL Server Management Studio. Spustite ho pomocou príkazu

EXEC update_proc

Príklad postupu so vstupným parametrom na získanie všetkých informácií o konkrétnom autorovi:

CREATE PROC select_author @k CHAR (30 ) AS SELECT * FROM Authors WHERE name_author= @k

Úloha 7.

EXEC select_author "Pushkin A.S." alebo select_author @k= "Pushkin A.S." alebo EXEC select_author @k= "Pushkin A.S."

Príklad vytvorenia procedúry so vstupným parametrom a predvolenou hodnotou na zvýšenie hodnoty kľúčového poľa v tabuľke Nákupy o určený počet (štandardne 2-krát):

CREATE PROC update_proc @p INT = 2 AKO AKTUALIZÁCIA nákupov SET Code_purchase = Code_purchase * @p

Procedúra nevracia žiadne údaje.

Úloha 8. Vytvorte túto procedúru v časti Uložené procedúry databázy DB_Books pomocou pomôcky SQL Server Management Studio. Spustite ho pomocou príkazov:

EXEC update_proc 4 alebo EXEC update_proc @p = 4 alebo EXEC update_proc -- použije sa predvolená hodnota.

Príklad vytvorenia procedúry so vstupnými a výstupnými parametrami. Vytvorte postup na určenie počtu objednávok dokončených počas určeného obdobia:

CREATE PROC count_purchases @d1 SMALLDATETIME, @d2 SMALLDATETIME, @c INT OUTPUT AS SELECT @c= COUNT (Code_purchase) FROM Nákupy WHERE Date_order BETWEEN @d1 AND @d2 SET @c = ISNULL(@c, 0 )

Úloha 9. Vytvorte túto procedúru v časti Uložené procedúry databázy DB_Books pomocou pomôcky SQL Server Management Studio. Spustite ho pomocou príkazov:

DECLARE @c2 INT EXEC count_purchases '01-jun-2006', '01-jul-2006', @c2 OUTPUT SELECT @c2

Možnosti úloh pre laboratórnu prácu č.4

Všeobecné ustanovenia. V nástroji SQL Server Management Studio vytvorte novú stránku pre kód (tlačidlo „Vytvoriť dotaz“). Programovo aktivujte vytvorenú databázu DB_Books pomocou príkazu Use. Vytvorte uložené procedúry pomocou príkazov Create procedure a definujte názvy procedúr sami. Každá procedúra vykoná jeden SQL dotaz, ktorý bol vykonaný v druhom laboratóriu. Okrem toho je potrebné zmeniť kód SQL dotazov, aby mohli prenášať hodnoty polí používaných na vyhľadávanie.

Napríklad úvodná úloha a požiadavka v laboratórnej práci č.2:

/*Vyberte z adresára dodávateľov (Tabuľka doručenia) názvy spoločností, telefónne čísla a INN (polia Name_company, Phone a INN), ktorých názov spoločnosti (pole Name_company) je “OJSC MIR”.

SELECT Name_company, Phone, INN FROM Delivery WHERE Name_company = "OJSC MIR"

*/ –V tejto práci bude vytvorený nasledujúci postup:

CREATE PROC select_name_company @comp CHAR (30 ) AS SELECT Name_company, Phone, INN FROM Dodávky WHERE Name_company = @comp

- Na spustenie postupu použite príkaz:

EXEC select_name_company "JSC MIR"

Zoznam úloh

Vytvorte nový program v SQL Server Management Studio. Programovo aktivujte individuálnu databázu vytvorenú v laboratórnej práci č. 1 pomocou príkazu Use. Vytvorte uložené procedúry pomocou príkazov Create procedure a definujte názvy procedúr sami. Každá procedúra vykoná jeden SQL dotaz, ktorý je prezentovaný vo forme samostatných úloh podľa možností.

možnosť 1

1. Zobrazte zoznam zamestnancov, ktorí majú aspoň jedno dieťa.

2. Zobrazte zoznam detí, ktoré dostali darčeky v určenom období.

3. Zobrazte zoznam rodičov, ktorí majú maloleté deti.

4. Zobrazte informácie o darčekoch s hodnotou väčšou ako zadané číslo, zoradené podľa dátumu.

Možnosť 2

1. Zobrazte zoznam zariadení so zadaným typom.

2. Zobrazte počet opravených zariadení a celkovú cenu opráv od zadaného technika.

3. Zobrazte zoznam vlastníkov zariadení a počet ich žiadostí zoradený podľa počtu žiadostí v zostupnom poradí.

4. Zobrazte informácie o remeselníkoch s hodnosťou vyššou ako zadaný počet alebo s dátumom prijatia do zamestnania menším ako zadaný dátum.

Možnosť 3

2. Zobrazte zoznam predajných kódov, ktoré predávali kvety za sumu vyššiu ako zadaný počet.

3. Zobrazte dátum predaja, množstvo, predajcu a kvet podľa zadaného predajného kódu.

4. Zobrazte zoznam kvetov a odrody pre kvety s výškou väčšou ako zadaný počet alebo kvitnúce.

Možnosť 4

1. Zobrazte zoznam liekov so špecifikovanou indikáciou na použitie.

2. Zobrazte zoznam termínov dodania, ku ktorým sa predalo viac ako zadané číslo lieku s rovnakým názvom.

3. Zobrazte dátum dodania, množstvo, celé meno vedúceho od dodávateľa a názov lieku o kód príjemky väčší ako zadané číslo.

Možnosť 5

2. Zobrazte zoznam vyradených zariadení zo zadaného dôvodu.

3. Zobrazte dátum prijatia, názov zariadenia, celé meno zodpovednej osoby a dátum odpisu zariadenia odpísaného počas stanoveného obdobia.

4. Zobrazte zoznam zariadení so zadaným typom alebo s dátumom prijatia väčším ako určitá hodnota

Možnosť 6

1. Zobrazte zoznam jedál s hmotnosťou väčšou ako zadané číslo.

2. Zobrazte zoznam produktov, ktorých názvy obsahujú zadaný fragment slova.

3. Zobrazte objem produktu, názov jedla, názov produktu s kódom jedla od zadanej počiatočnej hodnoty po určitú konečnú hodnotu.

4. Zobrazte poradie prípravy jedla a názov jedla s množstvom uhľohydrátov vyšším ako určitá hodnota alebo množstvom kalórií vyšším ako špecifikovaná hodnota.

Možnosť 7

1. Zobrazte zoznam zamestnancov so zadanou pozíciou.

3. Zobrazte dátum registrácie, typ dokumentu, celé meno registrátora a názov organizácie pri dokumentoch zaregistrovaných v uvedenom období.

4. Zobrazte zoznam evidovaných dokumentov s konkrétnym typom dokumentu alebo s dátumom registrácie väčším ako zadaná hodnota.

Možnosť 8

1. Zobrazte zoznam zamestnancov s uvedeným dôvodom prepustenia.

3. Pri dokladoch evidovaných v uvedenom období zobrazte dátum registrácie, dôvod prepustenia, celé meno zamestnanca.

Možnosť 9

1. Zobrazte zoznam zamestnancov, ktorí čerpali dovolenku zadaného typu.

2. Zobrazte zoznam dokumentov s dátumom registrácie v zadanom období.

3. Pri dokladoch evidovaných v uvedenom období zobraziť dátum prihlásenia, druh dovolenky, celé meno zamestnanca.

4. Zobrazte zoznam evidovaných dokumentov s kódom dokumentu v zadanom rozsahu.

Možnosť 10

1. Zobrazte zoznam zamestnancov so zadanou pozíciou.

2. Zobrazte zoznam dokumentov, ktorých obsah obsahuje zadaný fragment slova.

3. Zobrazte dátum registrácie, typ dokumentu, celé meno odosielateľa a názov organizácie pri dokumentoch zaregistrovaných počas zadaného obdobia.

4. Zobrazte zoznam evidovaných dokumentov so zadaným typom dokumentu alebo s kódom dokumentu menším ako určitá hodnota.

Možnosť 11

1. Zobrazte zoznam zamestnancov zaradených na zadanú pozíciu.

2. Zobrazte zoznam dokumentov s dátumom registrácie v zadanom období.

3. Zobrazte dátum registrácie, pozíciu, celé meno zamestnanca pre dokumenty evidované v zadanom období.

4. Zobrazte zoznam evidovaných dokumentov s kódom dokumentu v zadanom rozsahu.

Možnosť 12

3. Zobrazte zoznam ľudí, ktorí si prenajali vybavenie a počet ich požiadaviek, zoradený podľa počtu požiadaviek v zostupnom poradí.

Možnosť 13

1. Zobrazte zoznam zariadení so zadaným typom. 2. Zobrazte zoznam zariadení, ktoré boli odpísané konkrétnym zamestnancom.

3. Zobrazte množstvo vyradeného zariadenia, zoskupené podľa typu zariadenia.

4. Zobrazte informácie o zamestnancoch s dátumom prijatia väčším ako určitý dátum.

Možnosť 14

1. Vytlačte zoznam kvetov so zadaným typom listu.

2. Zobrazte zoznam kódov účteniek, za ktoré boli kvety predané za sumy vyššie ako určitá hodnota.

3. Zobrazte dátum prijatia, množstvo, mená dodávateľa a farby podľa špecifického kódu dodávateľa.

4. Zobrazte zoznam kvetov a odrodu pre kvety s výškou väčšou ako určitý počet alebo kvitnúce.

Možnosť 15

1. Zobrazte zoznam klientov, ktorí sa prihlásili na izby v určenom období.

2. Zobrazte celkovú výšku platieb za izby pre každého klienta.

3. Zobrazte dátum príchodu, typ izby, celé meno klientov prihlásených v uvedenom období.

4. Zobrazte zoznam registrovaných klientov v izbách určitého typu.

Možnosť 16

1. Zobrazte zoznam zariadení so zadaným typom.

2. Zobrazte zoznam zariadení, ktoré si prenajal konkrétny klient.

3. Zobrazte zoznam ľudí, ktorí si prenajali vybavenie a počet ich požiadaviek, zoradený podľa počtu požiadaviek v zostupnom poradí.

4. Zobrazte informácie o klientoch zoradené podľa adresy.

Možnosť 17

1. Zobrazte zoznam cenín s kúpnou cenou vyššou ako určitá hodnota alebo záručnou dobou vyššou ako určené číslo.

2. Zobrazte zoznam umiestnení hmotných aktív, ktorých názvy obsahujú zadané slovo.

3. Zobrazte súčet hodnôt hodnôt s kódom v zadanom rozsahu.

4. Zobrazte zoznam finančne zodpovedných osôb s dátumom vzniku pracovného pomeru v zadanom rozsahu.

Možnosť 18

1. Zobrazte zoznam opráv vykonaných konkrétnym technikom.

2. Zobrazte zoznam pracovných etáp zahrnutých v diele, ktorého názov obsahuje zadané slovo.

3. Zobrazte súčet nákladov na etapy opravárenských prác za prácu s kódom v zadanom rozsahu.

4. Zobrazte zoznam majstrov s dátumom prijatia do zamestnania v zadanom rozsahu.

Možnosť 19

1. Zobrazte zoznam liekov so špecifickou indikáciou.

2. Zobrazte zoznam čísel účteniek, na ktoré sa predalo viac ako určitý počet liekov.

3. Na účtenke s uvedeným číslom zobrazte dátum predaja, sumu, meno pokladníka a liek.

4. Zobrazte zoznam liekov a merných jednotiek pre lieky, ktorých množstvo v balení je väčšie ako zadané číslo alebo kód lieku menší ako určitá hodnota.

Možnosť 20

1. Zobrazte zoznam zamestnancov so zadanou pozíciou.

2. Zobrazte zoznam dokumentov, ktorých obsah obsahuje zadaný fragment slova.

3. Zobrazte dátum registrácie, typ dokumentu, celé meno exekútora a skutočnosť exekúcie pri dokumentoch zaregistrovaných v uvedenom období.

4. Zobrazte zoznam evidovaných dokumentov so zadaným typom dokumentu alebo kódom dokumentu v určitom rozsahu.