COMPUTERWORLD
pod kapotou
Kurzor

NahlΘdnutφm do novodob²ch slovnφk∙ cizφch slov si lze o pojmu kurzor pouze potvrdit p°edstavu, kterou o n∞m mß v∞tÜina u₧ivatel∙ poΦφtaΦ∙: kurzor je poziΦnφ ukazatel na obrazovce. Jist∞ v tuto chvφli nechßpete, jak to souvisφ s databßzovou abecedou a proΦ bychom se takovΘ nicotnΘ v∞ciΦce m∞li podrobn∞ v∞novat. Mimochodem, slovnφk z r. 1930 nabφzφ trochu jin² v²znam: kursor (v starΘm pravopisu) je b∞houn, posel. Dnes bychom spφÜe °ekli b∞₧ec. P°ipojφme jeÜt∞ t°etφ v²znam slova kurzor, tj. kurzor jako objekt jazyka SQL.

Je vÜeobecn∞ znßmo minimßln∞ trojφ pou₧itφ SQL:

  • SQL jako dotazovacφ (nebo obecn∞ji manipulaΦnφ) jazyk pro relaΦnφ databßze,
  • SQL jako slo₧ka hostitelskΘho jazyka pro programovßnφ databßzov²ch aplikacφ,
  • SQL jako jazyk komunikace mezi r∙zn²mi zdroji dat.

P°ipus¥me, ₧e prvnφ pou₧itφ je stßle °idÜφ, i kdy₧ ne zcela neaktußlnφ. V n∞kter²ch aplikacφch jsou stßle pot°eba prost°edky umo₧≥ujφcφ formulovat netrivißlnφ ad hoc dotazy na kterΘ nestaΦφ b∞₧nΘ formulß°ovΘ jazyky Φi p°edem p°ipravenΘ u₧ivatelskΘ obrazovky. T°etφ oblast pokr²vß situace, kdy po₧adavky na data jsou automaticky p°eformulovßny do SQL a zaslßny (vzdßlenΘmu) zdroji dat. Zam∞°φme se na oblast programovßnφ aplikacφ, kde hostitelsk²m jazykem je b∞₧n² programovacφ jazyk (nap°. C) a nßstrojem zφskßnφ dat z databßze je SQL. Dialekt jazyka SQL zapojen² do programovacφho jazyka se naz²vß vno°en² SQL.

Pro zφskßnφ data z databßze slou₧φ v SQL p°φkaz SELECT, kter² vracφ mno₧inu, p°φpadn∞ multimno₧inu (obsahuje opakujφcφ se prvky) °ßdk∙. Tato nespornß v²hoda jazyka, tj. jeho mno₧inovß orientace, je ovÜem zcela degradovßna na ·rovni jazyka programovacφho. Programovacφ jazyk nemß toti₧ k dispozici p°φmΘ prost°edky pro prßci s mno₧inami dat. Tato asymetrie, mimochodem nejΦast∞ji kritizovanß, vlastn∞ znamenß, ₧e je nutno disponovat mechanismem, kter² by umo₧nil zpracovßvat v²sledek SELECT p°φkazu p°ijateln²m zp∙sobem. A takov²m mechanismem je prßv∞ kurzor.

JeÜt∞ ne₧ budeme kurzor definovat, vy°φdφme jeden jednoduch² p°φpad. Ve specißlnφm p°φpad∞ je v²sledkem SELECT p°φkazu jeden °ßdek (p°esn∞ji jednoprvkovß mno₧ina). Pak nenφ problΘm ulo₧it komponenty °ßdku do prom∞nn²ch programovacφho jazyka.

Vzpome≥me relaci KINO(N┴ZEV,ADRESA, JM╔NO_V). Chceme-li pracovat v rßmci programu s jmΘnem vedoucφho n∞jakΘho kina, staΦφ napsat p°φkaz

EXEC SQL SELECT JM╔NO_V INTO :VEDOUC═

FROM KINO WHERE N┴ZEV = :K_N┴ZEV;

P°edpoklßdejme, ₧e p°ed tφmto p°φkazem n∞kde p°edchßzel p°φkaz p°ipojenφ k pot°ebnΘ databßzi. Pro porozum∞nφ danΘmu dotazu SQL je t°eba v∞d∞t, ₧e:

  • SQL p°φkazy vno°enΘ do programovacφho jazyka jsou p°edsazeny EXEC a jsou, nap°. v jazyku C, zakonΦeny znakem ;. Z toho plyne nutnost existence p°edkompilßtoru, kter² takovΘ p°φkazy p°em∞nφ v posloupnost volßnφ funkcφ v danΘm programovacφm jazyce. Vztah p°edkompilace/kompilace se liÜφ u r∙zn²ch relaΦnφch S╪BD.
  • Pou₧itΘ p°φkazy SQL mohou obsahovat odkazy na prom∞nnΘ z hostitelskΘho jazyka. Tyto prom∞nnΘ jsou p°edsazeny znakem : a jsou deklarovßny ve specißlnφ sekci ohraniΦenΘ p°φkazy EXEC SQL BEGIN DECLARE SECTION a EXEC SQL END DECLARE SECTION. P°φkazy deklarujφcφ prom∞nnΘ se op∞t v r∙zn²ch relaΦnφch S╪BD vzßjemn∞ liÜφ.
  • Prom∞nnß K_N┴ZEV umo₧≥uje nastavit skuteΦn² nßzev kina p°ed spuÜt∞nφm p°φkazu SELECT. To znamenß, ₧e dotaz je vlastn∞ jednoduÜe parametrizovßn.
  • V²sledek p°φkazu je nejv²Üe jedna hodnota (N┴ZEV je v relaci KINO primßrnφm klφΦem), kterß se ulo₧φ v prom∞nnΘ VEDOUC═ programovacφho jazyka.

I v obecnΘm p°φpad∞, kdy v²sledkem SELECT p°φkazu je vφce °ßdk∙, dovoluje rozhranφ mezi SQL a programovacφm jazykem p°enΘst pouze jeden °ßdek, bu∩ z programu do databßze nebo naopak. A k tomu prßv∞ slo₧φ kurzor. Kurzor je objekt jazyka SQL, kter² Φφsluje zßznamy v mno₧in∞ zφskanΘ pomocφ p°φkazu SELECT a dovoluje aktualizovat nebo odstra≥ovat b∞₧n² zßznam adresovan² kurzorem.

Zamysleme se na chvφli, proΦ bylo zvoleno prßv∞ toto °eÜenφ. D∙vod je prost². Z hlediska souΦasn²ch (klasick²ch) programovacφch jazyk∙ by bylo mo₧nΘ pou₧φt jeÜt∞ pole, do kterΘho by se v²sledek SELECT p°φkazu ulo₧il. To je ovÜem nevhodnΘ, proto₧e neznßme dop°edu, jak velk² bude v²sledek, a pole, jak je znßmo, je datovß struktura implementovanß ve vnit°nφ pam∞ti.

Vysv∞tlφme pojem kurzoru na p°φklad∞. Chceme zpracovßvat informace o kinech spolu s jejich adresou, kde se hraje dan² film. V programu definujeme kurzor pomocφ SELECT p°φkazu.

EXEC SQL DECLARE CURSOR KDE_TO_HRAJ═ FOR

SELECT (N┴ZEV,ADRESA) FROM P╪EDSTAVEN═, KINO

WHERE P╪EDSTAVEN═.N┴ZEV = KINO.N┴ZEV AND JM╔NO_F = :X;

P°edpoklßdejme, ₧e prom∞nnß X byla definovßna a ₧e bude slou₧it pro parametrizaci podle jmΘna filmu, pro kter² chceme zφskat mno₧inu dvojic (nßzev kina, adresa kina), kde se dan² film hraje. Pozor, jde pouze o deklaraci a ₧ßdn² pohyb dat z databßze jeÜt∞ nenφ aktivizovßn. Na to je t°eba nejprve kurzor KDE_TO_HRAJ═ otev°φt p°φkazem OPEN. Teprve v tomto okam₧iku databßzov² monitor p°ipravφ vyhodnocenφ p°φkazu SELECT a to s prßv∞ danou hodnotou prom∞nnΘ X. JednotlivΘ °ßdky v²sledku se zφskßvajφ p°φkazem FETCH-INTO, kde za INTO uvedeme prom∞nnΘ, do kter²ch chceme ulo₧it komponenty prßv∞ zφskanΘho °ßdku. V jazyku C pak zφskßme Φßst programu

EXEC OPEN KDE_TO_HRAJ═;

WHILE (TRUE) {

EXEC SQL FETCH KDE_TO_HRAJ═

INTO(:INAZEV_K,:IADRESA)

IF (SQLCA.SQLCODE == 100)

BREAK;

zpracovßnφ prom∞nn²ch

}

EXEC SQL CLOSE KDE_TO_HRAJ═;

Ukßzka okam₧itΘho nastavenφ kurzoru je na obr. 1.


sm∞r pohybu kurzoru

Obr. Kurzor na danΘ pozici

Za povÜimnutφ stojφ velmi primitivnφ p°φkaz testujφcφ ·sp∞Ünost provedenφ p°φkazu FETCH. SQLA (SQL Communication Area) je datovß struktura obsahujφcφ prom∞nnΘ pou₧itelnΘ pro komunikaci mezi programem a databßzov²m monitorem. Obsahuje-li jejφ slo₧ka SQLCODE hodnotu 100, ₧ßdn² dalÜφ °ßdek ji₧ nebyl vybrßn a program vyskoΦφ z cyklu. Obecn∞jÜφ p°φstup k °eÜenφ chybov²ch situacφ je pomocφ p°φkazu EXEC WHENEVER podmφnka akce;. Ten umo₧≥uje pokr²t vφce chybov²ch situacφ a reakce na n∞ (nap°. skok do jinΘ Φßsti programu, zastavenφ programu, volßnφ naprogramovanΘ funkce). Pomocφ CLOSE se kurzor zavφrß, tj. znep°φstupnφ se aktivnφ mno₧ina °ßdk∙ dan²ch SELECT p°φkazem.

Kurzor je jakΘsi pojmenovanΘ posuvnΘ okΘnko (b∞₧ec) umo₧≥ujφcφ pomocφ p°φkazu SELECT zφskat jistß data, p°φkazem FETCH se po nich pohybovat stylem ôjeden °ßdek v Φaseö a umis¥ovat data do p°ipraven²ch prom∞nn²ch.

Princip kurzoru p°ipomφnß Φtenφ sekvenΦnφho souboru v klasick²ch jazycφch hromadnΘho zpracovßnφ dat, tj. po jednom a v jednom sm∞ru o zaΦßtku do konce. Jeden °ßdek odpov∞di m∙₧e b²t Φten pouze jednou. Jinak je t°eba kurzor zav°φt a znovu otev°φt. Podobnost se sekvenΦnφm souborem ale nelze zam∞nit za ekvivalenci. P°i pou₧itφ FETCH nemusφ b²t v²sledek p°φkazu SELECT k dispozici, °ßdky v²sledku se mohou konstruovat dynamicky.

V SQL92 je koncepce kurzoru dovedena dßl. Je ji₧ simulovßn jist² "p°φm² p°φstup". Je mo₧nΘ se pohybovat od danΘ pozice dop°edu a zp∞t, dokonce i o vφce mφst, p°φpadn∞ absolutn∞ na °ßdek zadan² Φφslem. Tyto mo₧nosti (SCROLL CURSOR) se dnes ji₧ vyskytujφ v °ad∞ implementacφ (i kdy₧ nespl≥ujφ cel² standard SQL92).

S kurzorem takΘ souvisφ p°φkazy DELETE a UPDATE. Lze je pou₧φt tak, ₧e se odstranφ, resp. aktualizuje °ßdek relace, na kter² prßv∞ ukazuje dan² kurzor. Kurzor ovÜem musφ b²t definovßn FOR UPDATE.

SQL92 vy°eÜil takΘ dalÜφ d∙le₧it² problΘm. Jak se mß kurzor chovat u transakΦnφho zpracovßnφ, kdy₧ jinß transakce m∞nφ °ßdky relace, na kterΘ zrovna ukazuje nebo bude ukazovat m∙j kurzor? V definici kurzoru lze zadat klφΦovΘ slovo INSENSITIVE, co₧ znamenß, ₧e °ßdky p°φstupnΘ kurzoru se nebudou m∞nit b∞hem doby, kdy je kurzor otev°en. Bez INSENSITIVE je mo₧nΘ nap°. dosßhnout, ₧e obdr₧enφ 23. °ßdku pou₧itφm FETCH na KDE_TO_HRAJ═ (v p°φpad∞, ₧e je definovßn jako SCROLL) m∙₧e vΘst p°i druhΘm po₧adavku na t²₧ °ßdek k jeho jinΘ hodnot∞. DalÜφ chovßnφ kurzoru je spojeno s jeho pou₧itφm v transakΦnφm zpracovßnφ (·rovn∞ isolace), co₧ ovÜem ji₧ p°ekraΦuje cφl dneÜnφ ·vahy.

Jakß je budoucnost kurzor∙? Jist∞ se budou jeÜt∞ n∞jak² Φas pou₧φvat. Blφ₧φ se vÜak standard pracovn∞ zvan² SQL3, kter² p°edklßdß zvlßÜtnφ jazyk pro psanφ transakcφ, co₧ povede k tomu, ₧e aplikace se obejde bez vn∞jÜφho programovacφho jazyka Φi jazyka 4GL. Bude znamenat jistou revoluci v programovßnφ, ale i krok kup°edu sm∞rem ke kooperativnφmu zpracovßnφ. Pomocφ SQL bude mo₧nΘ zφskßvat nejen data ze vzdßlenΘ databßze, ale obdr₧et je nap°. zpracovanΘ tam zaslan²m vlastnφm aplikaΦnφm programem.



<seznam dφl∙ serißlu>   <COMPUTERWORLD>