|
![]() | Deklarace kurzoru | ![]() | Deklarace objektů v SQL |
deklarace_tabulky ::= DECLARE TABLE jméno (popis_elementu {, popis_elementu}... ) popis_elementu ::= popis_sloupce | popis_omezení popis_omezení ::= [CONSTRAINT jméno_omezení] { popis_indexu | vnitřní_integritní_omezení | referenční_integritní_omezení }
Touto deklarací se uvnitř složeného příkazu (bloku) deklaruje dočasná lokální tabulka, viditelná pouze pro klienta uvnitř bloku. Tabulka se vytvoří při vstupu do bloku a zanikne při výstupu z bloku. Existence této tabulky je dána hranicemi bloku, nikoliv dobou transakce. Zápis do lokální tabulky neovlivní data v databázi. Definice tabulky není uložena v systémové tabulce tabulek.
SQL syntaxe popisu_elementu je totožná s příkazem CREATE TABLE.
Při navrhování dočasné tabulky je třeba brát zřetel na dobu kontroly integritních omezení. Je-li kontrola odložena na konec transakce (implicitní stav, pokud není změněno nastavením příznaku kompatibility SQLOPT_CONSTRS_DEFERRED (16384)), lze v rámci složeného příkazu (např. procedury) vkládat a přepisovat záznamy, které podmínky porušují - kontrola se neprovede nikdy, protože tabulka zanikne ještě před koncem transakce. Vynutit si kontrolu lze buď v popisu omezení zapsáním klauzule INITIALLY IMMEDIATE (v popisu sloupce se zadat nedá) nebo důsledným voláním explicitního COMMIT po každém příkazu uvnitř bloku. Kontrola unikátnosti indexu se provádí vždy okamžitě (nejde odložit).
Indexy lze v lokální tabulce definovat pouze tehdy, má-li unikátní index kontrolovat jedinečnost vkládaných dat. Indexy se neuplatní při optimalizaci dotazů nad lokální tabulkou.
Lokální tabulku lze použít na všech místech, kde je očekáváno jméno tabulky s výjimkou příkazů modifikující strukturu tabulky (ALTER TABLE, CREATE INDEX, DROP INDEX) a příkazu DROP TABLE.
Mějme lokální tabulku Pokus:
DECLARE TABLE Pokus (cislo INTEGER PRIMARY KEY, jmeno CHAR(12) IS NOT NULL, dat_nast DATE, dom_sl DOMENA_CAS, CONSTRAINT ch1_date CHECK (dat_nast>CURRENT_DATE) INITIALLY IMMEDIATE, CONSTRAINT ch2_NotNull CHECK (cislo IS NOT NULL) INITIALLY IMMEDIATE);
příklady INSERTů:
// projde (NOT NULL test pro jmeno se provádí až na konci transakce) INSERT INTO Pokus (cislo,jmeno,dat_nast) VALUES (0,NULL,CURRENT_DATE+1); // vyvolá výjimku (integr. omezení ch1_date se provádí okamžitě) INSERT INTO Pokus (cislo,jmeno,dat_nast) VALUES (1,'Tonda',CURRENT_DATE); // vyvolá výjimku (test unikátnosti prim. klíče se provádí okamžitě) INSERT INTO Pokus (cislo,jmeno,dat_nast) VALUES (2,'Tonda',CURRENT_DATE+1); INSERT INTO Pokus (cislo,jmeno,dat_nast) VALUES (2,'Lenka',CURRENT_DATE+2);
![]() | Deklarace kurzoru | ![]() | Deklarace objektů v SQL |