aplikativni sql

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

Upload: zlatil

Post on 15-Nov-2015

43 views

Category:

Documents


0 download

DESCRIPTION

Aplikativni SQL

TRANSCRIPT

  • Aplikativni (ugnjedeni) SQL, karakteristike i primeri Marko Markovi 334/06Nikola Rankovi 310/06

  • Koncept 1.ugradjeni SQL2.direktni pozivi DB2 funkcija (CLI Call Level Interface)3.upotreba ODBC standarda ( Open Database Connectivity)

  • Ugradjen SQL po mogunostima jednak CLI sistemuSve SQL komande :1) Statike 2) Dinamike Prema komandama dele se i programi:1) Statike2) Dinamike

  • program sa dinamikim SQL-om 1) korisnik koji pokree paket mora imati pravo da pokrene paket i prava da izvi svaku pojedinanu SQL komandu iz paketa2) korisnik koji ugradjuje paket mora imati prava da ugradi paket (BINDADD)

  • Programa sa statikim SQL-om 1.Korisnik koji pokree paket mora imati pravo da pokrene paket;2.Korisnik koji ugradjuje paket mora imati pravo da ugradi paket (BINDADD) i prava da izvri svaku pojedinanu SQL komandu i to ne implicitno preko grupnog ili PUBLIC prava nego eksplicitno, preko pojedinanog prava.

  • Ugradjivanje SQL komandiU okviru osnovnog programskog paketa DB2 sistema isporuuju se biblioteke i alati za ugradjivanje SQL komandi u:C,C++,COBOL, FORTRAN REXX a pored toga se mogu nabaviti i alati za SMALLTALK, JAVA i druge jezike

  • Primer 1. Napisati C program, sa ugradjenim SQL-om, koji ispisuje najvei redni broj snabdevaa iz tabele S:#include #include EXEC SQL INCLUDE SQLCA;EXEC SQL BEGIN DECLARE SECTION;char d_srbr[5];EXEC SQL END DECLARE SECTION;int is_error (char eString[], struct sqlca *caPointer){if (saPointer->sqlcodesqlcode);printf (---------------------);return 1;}return 0;}

  • #define CHECKERROR(str) if(is_error(str,&sqlca)!=0) return 1;main(){EXEC SQL connect to spj user studentb using abcde;CHECKERROR(Connect to SPJ);EXEC SQL select max(srbr) into :d_srbr from s;CHECKERROR(Select)if(!SQLCODE) printf(MAX SRBR = %.5s\n\r, d_srbr);EXEC SQL connect resetCHECKERROR(Connect reset);return 0;}

  • Fragment ugnjedenog SQL upita u PL/I(u primeru traimo teinu proizvoda ifre P2): EXEC SQL BEGIN DECLARE SECTION ;DCL SQLSTATECHAR(5) ;DCL P#CHAR(6) ;DCL TEZINAFIXED DECIMAL(5,1) ;EXEC SQL END DECLARE SECTION ;P# = P2 ;EXEC SQL SELECT P.TEZINAINTO: TEZINAFROMPWHERE P.P# = P# ( :P# ) ;IF SQLSTATE = 00000THEN ;/* TEZINA = vraena vrednost */ELSE ;/* dolo je do neke greke */

  • Karakteristike ugnjedavanja 1.Ugnjedeni SQL iskazi se unosi sa prefiksom EXEC SQL da bi se razlikovali od iskaza jezika u kome ugradjujemo te komande, i zavravaju se posebnim simbolom kao npr. ;

    2. Izvrni iskaz SQL-a se pojavljuje kada god se pojavljuje izvrni iskaz programa. Za razliku od interaktivnog SQL-a ugnjedeni SQL ukljuuje iskaze koji su isto deklarativni a ne izvrni. Npr. DECLARE CURSOR nije izvrni iskaz kao ni BEGIN i END DECLARE SECTION.

  • 3. SQL iskazi mogu sadrati reference na promenljive programa na kome se radi; ove reference moraju sadrati prefiks: da bi se razlikovali od imena kolona. Promenljive se mogu pojavljivati u ugnjedenom SQL-u kada god se literal moe pojavljivati u interaktivnom SQL-u. Promenljive se takodje mogu pojavljivati u INTO klauzama pri SELECT-u ili FETCH-u da bi oznaavale ciljeve operacija prikupljanja podataka. U C-u, ako se pokazivake promenljive koriste u SQL komandama, tada se moraju upotrebljavati sa tano onoliko simbola * sa koliko su definisani.Ako se u neku promenljivu eli upisati neki atribut rezultata upita koji moe biti NULL, tada je neophodna upotreba indikatora (promenljiva tipa short int, negativan broj ako je rezultat NULL)Indikatorska promenljiva se navodi u obliku::var INDICATOR :ivar ili:var:ivar.

  • 4. INTO klauza u SELECT iskazu se moe uneti da bi odredili promenljive u kojima se upisuju vrednosti koje e biti vraene ovim iskazom.SELECT ... INTO FROM WHERE GROUP BY HAVING Vrednosti svih atributa iz SELECT klauzule redom se upisuju u host promenljive, koje moraju biti odgovarajueg tipa. Host promenljive se medjusobno razdvajaju zapetama, a ako je doputeno da vrednost atributa bude NULL, onda je neophodno da neposredno iza host promenljive sledi odgovarajua indikatorska promenljiva.

    5. Sve programske promenljive na koje referiemo u SQL iskazima moraju biti prethodno deklarisane u okviru deklarativnog dela ugnjedenog SQL-a, koji je odredjen sa BEGIN i END DECLARE SECTION iskazom.

  • 6. Svaki program koji sadi iskaze ugnjedenog SQL-a mora takodje da sadri promenljivu zvanu SQLSTATE. Posle svakog izvrenog SQL iskaza u PL/I-u programu se vraa ifra stanja.-00000 iskaz se uspeno zavrio-02000 se izvrio ali nije vraen rezultat

    Promenljiva SQLCODE u C-u je celobrojna i moe biti: =0, uz SQLWARN0=, sve je u redu=100, ako nema zahtevanih podataka>0, izvrenje je prolo bez greke, ali sa upozorenjem=0, uz SQLWARN0=W, sve je u redu, ali sa upozorenjem

  • 7. Svaka programska promenljiva mora biti odgovarajueg tipa zavisno od upotrebe. npr.,programska promenljiva koja e biti korienja kao cilj smetanja podataka mora biti onog tipa podataka koji bi bio kompatibilan sa iskazom koji prua vrednost koja e biti pridruena ovoj lokaciji.Takodje, programska promenljiva koja je koriena kao izvor podataka (u INSERT iskazu) mora biti onog tipa koji je kompatabilan sa SQL kolonom u kojoj se upisuju vrednosti.

    8.Programske promenljive i SQL kolone imaju isto ime

  • 9. U jeziku PL/I, iskaz WHENEVER se koristi da bi se pojednostavio proces testiranja pomou vrednosti promenljive SQLSTATE. Ona ima formu:EXEC SQL WHENEVER ; ::= NOT FOUND | SQLWARNING | SQLEXCEPTION | SQLSTATE ::= CONTINUE | GO TO

  • WHENEVER GO TO IF THEN GO TO WHENEVER CONTINUE -i NOT FOUND, SQLWARNING I SQLEXCEPTION su definiu na sledei nain:NOT FOUND - podatak nije nadjen (SQLSTATE= 02xxx)SQLWARNING - prijavljeno je upozorenje (SQLSTATE = 01xxx )SQLEXCEPTION - dolo je do greke

  • Primer obrade greke u C-u:int is_error (char eString[], struct sqlca *caPointer){if (saPointer->sqlcodesqlcode);printf (---------------------);return 1;}return 0;}#define CHECKERROR(str) if(is_error(str,&sqlca)!=0) return 1;main(){CHECKERROR(Connect to spj);}

  • 10.Ugnjedavanje SQL-a se zasniva na loose coupling (labavo uparivanje) izmedju SQL-a i programskog jezika.

  • Host (programske) promenljive

  • KursoriProblem sa operacijama prikupljanja podataka je taj da generalno vraaju vei broj vrsta kao rezultat, a ne samo jednu.Treba premostiti razlike izmedju skupovnih operacija i mogunosti SQL-a i metoda prihvatanja podataka programskog jezika u kome se radi, koji operiu sa vrstama.Kursori se uvode kao pokazivai na jedan red rezultata ispita, koji se mogu postepeno pomerati unapred po rezultujuoj tabeli. Kursori se ne mogu pomerati unazad.DECLARE CURSOR FOR OPEN FETCH INTO CLOSE

  • Primer u C-u. Napisati program koji pomou kursora ispisuje sadraj S:EXEC SQL BEGIN DECLARE SECTION;char d_srbr[5];char d_sime[20];short id_sime;short d_status;short id_status;char d_grad[15];short id_grad;EXEC SQL END DECLARE SECTION;EXEC SQL declare scur cursor forselect srbr, sime, status, grad from s;CHECKERROR(Declare cursor scur);EXEC SQL open scur;...

  • ...CHECKERROR(Open scur);printf(SRBR SIMESTAT.GRAD\n\r );printf(============================\n\r);while(1){EXEC SQL fetch scur into :d_srbr, :d_sime:id_sime, d:status:id_status, :d_grad:id_grad;if(SQLCODE!=0) break;if(id_sime
  • Kursori i promena podatakaKursor moe biti definisan samo za itanje, za itanje i brisanje, ili za itanje, brisanje i menjanje podataka. FOR READ ONLYFOR UPDATE OF Kursor se implicitno ograniava ako:1.FROM klauzula upita, ili nekog podupita, sadri vie od jedne tabele, ili sadri pogled koji slui za itanje;2.upit sadri DISTINCT, VALUES ili ORDER BY klauzulu;3.upit sadri agregatne funkcije ili GROUP BY ili HAVING klauzulu;4.upit sadri neki skupovni operator (UNION, INTERSECT, EXCEPT);DELETE FROM WHERE CURRENT OF

  • Operacije koje ne zahtevaju korienje kursora:Jedinini (singleton) SELECTINSERTDELETE (osim u CURRENT obliku, videti pri kraju)UPDATE (osim u CURRENT obliku, videti pri kraju)

  • Jedinini (singleton) SELECT :nai status i grad snabdevaa ija ifra je data programskom promenljivom GIVENS#

    EXEC SQL SELECT STATUS, GRADINTO :RANK, :MESTOFROM SWHERE S# = S# ( :GIVENS# ) ;

  • INSERT :uneti novi deo (ifra dela, ime i teina su dati redom programskim promenljivama P#, PIME, PTEZ; boja i grad nisu poznati)

    EXEC SQL INSERTINTOP ( P#, PIME, PTEZ)VALUES ( :P#, :PIME, :PTEZ) ;

  • DELETE :izbrisati sve poiljke snabdevaa iji je grad dat programskom promenljivom GRAD.

    EXEC SQL DELETEFROM SPJWHERE :GRAD = ( SELECT GRADFROM SWHERE S.S# = SPJ.S# ) ;

  • UPDATE :poveati status svi snabdevaa iz Londona za koliinu datu programskom promenljivom POVISICA

    EXEC SQL UPDATE SSET STATUS = STATUS + :POVISICAWHERE GRAD = London ;

  • Operacije koje zahtevaju korienje kursora potreban je mehanizam za sekvencijalan pristup vrstama u skupu, jedna-po-jedna, te kursori pruaju takav mehanizam

  • Ovaj proces je ilustovan na prehodno prikazanom primeru u kome je dato da se pronadju podaci S#, SNAME i STATUS za sve proizvodjae u gradu zadatom programskom promenljivom Y.DECLARE X CURSOR Procenjivanje tabelarnog izraza tek pri OPEN XFETCH X INTO CLOSE X

  • Postoje tri izvrna iskaza za rad sa kursorima: OPEN, FETCH i CLOSE:OPEN:EXEC SQLOPEN ;

    FETCH:EXEC SQLFETCH INTO ;

    CLOSE:EXEC SQLCLOSE ;

  • CURRENT oblici iskaza DELETE i UPDATE Ukoliko je naprimer X trenutno pozicioniran na nekoj vrsti, onda je mogue primeniti DELETE i UPDATE na trenutnu poziciju X. EXEC SQLUPDATE SSET STATUS = STATUS + :POVISICAWHERE CURRENT OF X ;CURRENT oblici DELETE i UPDATE iskaza su zabranjeni ukoliko u deklaraciji kursora definie pogled bez mogunosti auriranja, ukoliko je deo CREATE VIEW iskaza.