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.