SQL POVELY
 
 
 

Můžeme očekávat, že SQL/DS bude generovat kód srovnatelný s ručně psanými programy v mnoha jednoduchých případech a nesrovnatelně lepší v mnoha složitých případech.
E. F. CODD: Relational Datbase: A Practical Foundation for Productivity. CACM, č. 2 1982, s. 109

IBM DB2 je systém řízení databáze, který implementuje relační model dat. Z pohledu uživatele je relační databáze množinou tabulek (souborů). Každý řádek (věta) tabulky obsahuje množinu sloupců (polí). Všechny řádky tabulky mají tutéž formu.

Operace s daty se provádí pomocí jazyka Structured Query Language - SQL. Tento jazyk umožňuje vytvářet, modifikovat, rušit tabulky; vyhledávat, měnit, rušit data v tabulkách; přidávat data do tabulek. Tím, že povely SQL můžete uvádět v textu svých programů, jsou překonána všechna omezení kladená na příkazy vstupu a výstupu u jazyka Rexx v prostředí AS/400.

Ukažme si možnosti a způsob využití SQL: Vytvoříme si jednoduchý oboustranný anglicko-česko-anglický slovník a napíšeme si program pro jeho praktické využívání. Slovník vytvoří program SLOVNIK:

/* SLOVNIK vytváří anglicko-česko-anglický slovnik */
address EXECSQL
EXECSQL 'SET OPTION COMMIT = *NONE'
EXECSQL 'CREATE TABLE MYLIB/DICTIONARY',
  ' (E_SLOVO CHAR(20) NOT NULL,',
  ' C_SLOVO CHAR(20) NOT NULL)'

INS = 'INSERT INTO MYLIB/DICTIONARY VALUES(?, ?)'
EXECSQL 'PREPARE I1 FROM :INS'
say "Napiš dvojice slov: anglické-české"
do forever
  say "anglické-české"
  parse linein E "-" C
  if E = "" then leave
  EXECSQL 'EXECUTE I1 USING :E, :C'
  if RC = 0 then say "OK"; else say "Chyba, RC =" RC
end

Příkaz address EXECSQL v programu určuje, že řetězec znaků, který není rozpoznaným příkazem jazyka Rexx, bude předán do prostředí provádějícího povely SQL.

Implicitním nastavením programu v jazyce Rexx je volba COMMIT = *CHG. Pokud tabulka není souborem zabezpečeným žurnálem, musíte uvést explicitní povel SQL

'SET OPTION COMMIT = *NONE'.

Povelem 'CREATE TABLE MYLIB/DICTIONARY (E_SLOVO CHAR(20) NOT NULL, C_SLOVO CHAR(20) NOT NULL)' se vytváří tabulka se dvěma sloupci: prvním pro anglická a druhým pro česká slova.

Povel PREPARE

'PREPARE I1 FROM :INS'

připravuje k provedení povel

'INSERT INTO MYLIB/DICTIONARY VALUES(?, ?)'

v proměnné INS. Takto připravený povel je pak dynamicky proveden povelem EXECUTE

'EXECUTE I1 USING :E, :C'.

Jména začínající dvojtečkou označují v SQL povelech programové proměnné (host variables). Hodnoty proměnných E a C jsou uloženy do sloupců jednoho řádku tabulky DICTIONARY.

Proměnná RC indikuje zda byl povel SQL proveden bezchybně (RC je nula) nebo ne (RC má nenulovou hodnotu).

Následuje příklad dialogu člověka s programem SLOVNIK při vytváření slovníku:

Start of terminal session.
Napiš dvojice slov: anglické-české
abandon-opustit
OK
abandon-vzdát se
OK
abandon-oddávat se
OK
abbey-opatství
OK
abbreviation-zkratka
OK
abdicate-vzdát se
OK
 
Press ENTER to end terminal session.

Programem HLEDEJ, budeme oboustranný slovník využívat.

/* HLEDEJ překlad v anglicko-česko-anglickém slovníku */
address EXECSQL
EXECSQL 'SET OPTION COMMIT = *NONE'
do until Odpoved = "A" | Odpoved = "C"
  say "Anglicko->český nebo česko->anglický? (A/C)"
  parse upper linein Odpoved
end
Vyzva.A = "Word to translate"; Vyzva.C = "Napiš slovo"
if Odpoved = "A" then
  SEL = 'SELECT C_SLOVO FROM MYLIB/DICTIONARY WHERE E_SLOVO = ?'
  else
  SEL = 'SELECT E_SLOVO FROM MYLIB/DICTIONARY WHERE C_SLOVO = ?'
EXECSQL 'PREPARE S1 FROM :SEL'
EXECSQL 'DECLARE C1 CURSOR FOR S1'
do forever
  say Vyzva.Odpoved; parse linein Slovo
  if Slovo = "" then leave
  EXECSQL 'OPEN C1 USING :SLOVO'
  do forever
    EXECSQL 'FETCH C1 INTO :PREKLAD'
    if SQLCODE <> 0 then leave
    say COPIES(" ", 10) Preklad
  end
  say COPIES(" ", 10) ".."; EXECSQL 'CLOSE C1'
end

Ukazatel do tabulky, která je výsledkem SQL povelu, se v terminologii SQL nazývá kurzor. Umožňuje prozkoumat výsledek povelu SQL - tabulku - řádek po řádku. V našem případě je výsledkem povelu SELECT tabulka - prázdná (není-li slovo ve slovníku), jednořádková nebo víceřádková, tvořená těmi řádky, které mají v tomtéž sloupci uvedeno stejné slovo, jako slovo přijaté z klávesnice. Po otevření kurzoru můžeme tyto řádky číst povelem FETCH. Kurzor je zprvu nastaven před první řádek výsledné tabulky. Tento řádek je běžným řádkem pro povel FETCH, který obsah řádku uloží do programových proměnných uvedených v klauzuli INTO (v našem případě je to jediná programová proměnná Preklad). Běžným řádkem se nyní stane druhý řádek výsledné tabulky atd. dokud tabulku neprojdeme celou. O tom, že jsme dosáhli poslední věty výsledku, nás informuje proměnná SQLCODE hodnotou 100. Po prozkoumání výsledné tabulky (přečtení, případně změně nebo zrušení řádků), je kurzor uzavřen povelem CLOSE. Máme-li ho použít znovu, musíme ho opět otevřít povelem OPEN. Podívejte se, jak by mohl vypadat dialog člověka s programem HLEDEJ:

Start of terminal session.
Anglicko->český nebo česko->anglický? (A/C)
A
Word to translate:
abandon
           opustit
           vzdát se
           ..
Word to translate:
robot
           ..
Word to translate:
abbreviation
           zkratka
           ..
Word to translate:
 
Press ENTER to end terminal session.

Zkusili jste to? A ono to nechodí?


 
  Shrnutí

Zvláštností jazyka Rexx v prostředí AS/400 je vstup a výstup. Je zvláštností, ale, jak jste mohli vidět, není omezením. Vaše aplikace mohou využívat standardní vstup a výstup, externí datovou frontu, kouzla AS/400, jakým je třeba Query/400, a také veškeré možnosti jazyka SQL při přístupu k relační databázi. V prostředí AS/400, kde je jen jediná relační databáze, to znamená, že tyto povely můžete používat při práci s libovolnými soubory.
 

 
 


 Jak napsat a spustit program

 Standardní vstup a výstup

 Externí datová fronta

 SQL povely


hlavní stránka english
změněno 26. duben 2002
Copyright © 1998-2002 Vladimír Zábrodský