11. CVIČENÍ |
Následující příklady ukazují SQL vnořené do jazyka C. SQL příkazy jsou označeny prefixem EXEC SQL. Na začátku je nutné do zdrojového textu zahrnout hlavičkový soubor s prototypy knihovních funkcí pro komunikaci s databází a potřebné datové struktury příkazem :
#include <stdio.h>
EXEC SQL INCLUDE sqlca.h;
EXEC SQL BEGIN DECLARE SECTION;
VARCHAR uzivatel[30];
EXEC SQL END DECLARE SECTION;
int main(int argc, char **argv) {
EXEC SQL CONNECT :uzivatel;
EXEC SQL COMMIT WORK RELEASE;
return OK;
}
|
Práce s kurzory je ve vnořeném SQL prakticky stejná jako v PL/SQL. Následující příklad ukazuje použití jednoduchého kurzoru s parametrem :
Příklad 1.
#include <stdio.h>
EXEC SQL INCLUDE sqlca.h;
EXEC SQL BEGIN DECLARE SECTION;
...
EXEC SQL END DECLARE SECTION;
int main(int argc, char **argv) {
EXEC SQL CONNECT :uzivatel;
EXEC SQL DECLARE crsr CURSOR FOR
SELECT ... ;
EXEC SQL OPEN crsr;
EXEC SQL WHENEVER NOT FOUND DO break;
for (;;) {
EXEC SQL FETCH crsr INTO :promenna;
...
}
EXEC SQL CLOSE crsr;
EXEC SQL COMMIT WORK RELEASE;
return OK;
}
|
Příklad 2.
Kurzor, který vybere a zamkne záznamy nadeklarujeme např. takto :
EXEC SQL DECLARE crsr_osoby CURSOR FOR
SELECT prijmeni, jmeno, plat, funkce
FROM osoby
WHERE plat < 2000
FOR UPDATE;
EXEC SQL DECLARE crsr_osoby CURSOR FOR
SELECT prijmeni, jmeno, plat, funkce
FROM osoby
WHERE plat < 2000
FOR UPDATE OF plat, funkce;
EXEC SQL UPDATE osoby SET plat = ..., funkce = ...
WHERE CURRENT OF crsr_osoby;
Příklad 3.
Následující příklady ukazují, jak začlenit do hostitelského jazyka příkazy DDL (vytváření tabulek, pohledů, atd.) a jak dynamicky za běhu programu sestavit dotaz. Obě zmíněné úlohy mají společné to, že využívají tzv. dynamické SQL.
Pokud SQL příkaz není dotaz a neobsahuje vazební proměnné, lze použít konstrukce EXEC SQL EXECUTE IMMEDIATE :
EXEC SQL EXECUTE IMMEDIATE
CREATE TABLE osoby (
os_cislo NUMBER(5) PRIMARY KEY,
prijmeni VARCHAR2(30) NOT NULL,
jmeno VARCHAR2(30) NOT NULL
);
EXEC SQL EXECUTE IMMEDIATE :command_string;
Příklad 4.
prikaz := "INSERT INTO osoby (jmeno, prijmeni, plat) VALUES (:par1, :par2, 10000.00)" EXEC SQL PREPARE p_vloz FROM :prikaz; jmeno := "Honza"; prijmeni := "Cervenka" EXEC SQL EXECUTE p_vloz USING :jmeno, :prijmeni; jmeno := "Honza"; prijmeni := "Zelenka" EXEC SQL EXECUTE p_vloz USING :jmeno, :prijmeni; |
Příklad 5.
prikaz := "SELECT plat FROM osoby WHERE jmeno = :par1 AND prijmeni = :par2";
EXEC SQL PREPARE p_vyber FROM :prikaz;
EXEC SQL DECLARE c_vyber CURSOR FOR :prikaz;
EXEC SQL OPEN c_vyber USING :jmeno, :prijmeni;
EXEC SQL WHENEVER NOT FOUND DO break;
for (;;) {
EXEC SQL FETCH c_vyber INTO :osoba;
...
}
EXEC SQL CLOSEEXEC SQL COMMIT WORK RELEASE |
Příklad 6.
Vnořený PL/SQL blok je do hostitelského jazyka včleněn mezi direktivy
EXEC SQL BEGIN DECLARE SECTION;
int a, b, c;
EXEC SQL END DECLARE SECTION;
a = 5; b = 6;
EXEC SQL EXECUTE;
DECLARE
tmp INTEGER;
BEGIN
:c := IARITH.ADD(:a, :b);
IARITH.INC(:c);
tmp := :c / 2;
:c := tmp + 1;
END;
END-EXEC;
printf("C = %d\n", c);
|
proc sqlcheck=semantics userid=uzivatel/heslo soubor.esql
Příklad 7.
V praxi můžeme narazit na situace, kdy je nutné, aby jeden program současně přistupoval do několika databází najednou. Ve vnořeném SQL se tato situace řeší tak, že se nadeklaruje symbolické jméno databáze :
EXEC SQL DECLARE jmeno_db DATABASE;
EXEC SQL AT jmeno_db CONNECT :uzivatel;
EXEC SQL AT jmeno_db SELECT count(*) INTO :pocet FROM osoby;
EXEC SQL AT jmeno_db COMMIT WORK RELEASE;
Příklad 8.
Příklad 9.
Vnořené SQL umožňuje poměrně snadné propojení vyššího programovacího jazyka s SQL, stejně jako rozšíření neprocedurálního SQL o procedurální rysy (data jsou uchována v databázi, algoritmus, který nelze vyjádřit pomocí SQL příkazů, je implementován ve vyšším programovacím jazyce). Nevýhodou je neshoda datových typů (impedance mismatch) SQL a hostitelského jazyka (viz poměrně nepříjemná práce s typem VARCHAR v uvedených příkladech) a fakt, že programátor se musí učit programovací jazyk navíc (popř. SQL).
Příklady naleznete zde. Jejich podrobný popis postupně zveřejním na této stránce, zatím se v nich orientujte pomocí četných komentářů.