SQL Kuues loeng
3GL inside 4GL Protseduurid
Funktsioonid Tavalised Funktsioonid (üks väljund) Ilma väljundita Protseduurid Viitargumentide kasutamise võimalus Tabel-väljundiga Protseduurid
Create function CREATE FUNCTION <fnimi> ([{parameetrid}]) RETURNS <andmetüüp> BEGIN... END
Mõned 3GL võimalused Muutuja loomine: DECLARE <nimi> <tüüp> Omistamine: SET <muutuja> = <väärtus> SELECT... INTO <muutujad> FROM... Katkestus: RETURN [väärtus] NB! Watcom SQL (ASA) vs T-SQL (ASE) NB! Võimalik kursorite (cursor) kasutamine!
Deterministlik funktsioon CREATE FUNCTION f_liida(a_arv1 integer, a_arv2 integer) RETURNS integer DETERMINISTIC BEGIN DECLARE l_summa INTEGER; SET l_summa = a_arv1 + a_arv2; RETURN l_summa; END
Mitte-deterministlik f-n CREATE FUNCTION f_eesnimi(a_id integer) RETURNS varchar(50) NOT DETERMINISTIC BEGIN DECLARE l_enimi varchar(50); SELECT eesnimi INTO l_enimi FROM isik WHERE id = a_id; RETURN l_enimi; END
Kasutamine SELECT f_eesnimi(83) SELECT f_eesnimi(83) FROM sys.dummy SELECT id, f_eesnimi(id) FROM isik // ääretult ebaoptimaalne!!
Funktsiooni kustutamine DROP FUNCTION <fnimi>
Protseduur CREATE PROCEDURE <pnimi> ({[<params>]} [RESULT ({veergude nimekiri})] BEGIN... END Param: {IN OUT INOUT} <nimi> <tüüp>
CREATE PROCEDURE sp_uus_klubi(in a_nimi varchar(100), in a_aadress varchar(100), out a_id integer) BEGIN DECLARE l_id integer; INSERT INTO klubi (nimi, aadress) VALUES (a_nimi, a_aadress); SELECT @@identity INTO l_id; MESSAGE 'Uus klubi: ' l_id; SET a_id = l_id; END
Protseduuride väljakutsumine create variable uusid integer; call sp_uus_klubi('valga Valge', 'Valga', uusid); select uusid;
Tulemuseks tabel CREATE PROCEDURE sp_klubimangija (in a_klubi_id integer) RESULT ("eesnimi" varchar(50), "perenimi" varchar(50), "kuupaev" date) BEGIN select eesnimi, perenimi, current date from isik where klubi = a_klubi_id order by eesnimi ; END
Kasutamine call sp_klubimangija(51)
Result Set Procedure vs View? Protseduuri kasutamise eelised Eelkompileritud -> kiirem Tegelikkuses tänapäeval pole enam vahet ABS id puhverdavad ja kompileerivad suvalisi päringuid Mitu tabelit (multiple result sets) ühes väljundis Pöörduja peab toetama (ODBC vs OLE-DB, isqlc vs isqlj) Protseduuri erinevus (+ või -?) Andmete järjekorda ei saa muuta
Indeksid
CREATE INDEX CREATE INDEX <nimi> ON <tabel> ({veerud ja suunad}) Suunad on: asc ja desc (kasvavalt ja kahanevalt). Vaikimisi on asc. Ei saa kasutada avaldisi! Ei saa teha, kui keegi kasutab tabelit!
Näited CREATE INDEX ix_algus ON partii (algushetk desc) CREATE INDEX ix_nimi ON isik (perenimi asc, eesnimi asc)
Indeksi kustutamine DROP INDEX <nimi>
Ülesanne nr 6 1. Luua f-n klubiliikmete arvu leidmiseks klubi id põhjal f_klubisuurus(...) 2. Luua f-n ees- ja perenime kokku liitmiseks eesti ametlikul viisil ("perenimi, eesnimi") f_nimi(...) 3. Luua f-n ühe mängija partiide koguarv f_mangijakoormus(...) 4. Luua protseduur sp_uus_isik, mis lisab eesnime ja perenimega määratud isiku etteantud numbriga klubisse ning paneb neljandasse parameetrisse uue isiku ID väärtuse.
5. Luua tabelit väljastav protseduur sp_infopump() See peab andma välja unioniga kokku panduna järgmised asjad (kasutades varemdefineeritud võimalusi): 1) klubi nimi ja tema mängijate arv (kasutada funktsiooni f_klubisuurus) 2) turniiri nimi ja tema jooksul tehtud mängude arv (kasutada group by) 3) mängija nimi ja tema poolt mängitud partiide arv (kasutada f_nimi ja f_mangijakoormus) ning tulemus sorteerida nii, et klubide info oleks kõige ees, siis turniiride oma ja siis alles isikud. Iga grupi sees sorteerida nime järgi 6. Luua tabelit väljastav protseduur sp_top10, millel on üks parameeter - turniiri id, ja mis kasutab vaadet v_edetabel ja annab tulemuseks kümme parimat etteantud turniiril. 7. Luua indeks turniiride algusaegade peale 8. Luua indeks partiidele kahanevalt valge ja musta tulemuse peale