Vnoren - PowerPoint PPT Presentation

About This Presentation
Title:

Vnoren

Description:

... Oracle Corporation http://download.oracle.com/docs/cd/B10501_01/appdev.920/a97269/pc_06sql.htm Chapter 13: Application Programming I: Embedded SQL, A Guide to ... – PowerPoint PPT presentation

Number of Views:46
Avg rating:3.0/5.0
Slides: 48
Provided by: cuni5
Category:
Tags: appdev | vnoren

less

Transcript and Presenter's Notes

Title: Vnoren


1
Vnorené SQL(embedded SQL)Dotazovací jazyky I
  • Jan Sequens
  • MFF UK, ak. rok 2009/2010

2
Použité zdroje
  • Chapter 6 Embedded SQL, ProC/C Precompiler
    Programmers guide, Release 9.2, Oracle
    Corporation
  • http//download.oracle.com/docs/cd/B10501_01/appde
    v.920/a97269/pc_06sql.htm
  • Chapter 13 Application Programming I Embedded
    SQL, A Guide to DB2, 4/e, C J Date, Colin J White
  • Embedded SQL Introduction to ProC, Ankur Jain
    and Jeff Ullman
  • http//infolab.stanford.edu/ullman/fcdb/oracle/or
    -proc.html
  • Embedded SQL v C/C, Katerina Opocenská
  • http//www.ms.mff.cuni.cz/kopecky/vyuka/oracle2/o
    ra2_opoc.pdf

3
Obsah této prezentace
  • Co je vnorenĂ© SQL a jak se používá
  • HostitelskĂ© a indikátorovĂ© promennĂ©
  • PrĂ­kazy INSERT, UPDATE, DELETE, SELECT
  • Kurzory
  • OšetrenĂ­ chyb

4
Co a k cemu je vnorené SQL?
  • Zpusob pouĹľitĂ­ SQL v programovacĂ­ch jazycĂ­ch
  • SQL vepsanĂ© ve zdrojovĂ©m kĂłdu jinĂ©ho
    programovacĂ­ho jazyka
  • Všechny prĂ­kazy interaktivnĂ­ho SQL jdou použít ve
    vnoreném SQL

5
Co a k cemu je vnorené SQL?
  • Zpusob pouĹľitĂ­ SQL v programovacĂ­ch jazycĂ­ch
  • SQL vepsanĂ© ve zdrojovĂ©m kĂłdu jinĂ©ho
    programovacĂ­ho jazyka
  • Všechny prĂ­kazy interaktivnĂ­ho SQL jdou použít ve
    vnoreném SQL (nikoliv naopak)

6
Jak vnorené SQL používáme?
  • Náš databázovĂ˝ systĂ©m musĂ­ mĂ­t podporu vnorenĂ©ho
    SQL v našem programovacím jazyce

7
Jak vnorené SQL používáme?
IBM DB2

Oracle

Microsoft SQL Server

MySQL

8
Jak vnorené SQL používáme?
IBM DB2
C/C, COBOL, FORTRAN, REXX
Oracle

Microsoft SQL Server

MySQL

9
Jak vnorené SQL používáme?
IBM DB2
C/C, COBOL, FORTRAN, REXX
Oracle
Ada, C/C, COBOL, Fortran, Pascal, PL/1
Microsoft SQL Server

MySQL

10
Jak vnorené SQL používáme?
IBM DB2
C/C, COBOL, FORTRAN, REXX
Oracle
Ada, C/C, COBOL, Fortran, Pascal, PL/1
Microsoft SQL Server
Od verze 2008 ukoncena oficiální podpora
MySQL

11
Jak vnorené SQL používáme?
IBM DB2
C/C, COBOL, FORTRAN, REXX
Oracle
Ada, C/C, COBOL, Fortran, Pascal, PL/1
Microsoft SQL Server
Od verze 2008 ukoncena oficiální podpora
MySQL
Nepodporováno
12
Jak vnorené SQL používáme?
  • PrĂ­klad vnorenĂ©ho SQL (Oracle a C)
  • include ltstdio.hgt
  • include ltsqlca.hgt
  • int main(void)
  • EXEC SQL INSERT INTO osoby (prijmeni) VALUES
    (Sequens)
  • return 0

13
Jak vnorené SQL používáme?
  • Vložíme hlavickovĂ˝ soubor struktury SQL
    Communication Area (SQLCA)
  • PrĂ­kazy vnorenĂ©ho SQL zacĂ­náme direktivou EXEC
    SQL a ukoncujeme strednĂ­kem

14
Jak vnorené SQL používáme?
  • Oracle prostredĂ­ pro SQL vnorenĂ© v C/C se
    nazývá ProC/C
  • ZdrojovĂ© soubory s prĂ­ponou .pc
  • Prekompilátor ProC/C preloží .pc na cistĂ˝
    C/C kĂłd
  • NahrazenĂ­ konstrukcĂ­ vnorenĂ©ho SQL volánĂ­mi
    standardnĂ­ run-time knihovny
  • C/C kĂłd je standardne zkompilován

15
Hostitelské promenné
  • PredávánĂ­ dat mezi SQL a C/C
  • Ve vnorenĂ©m SQL oznacujeme dvojteckou
  • VstupnĂ­
  • EXEC SQL INSERT INTO osoby (prijmeni) VALUES
    (prijmeni_osoby)
  • VĂ˝stupnĂ­
  • EXEC SQL SELECT prijmeni INTO prijmeni_osoby
    FROM osoby

16
Indikátorové promenné
  • Motivace Co uloĹľit do promennĂ©, kdyĹľ SELECT
    vrátí NULL?
  • RešenĂ­ PouĹľijeme druhou, sprátelenou
    promennou, která bude indikovat, jak a zda je
    puvodní promenná naplnena
  • Indikátorová promenná se zapisuje bezprostredne
    za puvodní promennou, oddelená dvojteckou

17
Indikátorové promenné u výstupních promenných
Indikátorová promenná Hostitelská promenná
-2 Oríznutá hodnota z databáze, hodnota se do hostitelské promenné nevejde a její velikost nemuže být urcena.
-1 Nedefinovaná hodnota, v databázi byla NULL.
0 Hodnota z databáze, není to NULL.
gt0 Oríznutá hodnota z databáze, hodnota se do hostitelské promenné nevejde. Indikátorová promenná obsahuje velikost hodnoty v databázi.
18
Indikátorové promenné u výstupních promenných -
prĂ­klad
  • EXEC SQL SELECT pocet_deti INTO pocetind_pocet
    FROM osoby WHERE prijmeni Sequens
  • if (ind_pocet -1) / NULL v databázi /
  • pocet 0

19
Indikátorové promenné u vstupních promenných
  • OvlivnĂ­, co se zapíše do databáze v prĂ­kazech
    INSERT nebo UPDATE

Indikátorová promenná Zápis do databáze
-1 Zapíše se NULL (hodnota hostitelské promenné se bude ignorovat).
gt 0 Zapíše se hodnota hostitelské promenné.
20
PrĂ­kaz INSERT
  • StejnĂ© pouĹľitĂ­ jako pri interaktivnĂ­m SQL
  • SkutecnĂ˝ zápis proveden aĹľ po zapsánĂ­ zmen
    prĂ­kazem COMMIT
  • EXEC SQL INSERT INTO osoby (jmeno, prijmeni)
  • VALUES (jmeno_osoby, prijmeni_osoby)

21
PrĂ­kaz UPDATE
  • StejnĂ© pouĹľitĂ­ jako pri interaktivnĂ­m SQL
  • SkutecnĂ˝ zápis proveden aĹľ po zapsánĂ­ zmen
    prĂ­kazem COMMIT
  • EXEC SQL UPDATE osoby
  • SET jmeno jmeno_osoby
  • WHERE prijmeni prijmeni_osoby

22
PrĂ­kaz DELETE
  • StejnĂ© pouĹľitĂ­ jako pri interaktivnĂ­m SQL
  • SkutecnĂ© smazánĂ­ provedeno aĹľ po zapsánĂ­ zmen
    prĂ­kazem COMMIT
  • EXEC SQL DELETE FROM osoby
  • WHERE prijmeni prijmeni_osoby

23
PrĂ­kaz SELECT
  • V zásade stejnĂ© pouĹľitĂ­ jako u interaktivnĂ­ho SQL
  • Je treba vyrešit, kam a jak uložíme to, co SELECT
    vrátí

24
PrĂ­kaz SELECT
  • VĂ­me-li, Ĺľe náš SELECT vrátĂ­ nejvýše jeden rádek,
    je situace jednoduchá

25
PrĂ­kaz SELECT
  • VĂ­me-li, Ĺľe náš SELECT vrátĂ­ nejvýše jeden rádek,
    je situace jednoduchá
  • EXEC SQL SELECT jmeno, prijmeni
  • INTO jmeno_osoby, prijmeni_osoby
  • FROM osoby

26
PrĂ­kaz SELECT
  • VĂ­me-li, Ĺľe náš SELECT vrátĂ­ nejvýše jeden rádek,
    je situace jednoduchá
  • EXEC SQL SELECT jmeno, prijmeni
  • INTO jmeno_osoby, prijmeni_osoby
  • FROM osoby
  • VracĂ­-li SELECT vĂ­ce neĹľ jeden rádek, je treba
    použít ke zpracování výsledku tzv. kurzor

27
Kurzor
  • Nástroj pro práci s mnoĹľinou rádku, kterou vracĂ­
    prĂ­kaz SELECT
  • UdrĹľuje ukazatel na aktuálnĂ­ zpracovávanĂ˝ rádek

28
Princip práce s kurzorem
  • DECLARE CURSOR
  • UrcenĂ­ SQL dotazu, se kterĂ˝m bude kurzor pracovat
  • OPEN
  • ProvedenĂ­ SQL dotazu, se kterĂ˝m kurzor pracuje
  • FETCH
  • NactenĂ­ jednoho rádku z vĂ˝sledku dotazu
  • CLOSE
  • UkoncenĂ­ práce s kurzorem

29
DECLARE CURSOR
  • PojmenovánĂ­ kurzoru
  • Asiociace s dotazem
  • EXEC SQL DECLARE osoby_kurzor CURSOR FOR
  • SELECT jmeno, prijmeni
  • FROM osoby
  • WHERE pocet_deti gt minimalni_plodnost

30
DECLARE CURSOR
  • PojmenovánĂ­ kurzoru
  • Asiociace s dotazem
  • EXEC SQL DECLARE osoby_kurzor CURSOR FOR
  • SELECT jmeno, prijmeni
  • FROM osoby
  • WHERE pocet_deti gt minimalni_plodnost
  • Nezahrnujeme klauzuli INTO

31
OPEN
  • NavázánĂ­ hostitelskĂ˝ch promennĂ˝ch
  • VykonánĂ­ dotazu
  • EXEC SQL OPEN osoby_kurzor

32
FETCH
  • NactenĂ­ rádku z vĂ˝sledku
  • PosunutĂ­ ukazatele na další rádek
  • EXEC SQL FETCH osoby_kurzor
  • INTO jmeno_osoby, prijmeni_osoby

33
FETCH
  • NactenĂ­ rádku z vĂ˝sledku
  • PosunutĂ­ ukazatele na další rádek
  • EXEC SQL FETCH osoby_kurzor
  • INTO jmeno_osoby, prijmeni_osoby
  • Klauzule INTO se pouĹľije zde, nikoliv v deklaraci
    kurzoru
  • Kurzor musĂ­ bĂ˝t deklarován a otevren.

34
CLOSE
  • Uzavre kurzor, uvolnĂ­ zdroje.
  • PosunutĂ­ ukazatele na další rádek
  • EXEC SQL CLOSE osoby_kurzor

35
Ošetrení chyb
  • Ke smysluplnĂ©mu prĂ­kladu pouĹľitĂ­ kurzoru nám
    chybí zpusob, jak ošetrit chyby
  • PrvnĂ­ moĹľnost je testovat po kaĹľdĂ©m vnorenĂ©m SQL
    príkazu, zda-li nedošlo k chybe, tzv. explicitní
    testování
  • Druhá moĹľnost je implicitnĂ­ testovánĂ­ pomocĂ­
    prĂ­kazu WHENEVER

36
Explicitní ošetrení chyb
  • Po vykonánĂ­ kaĹľdĂ©ho vnorenĂ©ho SQL prĂ­kazu
    obsahuje struktura SQLCA v poli sqlcode kontrolnĂ­
    hodnotu

Hodnota sqlcode Výsledek posledního príkazu
0 Probehl v porádku
gt 0 Probehl, ale s problémy (warning). Napr. hodnota 100 znací, že nebyla nalezena žádná data.
lt 0 Skoncil chybou (error).
37
Implicitní ošetrení chyb
  • ZjednodušenĂ­ oproti explicitnĂ­mu ošetrenĂ­
  • NenĂ­ treba testovat po kaĹľdĂ©m prĂ­kazu, testovacĂ­
    podmínka platí až do urcení podmínky nové
  • ZajištenĂ­ prĂ­kazem WHENEVER se syntaxĂ­
  • EXEC SQL WHENEVER ltpodmĂ­nkagt ltakcegt

38
PrĂ­kaz WHENEVER
  • EXEC SQL WHENEVER ltpodmĂ­nkagt ltakcegt
  • Kde ltpodmĂ­nkagt je
  • NOT FOUND (sqlcode je 100, prázdná data),
  • SQLWARNING (varovánĂ­ jinĂ© neĹľ prázdná data),
  • SQLERROR (chyba),
  • A ltakcegt je
  • CONTINUE (program se pokusĂ­ pokracovat)
  • DO ltvolánĂ­_funkcegt (zavolánĂ­ C/C funkce)
  • GO TO ltnáveštĂ­gt (odskok)
  • STOP (program ihned skoncĂ­)

39
Kurzory prĂ­klad pouĹľitĂ­
  • EXEC SQL DECLARE osoby_kurzor CURSOR FOR
  • SELECT jmeno FROM osoby
  • WHERE pocet_deti minimalni_plodnost
  • EXEC SQL OPEN osoby_kurzor
  • EXEC SQL WHENEVER NOT FOUND DO break
  • while(1)
  • EXEC SQL FETCH emp_cursor INTO jmeno_osoby
  • EXEC SQL CLOSE osoby_kurzor

40
Kurzory FOR UPDATE
  • Kurzory sloužícĂ­ takĂ© pro Ăşpravu ci mazánĂ­
    záznamu v tabulce
  • Kurzor je deklarován s klauzulĂ­ FOR UPDATE OF
    ltjméno_tabulkygt na konci
  • PrĂ­kazy UPDATE ci DELETE ho mohou využít v cásti
    WHERE, byl-li jiĹľ kurzor otevren a proveden
    prĂ­kaz FETCH
  • EXEC SQL UPDATE WHERE CURRENT OF osoby_kurzor
  • Odkaz na poslednĂ­ záznam zĂ­skanĂ˝ prĂ­kazem FETCH

41
Posuvné (scrollable) kurzory
  • DovolujĂ­ i jinĂ˝ pohyb ve vybranĂ˝ch záznamech neĹľ
    jen o jeden záznam vpred

42
Posuvné (scrollable) kurzory
  • DovolujĂ­ i jinĂ˝ pohyb ve vybranĂ˝ch záznamech neĹľ
    jen o jeden záznam vpred
  • FETCH FIRST
  • FETCH LAST
  • FETCH PRIOR
  • FETCH NEXT
  • FETCH CURRENT
  • FETCH RELATIVE n
  • FETCH ABSOLUTE n

43
Záverecný príklad (1/4)
  • include ltstdio.hgt
  • / deklarace hostitelskĂ˝ch promennĂ˝ch /
  • char userid12 "SCOTT/TIGER"
  • char jmeno_zamestnance10
  • int cislo_zamestanance
  • int cislo_oddeleni
  • char temp32
  • void sql_error()
  • / SQL Communications Area /
  • include ltsqlca.hgt
  • main()
  • emp_number 7499
  • / ošetrenĂ­ chyb /
  • EXEC SQL WHENEVER SQLERROR do
    sql_error("Oracle chyba")

44
Záverecný príklad (2/4)
  • / pripojenĂ­ k Oracle databázi /
  • EXEC SQL CONNECT userid
  • printf(Pripojeno.\n")
  • / deklarace kurzoru /
  • EXEC SQL DECLARE zam_kurzor CURSOR FOR
  • SELECT prijmeni
  • FROM zam
  • WHERE cislo_oddeleni cislo_oddeleni
  • printf(Cislo oddeleni? ")
  • gets(temp)
  • dept_number atoi(temp)
  • / otevrenĂ­ kurzoru a vykonánĂ­ dotazu /
  • EXEC SQL OPEN zam_kurzor

45
Záverecný príklad (3/4)
  • printf(Prijmeni zamestnance\n")
  • printf("-------------\n")
  • / nactenĂ­ dat ve smycce pomocĂ­ FETCH
  • opuštenĂ­ smycky, kdyĹľ nebude další rádek /
  • EXEC SQL WHENEVER NOT FOUND DO break
  • while (1)
  • EXEC SQL FETCH zam_kurzor INTO
    jmeno_zamestnance
  • printf("s\n", jmeno_zamestnance)
  • EXEC SQL CLOSE zam_kurzor
  • EXEC SQL COMMIT WORK RELEASE
  • exit(0)

46
Záverecný príklad (4/4)
  • void
  • sql_error(msg)
  • char msg
  • char buf500
  • int buflen, msglen
  • EXEC SQL WHENEVER SQLERROR CONTINUE
  • EXEC SQL ROLLBACK WORK RELEASE
  • buflen sizeof (buf)
  • sqlglm(buf, buflen, msglen)
  • printf("s\n", msg)
  • printf(".s\n", msglen, buf)
  • exit(1)

47
Konec prezentace
  • Cas pro carokrásnou referujĂ­cĂ­ Šárku
Write a Comment
User Comments (0)
About PowerShow.com