210 likes | 354 Views
Hniezdené SQL. Michal Tom čányi. Prehľad. SQL vs. jazyky pre vývoj aplikácií prístup k dátam rozhranie pre vzájomnú interakciu Embedded (hniezdené) SQL syntax ošetrenie chýb Kurzory vlastnosti práca s kurzormi. aplikačné jazyky(3GL) Pascal,C, Java procedurálne
E N D
Hniezdené SQL Michal Tomčányi
Prehľad • SQL vs. jazyky pre vývoj aplikácií • prístup k dátam • rozhranie pre vzájomnú interakciu • Embedded (hniezdené) SQL • syntax • ošetrenie chýb • Kurzory • vlastnosti • práca s kurzormi
aplikačné jazyky(3GL) Pascal,C, Java procedurálne efektívne vyjadrenie algoritmu neprocedurálne nedefinujú „ako“ výsledok spočítať štandardné konštrukcie podmienky, cykly manipulácia dát po malých častiach dátové jazyky (4GL) PL/SQL neprocedurálne príklad: select chýbajú štandardné konštrukcie kontrast: PL/SQL množinová orientácia pri práci s dátami impedance mismatch metódy prístupu dátové typy Aplikačné jazyky vs. SQL
Aplikačné rozhranie pre SQL • priame volanie (direct invocation) • vyžaduje množinový prístup • nepoužíva sa • modulárny jazyk (module language) • hniezdené SQL (embedded SQL) • štandard definuje mapovanie dátových typov SQL na typy hostiteľského jazyka • potrebná konverzia typov - timestamp
Hniezdené SQL • SQL vložené do hostiteľského jazyka • predspracovanie pri preklade - ecpg,pcc • schéma: ... príkaz hostiteľského jazyka príkaz hostiteľského jazyka príkaz hniezdeného SQL príkaz hostiteľského jazyka ...
Syntax • SQL príkaz uvedený kľúčovými slovami: EXEC SQL • príklad: EXEC SQL SELECT user_name FROM passwd WHERE uid= :uid_to_select ; • SQL deklarácie ohraničené EXEC SQL BEGIN DECLARE SECTION EXEC SQL END DECLARE SECTION • príklad: EXEC SQL BEGIN DECLARE SECION; char user_name[20]; /* login */ int uid; /* identifikačnéčíslo */ EXEC SQL END DECLARE SECTION;
Ošetrenie chýb • pomocou konštrukcie WHENEVER • syntax: WHENEVER podmienka akcia • podmienka • SQLERROR – výnimka alebo SQLCODE<0 • NOT FOUND – žiadne dáta, SQLCODE=100 • akcia • CONTINUE – pokračovanie vo výpočte • GOTO/GO TO <návestie> – nepodmienený skok • príklad: EXEC SQL WHENEVER NOT FOUND GOTO vypis_chybu;
Príklad ošetrenia chýb 1 EXEC SQL príkaz1; 2 EXEC SQL WHENEVER SQLERROR GOTO chyba; 3 EXEC SQL príkaz2; 4 EXEC SQL WHENEVER NOT FOUND GOTO data; 5 EXEC SQL príkaz3; 6 EXEC SQL WHENEVER SQLERROR CONTINUE; 7 EXEC SQL príkaz4;
Poznámky k syntaxi • možnosť definovania znakovej sady pre premenné • EXEC SQL NAMES ARE znaková-sada • explicitná definícia premenných SQLSTATE a SQLCODE • deklarácia v C: long SQLCODE; char[6] SQLSTATE;
typ v C char VARCHAR short long float double BIT SQL ekvivalent CHARACTER CHARACTER VARYING SMALLINT INTEGER REAL DOUBLE PRECISION BIT Dátové typy pre jazyk C
#include <stdio.h> EXEC SQL include sqlca; /* alebo #include <sqlca.h> */ EXEC SQL BEGIN DECLARE SECTION; /* zdieľané premenné */ static const int user_id;/* const, volatile, static, extern... */ char *shell=“/bin/bash”; /* inicializácia */ VARCHAR user_login[50]; /* polia */ EXEC SQL END DECLARE SECTION; int main(int argc, char *argv[]) { EXEC SQL WHENEVER SQLERROR CONTINUE; /* ignorujeme chyby */ EXEC SQL CONNECT to ‘michal@host'; /* pripojenie k databázi */ EXEC SQL SELECT login,uidINTO :user_login, :user_id FROM passwd WHERE default_shell LIKE:shell; /* SQL dotaz */ printf(“Užívateľ %s(%d) používa shell %s\n”, user_login, user_id, shell); EXEC SQL DISCONNECT ALL; return(EXIT_SUCCESS); }
Kurzory • riešia impedance mismatch • umožňujú prístup riadok po riadku • predstava ukazovateľa na riadky • schéma: deklarácia a otvorenie: vytvor kurzor pre SELECT cyklus: čítaj dáta ak žiadne nie sú opusti cyklus, inak spracuj(zapíš) koniec: zavri kurzor
Syntax • úplná syntax EXEC SQLDECLARE meno-kurzoru [ INSENSITIVE ] [ SCROLL ] CURSOR FORvýraz [ ORDER BY ] [ modifikovateľnosť dát ] • najjednoduchšia forma EXEC SQL DECLARE meno-kurzoru CURSOR FOR výraz
Usporiadanie • ORDER BY špecifikácia • špecifikácia v tvare { názov-stĺpca | číslo stĺpca } [ COLLATE BY názov-porovnania ] [ ASC | DESC ] • príklad: EXEC SQL DECLARE CURSOR usp_ceny FOR SELECT aktualna_cena, nasa_cena, aktualna_cena-nasa_cena AS rozdiel_cien
Modifikovateľnosť dát (Updatability) • niekedy nechceme aby dáta pod kurzorom boli modifikovateľné • READ ONLY • FOR UPDATEOF zoznam_stĺpcov • príklad: EXEC SQL DECLARE mod_akt_ceny CURSOR FOR SELECT aktualna_cena, nasa_cena FROM tovar FOR UPDATE OF aktualna_cena
Príklad • deklarácia: EXEC SQL DECLARE mod_akt_ceny CURSOR FOR SELECT aktualna_cena, nasa_cena FROM tovar FOR UPDATE OF aktualna_cena • funguje: EXEC SQL UPDATE tovar SET aktualna_cena=aktualna_cena/2 WHERE CURRENT OF mod_akt_ceny • zlyhá: EXEC SQL UPDATE tovar SET nasa_cena = nasa_cena/2 WHERE CURRENT OF mod_akt_ceny
Citlivosť (Sensitivity) • aplikácia mení dáta ktoré sama používa – aký má byť výsledok ? • SQL-89 nedefinoval • SQL-92 necitlivé/nerozhodnuteľné kurzory (insensitive/indeterminant) • necitlivý – ignoruje zmeny vrámci transakcie • nerozhodnuteľný – náhodné chovanie
Scrollable cursors • možnosť ľubovoľného pohybu po dátach (vpred, vzad, po skokoch) • aktivujeme pomocou SCROLL pri vytváraní kurzoru • SQL-92 nepovoľuje kombináciu SCROLL a FOR UPDATE pre jeden kurzor
Otvorenie, zatvorenie, fetch, zmena • pred použitím sa musí kurzor otvoriť • OPEN názov-kurzoru • po použití zavrieť, uvoľnenie zdrojov • CLOSE názov-kurzoru • získanie dát riadok po riadku • FETCH [orientácia] FROM názov-kurzoru INTO ciele • orientácia: NEXT,PRIOR,FIRST,LAST, ABSOLUTE [-]n, RELATIVE [-]n • pozičné mazanie • DELETE FROM názov-tab WHERE CURRENT OF kurzor • pozičná modifikácia: • UPDATE názov-tab SET set-list WHERE CURRENT OF názov-kurzoru • set-list v tvare názov-stĺpca = hodnota | NULL | default
Zhrnutie • hniezdené SQL • prepojenie 3GL jazyka a SQL • najrozšírenejšie • prekompilátory: pcc (Oracle), ecpg • kurzory • rozhranie medzi množinovým prístupom a prístupom k jednotlivým prvkom • citlivosť vrámci transakcie • scrollovanie
Zdroje • Understanding The New SQL: A Complete Guide • google (ecpg,pcc,embedded SQL) • príklady pre Oracle PCC: UNIX lab – adresár/DB/oracle/product/8.1.5/precomp/demo/proc/