Akcia DB_READ a DBS_READ


Funkcia
Čítanie jedného alebo viacerých riadkov z tabuľky.


Deklarácia
DB_READ handleIdent_Int, rowIdent, retCodeIdent_Int [WHERE strExpression_Str [BINDIN varIdent1, varIdent2, ... ]][ORAHINT hintIdent_Str] 


DB_READ handleIdent_Int, rowIdent, retCodeIdent_Int [WHERE strExpression_Str [BINDIN structRowIdent ]] [ORAHINT hintIdent_Str]


DBS_READ dbObjIdent, rowIdent, retCodeIdent_Int [WHERE strExpression_Str [BINDIN varIdent1, varIdent2, ... ]] [TRANS transHandle_Int] [ORAHINT hintIdent_Str]


DBS_READ dbObjIdent, rowIdent, retCodeIdent_Int [WHERE strExpression_Str [BINDIN structRowIdent ]] [TRANS transHandle_Int] [ORAHINT hintIdent_Str]
 


alebo


 


DB_READ handleIdent_Int, localStructIdent, retCodeIdent_Int, maxRows_Int [WHERE strExpression_Str [BINDIN varIdent1, varIdent2, ... ]] [ORAHINT hintIdent_Str]


DB_READ handleIdent_Int, localStructIdent, retCodeIdent_Int, maxRows_Int [WHERE strExpression_Str [BINDIN structRowIdent ]] [ORAHINT hintIdent_Str]


DBS_READ dbObjIdent, localStructIdent,retCodeIdent_Int, maxRows_Int [WHERE strExpression_Str [BINDIN varIdent1, varIdent2, ... ]] [TRANS transHandle_Int] [ORAHINT hintIdent_Str]


DBS_READ dbObjIdent, localStructIdent,retCodeIdent_Int, maxRows_Int [WHERE strExpression_Str [BINDIN structRowIdent ]] [TRANS transHandle_Int] [ORAHINT hintIdent_Str]
Parametre
handleIdent_IntinIdentifikátor typu Int - (handle) spojenia s tabuľkou (DB_CONNECT).
dbObjIdentinOdkaz na objekt typu Tabuľka.
rowIdent_Intin/outIdentifikátor jedného riadku štruktúry (výsledok čítania).
retCodeIdent_IntoutIdentifikátor návratovej hodnoty - úspešnosť akcie.
localStructIdentoutIdentifikátor celej lokálnej štruktúry.
maxRows_IntinIdentifikátor - maximálny počet čítaných riadkov.
strExpression_StrinVýraz, ktorý definuje čítaný riadok tabuľky (riadky). Výraz môže obsahovať aj podmienku triedenia (napr. "ID<100 ORDER BY Name"). Pokiaľ je výraz parametrizovaný, musí byť uvedené aj kľúčové slovo BINDIN nasledované hodnotami parametrov (structRowIdent alebo varIdent1, varIdent2, ...).
varIdent1,
varIdent2, ...
inZoznam objektov, konštánt alebo lokálnych premenných, ktoré sa použijú na mieste parametrov parametrizovaného výrazu strExpression_Str.
structRowIdentinOdkaz na riadok lokálnej premennej typu Record alebo na riadok štruktúrovanej premennej. Hodnoty z tohto riadku sa použijú na mieste parametrov parametrizovaného SQL výrazu strExpression_Str.
transHandle_IntinIdentifikátor Pripojenia na databázu.
hintIdent_StrinVýraz typu String, ktorý definuje Oracle SQL hint. Ten je použitý ako inštrukcia pre optimalizátor výkonu SQL príkazu. Zapisuje hodnotu bez úvodných a koncových znakov /*+ <orahint> */.
Príklad použitia je uvedený tu.
Návratový kód
Hodnota parametra retCodeIdent_Int - pozri tabuľku chybových stavov. Je možné získať rozšírenú informáciu o chybe.
Popis

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).
Pozn: ak nie je zadaná ani podmienka, ani tabuľka nemá kľúčové stĺpce, načítajú sa všetky dáta z tabuľky (ak ich nie je viac ako špecifikované maximum).

Pozn: ak sú čítané dáta do jedného riadku štruktúry (verzie s parametrom rowIdent_Int) s použitím kľúčových položiek, tak hodnoty všetkých kľúčových položiek v rowIdent_Int musia byť platné, inak sa čítanie neuskutoční, skončí s chybou a %GetLastExtErrorCode() vráti chybu 667.

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.


Súvisiace stránky:

Write a comment...