33
Aplikativni Aplikativni (ugnježdeni) SQL, (ugnježdeni) SQL, karakteristike i karakteristike i primeri primeri Marko Marković 334/06 Marko Marković 334/06 Nikola Ranković 310/06 Nikola Ranković 310/06

Aplikativni (ugnježdeni) SQL, karakteristike i primeri

  • Upload
    ivana

  • View
    81

  • Download
    0

Embed Size (px)

DESCRIPTION

Aplikativni (ugnježdeni) SQL, karakteristike i primeri. Marko Marković 334/06 Nikola Ranković 310/06. Koncept. 1.ugradjeni SQL 2.direktni pozivi DB2 funkcija (CLI – Call Level Interface) 3.upotreba ODBC standarda ( Open Database Connectivity). Ugradjen SQL. - PowerPoint PPT Presentation

Citation preview

Page 1: Aplikativni (ugnježdeni) SQL, karakteristike i primeri

Aplikativni (ugnježdeni) Aplikativni (ugnježdeni) SQL, karakteristike i primeri SQL, karakteristike i primeri

Marko Marković 334/06Marko Marković 334/06

Nikola Ranković 310/06Nikola Ranković 310/06

Page 2: Aplikativni (ugnježdeni) SQL, karakteristike i primeri

KonceptKoncept

1.ugradjeni SQL1.ugradjeni SQL

2.direktni pozivi DB2 funkcija (CLI – Call 2.direktni pozivi DB2 funkcija (CLI – Call Level Interface)Level Interface)

3.upotreba ODBC standarda ( Open 3.upotreba ODBC standarda ( Open Database Connectivity)Database Connectivity)

Page 3: Aplikativni (ugnježdeni) SQL, karakteristike i primeri

Ugradjen SQLUgradjen SQL

po mogućnostima jednak CLI sistemupo mogućnostima jednak CLI sistemu

Sve SQL komandeSve SQL komande : :

1) 1) StatičkeStatičke

2) 2) DinamičkeDinamičke

Prema komandama dele se i programiPrema komandama dele se i programi::

1) 1) StatičkStatičkee

2) 2) DinamičkeDinamičke

Page 4: Aplikativni (ugnježdeni) SQL, karakteristike i primeri

program sa dinamičkim SQL-om program sa dinamičkim SQL-om

1) 1) korisnik koji pokreće paket mora imati korisnik koji pokreće paket mora imati pravo da pokrene paket i prava da izvši pravo da pokrene paket i prava da izvši svaku pojedinačnu SQL komandu iz svaku pojedinačnu SQL komandu iz paketapaketa

2) 2) korisnik koji ugradjuje paket mora korisnik koji ugradjuje paket mora imati prava da ugradi paket imati prava da ugradi paket (BINDADD)(BINDADD)

Page 5: Aplikativni (ugnježdeni) SQL, karakteristike i primeri

PPrograma sa statičkim SQL-omrograma sa statičkim SQL-om

1.Korisnik koji pokreće paket mora imati 1.Korisnik koji pokreće paket mora imati pravo da pokrene paket;pravo da pokrene paket;

2.Korisnik koji ugradjuje paket mora imati 2.Korisnik koji ugradjuje paket mora imati pravo da ugradi paket (BINDADD) i prava pravo da ugradi paket (BINDADD) i prava da izvrši svaku pojedinačnu SQL komandu da izvrši svaku pojedinačnu SQL komandu i to ne implicitno preko grupnog ili i to ne implicitno preko grupnog ili PUBLIC PUBLIC prava nego eksplicitno, preko prava nego eksplicitno, preko pojedinačnog prava.pojedinačnog prava.

Page 6: Aplikativni (ugnježdeni) SQL, karakteristike i primeri

UUgradjivanje SQL komandigradjivanje SQL komandi

U okviru osnovnog programskog paketa DB2 U okviru osnovnog programskog paketa DB2 sistema isporučuju se biblioteke i alati za sistema isporučuju se biblioteke i alati za ugradjivanje SQL komandi uugradjivanje SQL komandi u::C,C,C++,C++,COBOL, COBOL, FORTRAN FORTRAN REXX REXX a pored toga se mogu nabaviti i alati za a pored toga se mogu nabaviti i alati za SMALLTALK, JAVA SMALLTALK, JAVA i druge jezike i druge jezike

Page 7: Aplikativni (ugnježdeni) SQL, karakteristike i primeri

Primer 1. Primer 1. Napisati C program, sa ugradjenim SQL-om, koji Napisati C program, sa ugradjenim SQL-om, koji ispisuje najveći redni broj snabdevača iz tabele S:ispisuje najveći redni broj snabdevača iz tabele S:

#include <stdlib.h>#include <stdlib.h>#include <stdio.h>#include <stdio.h>EXEC SQL INCLUDE SQLCA;EXEC SQL INCLUDE SQLCA;EXEC SQL BEGIN DECLARE SECTION;EXEC SQL BEGIN DECLARE SECTION;

char d_srbr[5];char d_srbr[5];EXEC SQL END DECLARE SECTION;EXEC SQL END DECLARE SECTION;int is_error (char eString[], struct sqlca *caPointer)int is_error (char eString[], struct sqlca *caPointer){{

if (saPointer->sqlcode<0){if (saPointer->sqlcode<0){printf (“----GRESKA----\n”);printf (“----GRESKA----\n”);printf (“GRESKA: %s.\SQLCODE:%ld\n”, eString, caPointer-printf (“GRESKA: %s.\SQLCODE:%ld\n”, eString, caPointer-

>sqlcode);>sqlcode);printf (“---------------------”);printf (“---------------------”);return 1;return 1;

}}return 0;return 0;

}}

Page 8: Aplikativni (ugnježdeni) SQL, karakteristike i primeri

#define CHECKERROR(str) if(is_error(str,&sqlca)!=0) #define CHECKERROR(str) if(is_error(str,&sqlca)!=0) return 1;return 1;main()main(){{EXEC SQL connect to spj user studentb using abcde;EXEC SQL connect to spj user studentb using abcde;CHECKERROR(“Connect to SPJ”);CHECKERROR(“Connect to SPJ”);EXEC SQL select max(srbr) into :d_srbrEXEC SQL select max(srbr) into :d_srbr

from s;from s;CHECKERROR(“Select”)CHECKERROR(“Select”)if(!SQLCODE) printf(“MAX SRBR = %.5s\n\r”, d_srbr);if(!SQLCODE) printf(“MAX SRBR = %.5s\n\r”, d_srbr);EXEC SQL connect resetEXEC SQL connect resetCHECKERROR(“Connect reset”);CHECKERROR(“Connect reset”);return 0;return 0;}}

Page 9: Aplikativni (ugnježdeni) SQL, karakteristike i primeri

Fragment ugnježdenog SQL upita u PL/IFragment ugnježdenog SQL upita u PL/I

(u primeru tražimo težinu proizvoda šifre ‘P2’):(u primeru tražimo težinu proizvoda šifre ‘P2’): EXEC SQL BEGIN DECLARE SECTION ;EXEC SQL BEGIN DECLARE SECTION ;

DCL SQLSTATEDCL SQLSTATE CHAR(5) ;CHAR(5) ;DCL P#DCL P# CHAR(6) ;CHAR(6) ;DCL TEZINADCL TEZINA FIXED DECIMAL(5,1) ;FIXED DECIMAL(5,1) ;

EXEC SQL END DECLARE SECTION ;EXEC SQL END DECLARE SECTION ;P# = ‘P2’ ;P# = ‘P2’ ;EXEC SQL SELECT EXEC SQL SELECT P.TEZINAP.TEZINA

INTOINTO : TEZINA: TEZINAFROMFROM PPWHERE P.P# = P# ( :P# ) ;WHERE P.P# = P# ( :P# ) ;

IF SQLSTATE = ‘00000’IF SQLSTATE = ‘00000’THEN … ;THEN … ; /* TEZINA = /* TEZINA = vraćena vrednost */vraćena vrednost */ELSE … ;ELSE … ; /* došlo je do neke /* došlo je do neke greške greške */ */

Page 10: Aplikativni (ugnježdeni) SQL, karakteristike i primeri

Karakteristike ugnježdavanjaKarakteristike ugnježdavanja

1.Ugnježdeni SQL iskazi se unosi sa prefiksom 1.Ugnježdeni SQL iskazi se unosi sa prefiksom EXEC SQL da bi se razlikovali od iskaza jezika u EXEC SQL da bi se razlikovali od iskaza jezika u kome ugradjujemo te komande, i završavaju se kome ugradjujemo te komande, i završavaju se posebnim simbolom kao npr. ;posebnim simbolom kao npr. ;

2. Izvršni iskaz SQL-a se pojavljuje kada god se 2. Izvršni iskaz SQL-a se pojavljuje kada god se pojavljuje izvršni iskaz programa. Za razliku od pojavljuje izvršni iskaz programa. Za razliku od interaktivnog SQL-a ugnježdeni SQL uključujeinteraktivnog SQL-a ugnježdeni SQL uključuje iskaze koji su čisto deklarativni a ne izvršni. Npr. iskaze koji su čisto deklarativni a ne izvršni. Npr. DECLARE CURSOR nije izvršni iskaz kao ni DECLARE CURSOR nije izvršni iskaz kao ni BEGIN i END DECLARE SECTION.BEGIN i END DECLARE SECTION.

Page 11: Aplikativni (ugnježdeni) SQL, karakteristike i primeri

3. SQL iskazi mogu sadržati reference na promenljive 3. SQL iskazi mogu sadržati reference na promenljive programa na kome se radi; ove reference moraju sadržati programa na kome se radi; ove reference moraju sadržati prefiksprefiks:: da bi se razlikovali od imena kolona. Promenljive se da bi se razlikovali od imena kolona. Promenljive se mogu pojavljivati u ugnježdenom SQL-u kada god se literal mogu pojavljivati u ugnježdenom SQL-u kada god se literal može pojavljivati u interaktivnom SQL-u. Promenljive se može pojavljivati u interaktivnom SQL-u. Promenljive se takodje mogu pojavljivati u takodje mogu pojavljivati u INTO INTO klauzama pri SELECT-u klauzama pri SELECT-u ili FETCH-u da bi označavale ciljeve operacija prikupljanja ili FETCH-u da bi označavale ciljeve operacija prikupljanja podataka. podataka. U C-u, ako se pokazivačke promenljive koriste u SQL U C-u, ako se pokazivačke promenljive koriste u SQL komandama, tada se moraju upotrebljavati sa tačno komandama, tada se moraju upotrebljavati sa tačno onoliko simbola ‘*’ sa koliko su definisani.onoliko simbola ‘*’ sa koliko su definisani.Ako se u neku promenljivu želi upisati neki atribut rezultata Ako se u neku promenljivu želi upisati neki atribut rezultata upita koji može biti NULL, tada je neophodna upotreba upita koji može biti NULL, tada je neophodna upotreba indikatoraindikatora (promenljiva tipa short int, negativan broj ako je (promenljiva tipa short int, negativan broj ako je rezultat NULL)rezultat NULL)

Indikatorska promenljiva se navodi u obliku:Indikatorska promenljiva se navodi u obliku:……:var INDICATOR :ivar… ili:var INDICATOR :ivar… ili …:var:ivar….…:var:ivar….

Page 12: Aplikativni (ugnježdeni) SQL, karakteristike i primeri

4. INTO klauza u SELECT iskazu se može uneti da bi 4. INTO klauza u SELECT iskazu se može uneti da bi odredili promenljive u kojima se upisuju vrednosti koje će odredili promenljive u kojima se upisuju vrednosti koje će biti vraćene ovim iskazom.biti vraćene ovim iskazom.SELECT ... INTO SELECT ... INTO <host-promenljive><host-promenljive>FROM … WHERE … GROUP BY … HAVING …FROM … WHERE … GROUP BY … HAVING …Vrednosti svih atributa iz Vrednosti svih atributa iz SELECT klauzule redom se SELECT klauzule redom se upisuju u host promenljive, koje moraju biti upisuju u host promenljive, koje moraju biti odgovarajućeg tipa. Host promenljive se medjusobno odgovarajućeg tipa. Host promenljive se medjusobno razdvajaju zapetama, a ako je dopušteno da vrednost razdvajaju zapetama, a ako je dopušteno da vrednost atributa bude NULL, onda je neophodno da neposredno atributa bude NULL, onda je neophodno da neposredno iza host promenljive sledi odgovarajuća indikatorska iza host promenljive sledi odgovarajuća indikatorska promenljiva.promenljiva.

5. Sve programske promenljive na koje referišemo u 5. Sve programske promenljive na koje referišemo u SQL iskazima moraju biti prethodno deklarisane u okviru SQL iskazima moraju biti prethodno deklarisane u okviru deklarativnog dela ugnježdenog SQL-a, koji je odredjen deklarativnog dela ugnježdenog SQL-a, koji je odredjen sa BEGIN i END DECLARE SECTION iskazom.sa BEGIN i END DECLARE SECTION iskazom.

Page 13: Aplikativni (ugnježdeni) SQL, karakteristike i primeri

6. Svaki program koji sadži iskaze ugnježdenog SQL-a 6. Svaki program koji sadži iskaze ugnježdenog SQL-a mora takodje da sadrži promenljivu zvanu SQLSTATE. mora takodje da sadrži promenljivu zvanu SQLSTATE. Posle svakog izvršenog SQL iskaza u PL/I-u programu Posle svakog izvršenog SQL iskaza u PL/I-u programu se vraća šifra stanja.se vraća šifra stanja.-00000 – iskaz se uspešno završio-00000 – iskaz se uspešno završio-02000 – se izvršio ali nije vraćen rezultat-02000 – se izvršio ali nije vraćen rezultat

Promenljiva SQLCODEPromenljiva SQLCODE u C-u u C-u je celobrojna i može biti: je celobrojna i može biti: =0, uz SQLWARN0=’’, sve je u redu=0, uz SQLWARN0=’’, sve je u redu=100, ako nema zahtevanih podataka=100, ako nema zahtevanih podataka>0, >0, izvršenje je prošlo bez greške, ali sa upozorenjemizvršenje je prošlo bez greške, ali sa upozorenjem=0, uz SQLWARN0=’W’, sve je u redu, ali sa =0, uz SQLWARN0=’W’, sve je u redu, ali sa upozorenjemupozorenjem<0,<0,greška i komanda nije izvršenagreška i komanda nije izvršena

Page 14: Aplikativni (ugnježdeni) SQL, karakteristike i primeri

7. Svaka programska promenljiva mora biti 7. Svaka programska promenljiva mora biti odgovarajućeg tipa zavisno od upotrebe. npr.,odgovarajućeg tipa zavisno od upotrebe. npr.,programska promenljiva koja će biti korišćenja programska promenljiva koja će biti korišćenja kao cilj smeštanja podataka mora biti onog tipa kao cilj smeštanja podataka mora biti onog tipa podataka koji bi bio kompatibilan sa iskazom koji podataka koji bi bio kompatibilan sa iskazom koji pruža vrednost koja će biti pridružena ovoj pruža vrednost koja će biti pridružena ovoj lokaciji.lokaciji.Takodje, programska promenljiva koja je Takodje, programska promenljiva koja je koričćena kao izvor podataka (u INSERT iskazu) koričćena kao izvor podataka (u INSERT iskazu) mora biti onog tipa koji je kompatabilan sa SQL mora biti onog tipa koji je kompatabilan sa SQL kolonom u kojoj se upisuju vrednosti.kolonom u kojoj se upisuju vrednosti.

8.Programske promenljive i SQL kolone imaju 8.Programske promenljive i SQL kolone imaju isto imeisto ime

Page 15: Aplikativni (ugnježdeni) SQL, karakteristike i primeri

9. U jeziku PL/I, iskaz WHENEVER se 9. U jeziku PL/I, iskaz WHENEVER se koristi da bi se pojednostavio proces koristi da bi se pojednostavio proces testiranja pomoću vrednosti promenljive testiranja pomoću vrednosti promenljive SQLSTATE. Ona ima formu:SQLSTATE. Ona ima formu:

EXEC SQL WHENEVER <condition> EXEC SQL WHENEVER <condition> <action> ;<action> ;

<condition> ::= NOT FOUND | <condition> ::= NOT FOUND | SQLWARNING | SQLEXCEPTION | SQLWARNING | SQLEXCEPTION | SQLSTATESQLSTATE

<action> ::= CONTINUE | GO TO<action> ::= CONTINUE | GO TO

Page 16: Aplikativni (ugnježdeni) SQL, karakteristike i primeri

““WHENEVER <condition> GO TO <label>” WHENEVER <condition> GO TO <label>” ““IF <condition> THEN GO TO <label>…” IF <condition> THEN GO TO <label>…” ““WHENEVER <condition> CONTINUE” WHENEVER <condition> CONTINUE” <condition>-i NOT FOUND, <condition>-i NOT FOUND, SQLWARNING I SQLEXCEPTION su SQLWARNING I SQLEXCEPTION su definišu na sledeći način:definišu na sledeći način:NOT FOUND - podatak nije nadjen NOT FOUND - podatak nije nadjen (SQLSTATE= 02xxx)(SQLSTATE= 02xxx)SQLWARNING - pSQLWARNING - prijavljrijavljeeno je upozorenjeno je upozorenje (SQLSTATE = 01xxx )(SQLSTATE = 01xxx )SQLEXCEPTIONSQLEXCEPTION - - došlo je do greškedošlo je do greške

Page 17: Aplikativni (ugnježdeni) SQL, karakteristike i primeri

Primer obrade grePrimer obrade greške u C-u:ške u C-u:……int is_error (char eString[], struct sqlca *caPointer)int is_error (char eString[], struct sqlca *caPointer){{

if (saPointer->sqlcode<0){if (saPointer->sqlcode<0){printf (“----GRESKA----\n”);printf (“----GRESKA----\n”);printf (“GRESKA: %s.\SQLCODE:%ld\n”, eString, printf (“GRESKA: %s.\SQLCODE:%ld\n”, eString,

caPointer->sqlcode);caPointer->sqlcode);printf (“---------------------”);printf (“---------------------”);return 1;return 1;

}}return 0;return 0;

}}#define CHECKERROR(str) if(is_error(str,&sqlca)!=0) return 1;#define CHECKERROR(str) if(is_error(str,&sqlca)!=0) return 1;main()main(){{……CHECKERROR(“Connect to spj”);CHECKERROR(“Connect to spj”);……}}

Page 18: Aplikativni (ugnježdeni) SQL, karakteristike i primeri

10.Ugnježdavanje SQL-a se zasniva na 10.Ugnježdavanje SQL-a se zasniva na loose couplingloose coupling (labavo uparivanje) izmedju (labavo uparivanje) izmedju SQL-a i programskog jezika.SQL-a i programskog jezika.

Page 19: Aplikativni (ugnježdeni) SQL, karakteristike i primeri

Host (programske) promenljiveHost (programske) promenljiveSQL tipSQL tip C tipC tip NapomenaNapomena

SMALLINTSMALLINT short,short intshort,short int

INTEGERINTEGER long, long intlong, long int

DOUBLEDOUBLE doubledouble

DECIMALDECIMAL -- Nema ekvivalenta, može Nema ekvivalenta, može se upotrebljavari doublese upotrebljavari double

CHARCHAR charchar

CHAR(n)CHAR(n) char[n+1], 1<= n<=254 char[n+1], 1<= n<=254 Nema pravog Nema pravog ekvivalenta, niska fiksne ekvivalenta, niska fiksne dužinedužine

VARCHAR(n)VARCHAR(n) struct tag{struct tag{

short int;short int;

char[n];char[n]; }}

Niska promenljive dužine Niska promenljive dužine koja se ne završava koja se ne završava znakom null, sa 16-znakom null, sa 16-bitnim indikatorom bitnim indikatorom dužinedužine

char [n+1], 1<=n<=4000char [n+1], 1<=n<=4000 Alternativa je niska koja Alternativa je niska koja se zavržava se zavržava nullnull znakom znakom

Page 20: Aplikativni (ugnježdeni) SQL, karakteristike i primeri

LONG VARCHARLONG VARCHAR struct tag{struct tag{

short int;short int;

char[n];char[n]; }}

4001<=n<=327004001<=n<=32700

Niska promenljive dužine Niska promenljive dužine koja se ne završava koja se ne završava znakom null, sa 16-znakom null, sa 16-bitnim indikatorom bitnim indikatorom dužinedužine

CLOB(n)CLOB(n) sql type is clob(n)sql type is clob(n) Niska promenljive dužine Niska promenljive dužine koja se ne završava koja se ne završava znakom null, sa 32-znakom null, sa 32-bitnim indikatorom bitnim indikatorom dužinedužine

CLOB locatorCLOB locator sql type issql type is clob_locatorclob_locator Identifikator CLOB Identifikator CLOB objekata na serveruobjekata na serveru

CLOB file-referenceCLOB file-reference sql type is clob_filesql type is clob_file IdentifikatorIdentifikator datoteke sa datoteke sa CLOB objektomCLOB objektom

DATEDATE char[11]char[11] Ima i druge oblikeIma i druge oblike

TIMETIME char[9]char[9] Ima i druge oblikeIma i druge oblike

TIMESTAMPTIMESTAMP char[11]char[11] Ima i druge oblikeIma i druge oblike

BLOB...(kao CLOB)BLOB...(kao CLOB)

GRAPHIC...GRAPHIC... Kao CHAR, samo se Kao CHAR, samo se umesto char pojavljuje umesto char pojavljuje wchar_twchar_t

Page 21: Aplikativni (ugnježdeni) SQL, karakteristike i primeri

KursoriKursoriProblem sa operacijama prikupljanja podataka je Problem sa operacijama prikupljanja podataka je taj da generalno vraćaju veći broj vrsta kao taj da generalno vraćaju veći broj vrsta kao rezultat, a ne samo jednu.rezultat, a ne samo jednu.Treba premostiti razlike izmedju skupovnih Treba premostiti razlike izmedju skupovnih operacija i mogućnosti SQL-a i metoda operacija i mogućnosti SQL-a i metoda prihvatanja podataka programskog jezika u prihvatanja podataka programskog jezika u kome se radi, koji operišu sa vrstama.kome se radi, koji operišu sa vrstama.Kursori se uvode kao pokazivači na jedan red Kursori se uvode kao pokazivači na jedan red rezultata ispita, koji se mogu postepeno rezultata ispita, koji se mogu postepeno pomerati unapred po rezultujućoj tabeli. Kursori pomerati unapred po rezultujućoj tabeli. Kursori se ne mogu pomerati unazad.se ne mogu pomerati unazad.DECLARE <ime kursora> CURSOR FOR <upit>DECLARE <ime kursora> CURSOR FOR <upit>OPEN OPEN <ime kursora><ime kursora>FETCH <ime kursora> INTO <host promenljive>FETCH <ime kursora> INTO <host promenljive>CLOSE CLOSE <ime kursora><ime kursora>

Page 22: Aplikativni (ugnježdeni) SQL, karakteristike i primeri

Primer u Primer u C-uC-u. . Napisati program koji pomoću kursora Napisati program koji pomoću kursora ispisuje sadržaj S:ispisuje sadržaj S:……EXEC SQL BEGIN DECLARE SECTION;EXEC SQL BEGIN DECLARE SECTION;

char d_srbr[5];char d_srbr[5];char d_sime[20];char d_sime[20];short id_sime;short id_sime;short d_status;short d_status;short id_status;short id_status;char d_grad[15];char d_grad[15];short id_grad;short id_grad;

EXEC SQL END DECLARE SECTION;EXEC SQL END DECLARE SECTION;……EXEC SQL declare scur cursor forEXEC SQL declare scur cursor for

select srbr, sime, status, grad from s;select srbr, sime, status, grad from s;CHECKERROR(“Declare cursor scur”);CHECKERROR(“Declare cursor scur”);EXEC SQL open scur;EXEC SQL open scur;......

Page 23: Aplikativni (ugnježdeni) SQL, karakteristike i primeri

......CHECKERROR(“Open scur”);CHECKERROR(“Open scur”);printf(“SRBR printf(“SRBR SIMESIME STAT.GRAD\n\r ”);STAT.GRAD\n\r ”);printf(“============================\n\r”);printf(“============================\n\r”);while(1){while(1){

EXEC SQL fetch scur into :d_srbr, :d_sime:id_sime, EXEC SQL fetch scur into :d_srbr, :d_sime:id_sime, d:status:id_status, :d_grad:id_grad;d:status:id_status, :d_grad:id_grad;if(SQLCODE!=0) break;if(SQLCODE!=0) break;if(id_sime<0) d_sime[0]=’\0’;if(id_sime<0) d_sime[0]=’\0’;if(id_status<0) d_sime[0]=’\0’;if(id_status<0) d_sime[0]=’\0’;if(id_grad<0) d_sime[0]=’\0’;if(id_grad<0) d_sime[0]=’\0’;printf(“%.5s %.20s %.5d %15s\n\r”, d_srbr, (id_sime<0 ? printf(“%.5s %.20s %.5d %15s\n\r”, d_srbr, (id_sime<0 ? “NULL”:d_sime), (id_status<0 ? -1:d_status), (id_grad<0 ? “NULL”:d_sime), (id_status<0 ? -1:d_status), (id_grad<0 ? “NULL”:d_grad));“NULL”:d_grad));}}CHECKERROR(“Fetch scur”);CHECKERROR(“Fetch scur”);EXEC SQL close scur;EXEC SQL close scur;CHECKERROR(“Close scur”);CHECKERROR(“Close scur”);

Page 24: Aplikativni (ugnježdeni) SQL, karakteristike i primeri

Kursori i promena podatakaKursori i promena podatakaKursor moKursor može biti definisan samo za čitanje, za čitanje i že biti definisan samo za čitanje, za čitanje i brisanje, ili za čitanje, brisanje i menjanje podataka. brisanje, ili za čitanje, brisanje i menjanje podataka. FOR READ ONLYFOR READ ONLYFOR UPDATE OF FOR UPDATE OF <lista atributa><lista atributa>Kursor se implicitno ograniKursor se implicitno ograničava ako:čava ako:1.FROM klauzula upita, ili nekog podupita, sadrži više od 1.FROM klauzula upita, ili nekog podupita, sadrži više od jedne tabele, ili sadrži pogled koji služi za čitanje;jedne tabele, ili sadrži pogled koji služi za čitanje;2.upit sadrži DISTINCT, VALUES ili ORDER BY 2.upit sadrži DISTINCT, VALUES ili ORDER BY klauzulu;klauzulu;3.upit sadrži agregatne funkcije ili GROUP BY ili 3.upit sadrži agregatne funkcije ili GROUP BY ili HAVING klauzulu;HAVING klauzulu;4.upit sadrži neki skupovni operator (UNION, 4.upit sadrži neki skupovni operator (UNION, INTERSECT, EXCEPT);INTERSECT, EXCEPT);DELETE FROM DELETE FROM <ime tabele> WHERE CURRENT OF <ime tabele> WHERE CURRENT OF <ime kursora><ime kursora>

Page 25: Aplikativni (ugnježdeni) SQL, karakteristike i primeri

Operacije koje ne zahtevaju Operacije koje ne zahtevaju korišćenje kursora:korišćenje kursora:

Jedinični (singleton) SELECTJedinični (singleton) SELECT

INSERTINSERT

DELETE (osim u CURRENT obliku, videti DELETE (osim u CURRENT obliku, videti pri kraju)pri kraju)

UPDATE (osim u CURRENT obliku, videti UPDATE (osim u CURRENT obliku, videti pri kraju)pri kraju)

Page 26: Aplikativni (ugnježdeni) SQL, karakteristike i primeri

Jedinični (singleton)Jedinični (singleton) SELECTSELECT : :

naći status i grad snabdevača čija šifra je naći status i grad snabdevača čija šifra je data programskom promenljivom data programskom promenljivom GIVENS#GIVENS#

EXEC SQL EXEC SQL SELECT STATUS, GRADSELECT STATUS, GRAD

INTO :RANK, :MESTOINTO :RANK, :MESTO

FROM SFROM S

WHERE S# = S# ( :GIVENS# ) ;WHERE S# = S# ( :GIVENS# ) ;

Page 27: Aplikativni (ugnježdeni) SQL, karakteristike i primeri

INSERTINSERT : :

uneti novi deo (šifra dela, ime i težina su uneti novi deo (šifra dela, ime i težina su dati redom programskim promenljivama dati redom programskim promenljivama P#, PIME, PTEZ; boja i grad nisu poznati)P#, PIME, PTEZ; boja i grad nisu poznati)

EXEC SQL EXEC SQL INSERTINSERT

INTOINTO P ( P#, PIME, PTEZ)P ( P#, PIME, PTEZ)

VALUES ( :P#, :PIME, :PTEZ) ;VALUES ( :P#, :PIME, :PTEZ) ;

Page 28: Aplikativni (ugnježdeni) SQL, karakteristike i primeri

DELETEDELETE : :

izbrisati sve pošiljke snabdevača čiji je grad dat izbrisati sve pošiljke snabdevača čiji je grad dat programskom promenljivom GRAD.programskom promenljivom GRAD.

EXEC SQL EXEC SQL DELETEDELETE

FROM SPJFROM SPJ

WHERE :GRAD WHERE :GRAD ==

( SELECT GRAD( SELECT GRAD

FROM SFROM S

WHERE S.S# WHERE S.S# == SPJ.S# ) ; SPJ.S# ) ;

Page 29: Aplikativni (ugnježdeni) SQL, karakteristike i primeri

UPDATEUPDATE : :

povećati status svi snabdevača iz povećati status svi snabdevača iz Londona za količinu datu programskom Londona za količinu datu programskom promenljivom POVISICApromenljivom POVISICA

EXEC SQL UPDATE SEXEC SQL UPDATE S

SET STATUS SET STATUS = STATUS = STATUS + :POVISICA+ :POVISICA

WHERE GRAD = ‘London’ ;WHERE GRAD = ‘London’ ;

Page 30: Aplikativni (ugnježdeni) SQL, karakteristike i primeri

Operacije koje zahtevaju korišćenje Operacije koje zahtevaju korišćenje kursorakursora

potreban je mehanizam za sekvencijalan pristup potreban je mehanizam za sekvencijalan pristup vrstama u skupu, jedna-po-jedna, te kursori vrstama u skupu, jedna-po-jedna, te kursori pružaju takav mehanizampružaju takav mehanizam

Page 31: Aplikativni (ugnježdeni) SQL, karakteristike i primeri

Ovaj proces je ilustovan na prehodno Ovaj proces je ilustovan na prehodno prikazanom primeru u kome je dato da se prikazanom primeru u kome je dato da se pronadju podaci S#, SNAME i STATUS za pronadju podaci S#, SNAME i STATUS za sve proizvodjače u gradu zadatom sve proizvodjače u gradu zadatom programskom promenljivom Y.programskom promenljivom Y.

DECLARE X CURSOR… DECLARE X CURSOR… <tabelarni <tabelarni izraz>izraz>

Procenjivanje tabelarnog izraza tek pri Procenjivanje tabelarnog izraza tek pri OPEN XOPEN X

FETCH X INTO…FETCH X INTO… <host promenljiva> <host promenljiva>

CLOSE XCLOSE X

Page 32: Aplikativni (ugnježdeni) SQL, karakteristike i primeri

Postoje tri izvršna iskaza za rad sa Postoje tri izvršna iskaza za rad sa kursorima: OPEN, FETCH i CLOSE:kursorima: OPEN, FETCH i CLOSE:OPENOPEN::EXEC SQLEXEC SQL OPEN OPEN <ime kursora> ;<ime kursora> ;

FETCHFETCH::EXEC SQLEXEC SQL FETCH FETCH <ime kursora><ime kursora>

INTO <referenca na programsku INTO <referenca na programsku promenljivu zarezpromenljivu zarez--lista> ;lista> ;

CLOSECLOSE::EXEC SQLEXEC SQL CLOSE CLOSE <ime kursora> ;<ime kursora> ;

Page 33: Aplikativni (ugnježdeni) SQL, karakteristike i primeri

CURRENTCURRENT oblici iskaza DELETE i oblici iskaza DELETE i UPDATE UPDATE

Ukoliko je naprimer X trenutno pozicioniran na Ukoliko je naprimer X trenutno pozicioniran na nekoj vrsti, onda je moguće primeniti DELETE i nekoj vrsti, onda je moguće primeniti DELETE i UPDATE na UPDATE na “trenutnu poziciju X”“trenutnu poziciju X”. .

EXEC SQLEXEC SQL UPDATE SUPDATE S

SET STATUS SET STATUS = STATUS + :POVISICA= STATUS + :POVISICA

WHERE CURRENT OF X ;WHERE CURRENT OF X ;

CURRENT oblici DELETE i UPDATE iskaza su CURRENT oblici DELETE i UPDATE iskaza su zabranjeni ukoliko zabranjeni ukoliko <tabelarni izraz> u deklaraciji <tabelarni izraz> u deklaraciji kursora definiše pogled bez mogućnosti kursora definiše pogled bez mogućnosti ažuriranja, ukoliko je deo CREATE VIEW iskaza.ažuriranja, ukoliko je deo CREATE VIEW iskaza.