Klauzula
WHERE pre SQL príkaz
SELECT, ktorý vykoná výber z tabuľky, je definovaná buď hodnotou výrazu
strExpression_Str, alebo, ak táto hodnota nie je zadaná,
tak hodnotami definovaných (platných) kľúčových položiek (položky označené ako
kľúčové pri definícii objektu typu
Tabuľka) v prvom riadku štruktúry (
rowIdent alebo
localStructIdent[1]).
Nastavenie týchto hodnôt musí byť realizované pred akciou
DB_READ (
DBS_READ).
Z toho vyplýva, že klauzula
WHERE nie je súčasťou SQL príkazu
SELECT, ak nie je definovaná hodnota výrazu
strExpression_Str a
- neexistujú kľúčové položky (položky označené ako kľúčové pri definícii objektu typu
Tabuľka),
- alebo nie je definovaná (platná) ani jedna z hodnôt kľúčových položiek,
- alebo štruktúra má nulovú dimenziu (v prípade localStructIdent).
Prvá forma zápisu akcie umožňuje prečítať jeden riadok z tabuľky do
jedného riadku štruktúry.
Ak pri výbere vyhovuje podmienke pre výber viac ako jeden riadok tabuľky, akcia
DB_READ(DBS_READ)
načíta prvý riadok. Ak nevyhovuje ani jeden riadok, akcia vráti chybu prostredníctvom
retCodeIdent_Int. Typ
štruktúry (
rowIdent) musí byť zhodný s typom tabuľky.
Druhá forma zápisu umožňuje prečítať jeden, alebo viac riadkov z tabuľky. Maximálny počet riadkov určuje hodnota parametra
maxRows. Ak hodnota
maxRows je nastavená na -1, systém sa snaží prečítať všetky riadky zodpovedajúce zadanej
podmienke. Maximálny počet riadkov je obmedzený konfiguračným parametrom databázy
Maximum vrátených riadkov.
Pri prekročení tohto počtu riadkov bude do lokálnej štruktúry
localStructIdent načítaných prvých
Maximum vrátených riadkov
a v
retCodeIdent_Int sa vráti chyba
_ERR_DATABASE_ROWS_LIMIT.
Ak je hodnota
maxRows väčšia ako
Maximum vrátených riadkov, načíta sa najviac
Maximum vrátených riadkov
riadkov. Pokiaľ je k dispozícii viac riadkov, v
retCodeIdent_Int sa vráti chyba
_ERR_DATABASE_ROWS_LIMIT.
Ak je hodnota
maxRows nastavená na -2, systém najskôr zistí počet riadkov zodpovedajúcich danej podmienke. Ak ich
je 0 alebo viac ako
Maximum vrátených riadkov, nenačíta žiadne riadky, v opačnom prípade načíta zistený počet riadkov. Tento spôsob môže byť z
optimalizačných dôvodov rýchlejší ako pre maxRow=-1. Počet riadkov sa zisťuje pomocou
výberu "
SELECT COUNT(*)
FROM table_name [WHERE where_condition]".
Ak je zadaná podmienka StrExpression_Str, pred zistením počtu
riadkov sa ešte zisťuje, či podmienka obsahuje klauzulu ORDER BY. Ak
klauzulu obsahuje, táto sa aj s nasledujúcim
textom odstráni. Dôvodom je, že pri zisťovaní počtu riadkov napr. Sybase neakceptuje "SELECT COUNT(*) FROM aaaa
WHERE bbbb = cccc ORDER BY dddd" a vracia chybu Function or column reference to 'dddd' in the select list must
also appear in a GROUP BY.
Parameter localStructIdent musí predstavovať meno lokálnej štruktúry zodpovedajúceho typu (t.j. rovnakého, aký je použitý v
konfigurácii objektu dbObjIdent typu Tabuľka). Pokiaľ chcete mať istotu, že výstup nebude riadený klauzulou
WHERE vyskladanou na základe kľúčových položiek, je vhodné pred volaním akcie DB_READ(DBS_READ) redimenzovať lokálnu štruktúru na 0.
Po výbere riadkov z tabuľky sú tieto prenesené do premennej localStructIdent. V prípade potreby je jej zmenený
rozmer (REDIM). Ak výberovej podmienke nevyhovuje ani jeden riadok, akcia
sa ukončí úspešne
(retCodeIdent_Int = _ERR_NO_ERROR) a rozmer štruktúry localStructIdent
sa zmení na 0.
Výhodou akcie DBS_READ pri práci s tabuľkou je možnosť vynechať jej otvorenie a zatvorenie (jednoduchší
zápis).
Pre D2000 verziu 5: Nevýhoda akcie DBS_READ je v rýchlosti. Každé volanie akcie DBS_READ
má za následok, v rámci jej obsluhy v procese D2000 DBManager, nutnosť databázu otvoriť a následne zatvoriť, čo môže byť časovo náročná činnosť a
predstavuje z databázového hľadiska pomerne neštandardný postup. Nutnosť otvárania a zatvárania databázy je možné potlačiť v rámci transakčného spracovania tak, že za príkaz uvedieme
parameter TRANS.
Pre D2000 verziu 6 a vyššie:
Optimalizácia procesu
D2000 DBManager (recyklovanie spojení, predpripravené spojenia) spôsobila, že akcia DBS_READ sa vykoná rovnako
rýchlo ako DB_READ a navyše sa ušetrí čas potrebný na spracovanie explicitného príkazu na otvorenie databázy
DB_CONNECT.