Kursoret ne MySql
Problemi : Perpunimi i te dhenave te vijne nga shume tabela te ndryshme.
Ne rastin kur duam qe keto te dhena ti perpunojme rresht per rresht, ose duam te veprojme vetem mbi nje apo disa rreshta specifike, mund te na vije ne ndihme nje query e tejzgjatur ose nje loop (p.sh. while) me nje forme specifike inkrementimi. Performanca e ulet.
Zgjidhja: Kursoret
Cfare jane kursoret
Kursoret jane nje strukture kontrolli qe mundesojne shetitjen neper elementet e bazes se te dhenave. Kursoret perdoren nga programuesit e bazave te te dhenave per te perpunuar te dhenat qe vijne si rezultat i query-ve, qe dergojme ne bazen e te dhenave. Njesoj sikur ti perpunoje te dhenat me ane te nje loop-i. Kursoret mund te perdoren brenda stored procedures, stored functions.
Karakteristikat e kursoreve jane:
Jo te ndjeshem (asensitive): Nuk mund te krijojne kopje te tabeles.
Vetem te lexueshem (read only): Kursori nuk mund te behet update.
Jo e shkallezueshme (non scalable): Kursori shetit vetem ne nje drejtim dhe nuk mund te kaperceje ndonje rresht.
Perdorimi i tyre (sintaksa dhe shembull)
Me poshte jepet shembulli i procedures se usp_GetStudenti, versioni me kursore.
Per te testuar shembullin duhet krijuar paraprakisht edhe tabela liste_emrash.
CREATE TABLE liste_emrash (emri VARCHAR(20), mbiemri VARCHAR(20))
Ne shembull jepen 5 elementet qe perbejne kursorin.
Ne shembullin me siper eshte perzgjedhur CONTINUE HANDLER i cili percakton sjelljen ne rastin kur mberrijme ne fund te te dhenave te query-t. Ne nje rast te tille, dilet nga loop-i dhe ekzekutimi vazhdon me tej.
Handler te tjere jane:
EXIT HANDLER i cili kur plotesohet kushti ben nderprejen e ekzekutimit te bllokut
BEGIN
————–
END
UNDO HANDELR nuk suportohet ende.
Ekzekutojme proceduren:
CALL universiteti.ups_GetStudentetEmri
Rezultati i ekzekutimit te procedures eshte tabela universiteti.liste-emrash
Avantazhe
Kursoret, kane perdorim kryesor kur duam te kapim nje rresht te caktuar ose disa rreshte nje nga nje.
Jane efikase pasi me kursoret mund te kryesh veprime pa pasur nevojen e querive komplekse me shume INNER JOIN.
Disavantazhe
Kursori eshte me i shpejte se loop-i while por krijon me teper overhead ne bazen e te dhenave.
Kursori i kap rreshtat nga baza e te dhenave nje e nga nje, ndaj nese kemi shume te dhena edhe koha e ekzekutimit do te me e madhe.