57
Природно-Математички факултет Приштина са седиштем у Косовскоj Митровици Семинарски рад Напредни SQL Ментор : Проф. Александар Мицић Студент : Александар Недељковић, 378/11 Децембар, 2014. године

Baze podataka

  • Upload
    -

  • View
    55

  • Download
    8

Embed Size (px)

DESCRIPTION

Baza podataka studentske sluzbe - opis seminarskog rada kroz primer baze i njen celokupni opis.Autor: Aleksandar Nedeljkovic, 378/2011

Citation preview

  • - j

    SQL

    :.

    : , 378/11

    , 2014.

  • 2

  • j

    5. SQL 55.1. SQL- j . . . . . . . . . . . . . . . . . . 5

    5.1.1. JDBC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 65.1.2. ODBC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 145.1.3. SQL . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16

    5.2. j . . . . . . . . . . . . . . . . . . . . . . . . . . 205.2.1. SQL j . . . . . 215.2.2. J j . . . . . . . . . . . 235.2.3. j . . . . . . . . . . . . . . . . . . . . . . . . 26

    5.3. (Triggers) . . . . . . . . . . . . . . . . . . . . . . . . . . . 275.3.1. . . . . . . . . . . . . . . . . . . . . . . . . 275.3.2. SQL- . . . . . . . . . . . . . . . . . . . . . . . . . . 285.3.3. . . . . . . . . . . . . . . . . . . . . . 32

    5.4. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 345.4.1. j . . . . . . . . . 345.4.2. j SQL- . . . . . . . . . . . . . . . . . . . . . . . . . . 35

    5.5. j . . . . . . . . . . . . . . . . . . . . . 385.5.1. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 395.5.2. Windowing . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42

    5.6. OLAP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 445.6.1. Online Analytical Processing . . . . . . . . . . . . . . . . . . . . 445.6.2. Cross Tab . . . . . . . . . . . . . . . . . . 495.6.3. OLAP SQL- . . . . . . . . . . . . . . . . . . . . . . . . . . . . 50

    5.7. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 565.7.1. j . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57

    3

  • 4 J

  • 5 SQL

    ;

    j SQL- 1. SQL-u iz programskog jezika opxte namene,xto je veoma vano za kreirae aplikacija koje koriste bazu podatakaza quvae i preuzimae podataka. Opisaemo kako se proceduralni kodmoe izvrxiti u bazi podataka, baviemo se produeem SQL jezika zapodrxku procesnih radi. Takoe emo objasniti naqin na koji funkci-je definisane u procesnim jezicima mogu da se izvrxe u bazi podataka.Opisaemo okidaqe (Trigger), koji se mogu koristiti za specifikacijuakcije koja treba da se vrxi automacki na odreene dogaaje kao xto suubacivae, brisae ili aurirae n-torki (tuples) 2 u odreenoj relaciji.Razgovaraemo o rekurzivnim upitima i naprednim funkcijama objedia-vaa koje podrava SQL. Konaqno, opisujemo sisteme onlajn analitiqkeobrade (OLAP ), koji podravaju interaktivnu analizu veoma velikih sku-pova podataka.

    5.1 SQL- j

    Dakle, SQL obezbeuje moni deklarativni jezik upita. Pisae upitau SQL-u je obiqno mnogo lakxe nego kodirae istih kroz programskijezik opxte namene. Meutim, programer mora imati pristup programskomjeziku opxte namene iz najmae dva razloga :1. ne mogu se svi upiti izraziti u SQL-u upravo iz razloga xto SQL ne

    prua potpunu podrxku za jezike opxte namene2. Nedeklarativne akcije kao xto je xtampae izvextaja, interakcija

    sa korisnikom baze ili slae rezultata upita na grafiqki korisni-

    1. j :j -

    7 8 - j . j j , . j, , j j j j

    2. Tuple,

    Tuples

    n- ( j)

    j . Tuple

    .

    5

  • 6 5. SQL

    qki interfejs (Graphical User Interface - GUI ) nemogue je uraditi unu-tar SQL-a. Aplikacije obiqno imaju nekoliko komponenti i upita,a aurirae podataka je samo jedna komponenta. Ostale komponentese pixu u programskim jezicima opxte namene. Za neku integrisanuaplikaciju, SQL se mora kombinovati sa nekim drugim jezikom opxtenamene.

    Postoje dva naqina pristupu SQL-u iz programskog jezika opxtenamene i to :

    SQL : Program opxte namene se moe povezati i komu-nicirati sa bazom podataka korixeem kolekcije funkcija (vaiza proceduralne jezike) ili korixeem metoda (vai za objektno-orijentisane jezike). Dinamiqki SQL dozvoava programu da konstru-ixe neki SQL upit kao niz saqien od karaktera, podnese upit i za-tim da preuzme rezultat i smesti ga u promenivu samog programa.Upravo dinamiqka komponenta SQL-a dozvoava programima da kons-truixu i xau SQL upite. U ovom poglavu emo obratiti pauna dva standarda za povezivae sa SQL bazom podataka. Prvi, JDBC(odeak 5.1.1) je aplikacioni programski interfejs za jezik Java. Dru-gi, ODBC (odeak 5.1.2), predstava aplikacioni programski inter-fejs originalno razvijen za programski jezik C, kasnije proxiren ina programske jezike poput C + +, C# ili V isualBasic.

    SQL : sliqno kao i dinamiqki SQL, ugraeni SQL (engl.Embedded SQL) omoguava naqin po kome program komunicira sa baznimserverom. Bilo kako, pod ugraenim SQL-om, SQL izvextaji su iden-tifikovani i kompajlirani korixeem . Pretproce-sor dostava SQL iskaze na sistem baze podataka za prekompilaciju ioptimizaciju ; onda zameuje SQL izjave u programu sa odgovarajuomxifrom i funkciju poziva pre pozivaa kompajlera. Sekcija 5.1.3 po-kriva ugraeni SQL.

    Glavni razlog kombinovaa standardnog SQL-a i programskih je-zika opxte namene je neslagae u naqin na koji ovi jezici manipulixupodacima.

    5.1.1 JDBC

    Ovaj standard definixe programski interfejs aplikacije (API) kojiJava programi mogu da iskoriste kako bi se konektovali na bazniserver. JDBC je skraenica za Java DataBase Connectibity ali se vixe neupotrebava u originalu.

    Slika 5.1 pokazuje primer Java programa koji koristi JDBC inte-rfejs. Ovde je ilustrovano kako se otvaraju veze, kako se izvrxavaju izja-ve, kako se rezultati obrauju i kako su veze zatvaraju. Raspravae-mo o ovom primeru upravo u ovom delu. Java programi prvo moraju daimportuju (uvezu) java.sql.. Ovaj deo sadri definicije interfejsa zafunkcionalnost obezbeenu preko ODBC-a.

  • 5.1. SQL- J 7

    pub l i c s t a t i c void JDBCexample ( S t r ing user id , S t r ing passwd ){

    try{

    Class . forName ( " o r a c l e . jdbc . d r i v e r . Orac leDr iver " ) ;Connection conn = DriverManager . getConnect ion ( " jdbc : o r a c l e : th in :@db .

    ya l e . edu : 1 5 2 1 : univdb" , user id , passwd ) ;Statement stmt = conn . createStatement ( ) ;t ry {

    stmt . executeUpdate ( " i n s e r t in to i n s t r u c t o r va lue s ( 77987 , Kim , Phys ics , 98000) " ) ;

    } catch ( SQLException s q l e ){

    System . out . p r i n t l n ( "Couldnot i n s e r t tup l e . " + sq l e ) ;}Resu l tSet r s e t = stmt . executeQuery ( " s e l e c t deptname , avg ( s a l a r y ) "+"

    from i n s t r u c t o r "+"groupbydeptname" ) ; }whi l e ( r s e t . next ( ) ) {

    System . out . p r i n t l n ( r s e t . g e tS t r i ng ( "deptname" ) + "" +r s e t . ge tF loat(2 ) ) ; }

    }stmt . c l o s e ( ) ;conn . c l o s e ( ) ;

    }catch ( Exception s q l e ){

    System . out . p r i n t l n ( "Exception : " + sq l e ) ;}

    }

    5.1 JDBC

    j

    Prvi korak u pristupau bazi podataka jeste ostvarivae, odnosnootvarae konekcije sa bazom podataka. Ovaj korak je potreban kako biselektovali koju emo bazu koristiti (na primer, ako na raqunaru imamoinstaliran Oracle i ako je on pokrenut, ili ako je PostgreSQL pokrenut nadrugom raqunaru). Tek nakon ostvarene konekcije moemo izvrxiti nekistandardni SQL upit. Konekcija se ostvaruje korixeem getConnectionmetoda Driver Manager klase. Ovaj metod uzima tri parametra 3. Prvi parametar u getConnection pozivu je niz koji odreuje URL adresuili ime raqunara gde su server nalazi (u naxem primeru, db.yale.edu)zajedno sa eventualno nekim drugim podacima kao xto su protokolkoji e se koristiti da komunicira sa bazom podataka (u naxem pri-meru jdbc : oracle : thin : - uskoro emo videti zaxto je to potrebno),broj porta koji baza podataka koristi za komunikaciju (u naxem pri-meru, 2000) i specifiqna baza podataka na serveru koja se koristi(u naxem primeru, to je univdb). Imajte na umu da JDBC precizirasamo API ali ne i komunikacioni protokol. JDBC drajver moe po-drati vixestruke protokole i moramo navesti da je podran i odstrane same baze podataka i od strane drajvera. Detai protokola suspecifiqni za svakog prodavca.

    3. j j getConnection j j j . j j

  • 8 5. SQL

    Drugi parametar u getConnection je korisniqki identifikator bazepodataka koji je predstaven kao niz.

    Trei parametar je lozinka, koja je takoe niz. Ovde vaa napome-nuti da zadavae xifre pristupa bazi podataka kroz sam Java kodpredstava opasnost da ista bude izloena neovlaxenim osobama.

    U naxem primeru sa slike 5.1, stvorili smo Connection objekatqija je podrxka Conn. Svaki proizvod koji podrava baza podataka JDBC(svi glavni prodavci baza podataka to rade) obezbeuje JDBC upravaqkiprogram koji mora da se dinamiqki umetne u ciu pristupa bazi podatakaiz Java-e.

    To se radi na taj naqin xto se poziva Class.forName sa jednimargumentom navodei konkretnu klasu koja implementira java.sql.Driverinterfejs. Ovo je navedeno u prvoj liniji koda sa slike 5.1. Ovaj inter-fejs (ili

    ) omoguava prevod produktno-nezavisnog po-

    zivaa JDBC-a u pozivaa potrebna za trenutni sistem baza podatakakoji je u upotrebi na naxem raqunaru. Primer na naxoj slici prikazujeOracle drajver, oracle.jdbc.driver.OracleDriver. Drajver je dostupan kao .jarfajl na Web sajtu proizvoaqa i treba ga postaviti i classpath tako da muJava prevodilac moe neometano pristupiti.

    Stvarni protokol koji se koristi za razmenu informacija sa ba-zom podataka zavisi od drajvera koji se koristi, a ne od definicije JDBCstandarda. Neki drajveri podravaju vixe od jednog protokola-odgovara-jui protokol mora biti izabran zavisno od protokola baze podataka kojase povezuje na drajver. U naxem primeru, kada smo ostvarili konekcijusa nazom podataka, niz jdbc : oracle : thin : nam predstava partikularniprotokol podran od strane Oracle-a.

    SQL

    Kada je jednom konekcija sa bazom podataka ostvarena, program moe ko-ristiti sistem baza podataka za izvrxavae standardnih SQL upita.To se radi preko klase Statement. Objekat Statement nije sam po sebi SQLStatement ve objekat koji omoguava Java programu da pozove metode kojeje doneo SQL Statement. Nax primer kreira tzv. StatementHandle pod na-zivom stmt na ve ostvarenoj konekciji conn.

    Kako bi se Statement izvrxio, potrebno je da izvrximo ili execu-teQuery metod ili executeUpdate metod u zavisnosti od toga elimo li daizvrximo upitnik ili ne elimo (u sluqaju kada vrximo update, insert,delete, createtable itd.). U naxem primeru stmt.executeUpdate izvrxava updateispravke koja se ubacuje u odnosu na relaciju instructor. To vraa ceobroj koji je dat kao broj n-torki (engl. tuples) koje su insertovane, update-ovane ili obrisane iz baze. Za DDL Statement-e, povratna vrednost jenula. Komande Try (...) Catch (...) nam govore da e se svaka grexka koja jenastala tokom izvrxavaa JDBC programa prijaviti (misli se na usloveo grexkama).

  • 5.1. SQL- J 9

    j

    Unaxem primeru sa slike 5.1 program izvrxava upit koristei stmt.exe-cuteQuery. Ova komanda pronalazi skup n-torki i rezultat smexta uResultSet objekat rset. Inaqe, dobija se jedan po jedan rezultat n-torki.Naredni metod .Next testira rezultujui set u potrazi za preostalimn-torkama. U sluqaju da neku n-torku nae, automacki je dodaje na setrezultata. Povratna vrednost Next metoda je Bulova vrednost koja namgovori da li je n-torka uspexno preuzeta ili nije. Atributi koji odgo-varaju n-torkama se preuzimaju na taj naqin xto se koriste razni metodikoji poqiu sa Get. Metod getString moe preuzeti osnovne tipove SQLpodataka (konvertujui dobijene vrednosti u objekat Java String). Takoese mogu koristiti i vixe restriktivni metodi, kao na primer getF loat.Argument razliqitim Get metodama moe biti ili naziv metoda pred-staven kao string, ili broj koji ukazuje na poloaj eenog atributau torci. Slika 5.1 pokazuje dva naqina preuzimaa vrednosti atributau jednoj torci : koristei ime atributa (deptname) i koristei pozicijeatributa (2, da oznaqi drugi atribut).

    I Statement-i i konekcije se zatvaraju na kraju Java programa ko-mandama stmt.close() i conn.close(). Imajte na umu da je vano da zatvoritevezu poxto postoji granica u broju ostvarenih veza sa bazom podataka ;nezatvorene konekcije upravo mogu dovesti do prekoraqea ovog limita.Ako se prethodno pomenuto desi, naxa aplikacija nee vixe moi da ost-vari konekciju sa bazom podataka.

    PreparedStatement pStmt = conn . prepareStatement (" i n s e r t in to i n s t r u c t o r va lue s ( ? , ? , ? , ? ) " ) ;

    pStmt . s e t S t r i n g (1 , "88877" ) ;pStmt . s e t S t r i n g (2 , "Perry" ) ;pStmt . s e t S t r i n g (3 , "Finance " ) ;pStmt . s e t I n t (4 , 125000) ;pStmt . executeUpdate ( ) ;pStmt . s e t S t r i n g (1 , "88878" ) ;pStmt . executeUpdate ( ) ;

    5.2 j (Statement) JDBC

    j

    Moemo kreirati pripremeni izvextaj u kome se neke vrednosti za-meuju sa ?. U naxem sluqaju, na mestima gde je postaveno ?kasnije dolaze vrednosti. Kada je upit pripremen, baza podataka ga pre-vodi ili kompajlira. Svaki put upit se izvrxava sa novim vrednostimaumesto ?. Baza podataka moe ponovo koristiti prethodno prevedenioblik upita i primeniti nove vrednosti. Fragment koda na slici 5.2 po-kazuje kako se pripremeni iskazi mogu koristiti.

    Metod prepareStatement klase Connection prihvata SQL izvaxtaj ixae na prevoee. Zatim nam vraa objekat klase PreparedStatement. U

  • 10 5. SQL

    ovom trenutku, ni jedan SQL izvextaj neqe biti izvrxen. Metode execute-Query i executeUpdate klase PreparedStatement upravo to i rade. Ali prenego xto je pozovemo, moramo koristiti metode klase PreparedStatementkako bi dodelili vrednosti ? parametrima. Metoda setString i drugesliqne metode kao xto su setInt za ostale osnovne SQL tipove nam dozvo-avaju da postavimo vrednosti za parametre. Prvi argument specifikuje ? parametar za koji smo postavili brojevnu vrednost (prvi parametarje 1, za razliku od veine ostalih Java konstrukcija koje poqiu sa 0).Drugi argument odreuje vrednost koja e biti dodeena.

    U primeru na slici 5.2, pripremamo insert izjavu, postavamo ?parametre, i na kraju izvrxavamo executeUpdate. Poslede dve linije unaxem primeru nam pokazuju kako parametri ostaju nepromeeni sve dokih specijalno ne prenesemo. Tako, konaqna izjava, koja se poziva sa execu-teUpdate, ubacuje n-torku (88878, Perry, Finance, 125000).

    Pripremene izjave dozvoavaju efikasnije izvrxee u sluqaje-vima kada je isto pitae sastaveno jednom i onda pokreneto vixe putasa razliqitim vrednostima parametara. Meutim, postoje jox znaqajnijeprednosti pripremenih izvextaja koje stvaraju eeni naqin izvrxa-vaa SQL upita kad god se koristi vrednost unexena od strane koris-nika, qak i ako se upit pokree samo jednom. Pretpostavimo da qitamovrednosti koje je korisnik uneo i onda koristimo Java string manipu-laciju kako bi konstruisali SQL izjavu. Ako je korisnik uneo nekolikospecijalnih karaktera, kao xto su jednostruki navodnici, rezultujuaSQL izjava moe biti sintaksno neispravna osim ako se ne uzme izuzetnapaa prilikom unosa podataka. Metod setString to radi automacki uba-cujui potrebne Escape karaktere kako bi osigurao sintaksnu ispravnost.

    U naxem primeru, pretpostavimo da su vrednosti za promeniveID, name, deptname i salary unexene od strane korisnika i da se odgo-varajui red ubacuje u relaciju Instructor. Pretpostavimo da, umestoda koristimo pripremenu izjavu, upitnik je konstruisan nadovezivaemstringa koristei sledei Java izraz :

    " i n s e r t in to i n s t r u c t o r va lue s ( " + ID + " , " + name + " , " +" +deptname+" , " ba lance + " ) "

    i da se upitnik izvrxava direktno koristei executeQuery metodu Sta-tement objekta. Sada, ako korisnik otkuca jedan jedini citat u pou IDili name, string upita e imati sintaksnu grexku. Sasvim je mogue danaziv instruktora moe sadrati znak navoda i egovo ime (na primer"OHenry").

    Dok gori primer sadri neprijatnosti, situacija moe da budejox gora. Tehnika zvana SQL injection se moe koristiti od strane zlona-mernih hakera u ciu oxteea same baze ili u ciu krae podataka.

    Pretpostavimo da Java program unosi string name i konstruixeupit :

    " s e l e c t from i n s t r u c t o r wherename= " + name + " "

  • 5.1. SQL- J 11

    Ako korisnik, umesto da unese ime, unese :

    X or Y = Y

    tada dobijena izjava postaje :" s e l e c t from i n s t r u c t o r wherename= " + "X or Y = Y" + " "

    koja je :s e l e c t from i n s t r u c t o r where name = X or Y = Y

    U rezultujuem upitu, where klauzula je uvek true. Kao takav, vraa seceo instruktor. Oni pametniji zlobni korisnici mogli bi da srede da naizlazu bude jox vixe podataka. Upotreba pripremenih izjava bi nas zax-titila od ovog problema zato xto ulazni string ve ima unexene Escapekaraktere, tako da rezultujui upit postaje :

    " s e l e c t from i n s t r u c t o r wherename= X\ or \ Y\ =\ Y "

    koji je bezopasan i vraa praznu relaciju.

    Stariji sistemi dozvoavaju da se vixestruke izjave izvrxavajuu jednom pozivu, dok su izvextaji razdvojeni zarezima. Ova funkcija jeeliminisana zato xto je SQL injection tehnika korixena od strane zlo-namernih hakera koji su ubacivali cele SQL iskaze. Zato xto se te izjavepokreu od strane Java programa sa privilegijama vlasnika, mogu bitiizvrxene razarajue SQL izjave poput Drop Table. Kreatori SQL apli-kacija moraju biti oprezni i svesni takvih potencijalnih sigurnosnihrupa.

    Callable Statements interfejs

    Treba rei da JDBC takoe obezbeuje CallableStatement interfejs kojiomoguava pozivae na SQL saquvane procedure i funkcije (opisanekasnije, u sekciji 5.2).

    Cal lab leStatement cStmt1 = conn . prepareCa l l ( "{?= c a l l some func t i on ( ? ) }" ) ;Cal lab leStatement cStmt2 = conn . prepareCa l l ( "{ c a l l someprocedure ( ? , ? ) }" ) ;

    Vrsta podatka povratne vrednosti funkcije i izlazni parametri pro-cedura moraju biti registrovani upotrebom metoda registerOutPara-

    meter(), a mogu se dobiti korixeem metode sliqne onima kojima su po-staveni skupovi rezultata.

    Metadata

    Kao xto smo ranije primetili, aplikacija programa Java ne ukuqujudeklaracije za podacima koji se nalaze u bazi podataka. Te izjave sudeo SQL DDL izjava. Stoga, Java program koji koristi JDBC mora ili

  • 12 5. SQL

    sadrati pretpostavke kako je kodovana xema baze podataka ili odredititu xemu podataka direktno iz koda prilikom izvrxavaa samog programa.Ovaj drugi pristup je obiqno boi jer qini da aplikacioni program pos-tane vixe robustan u odnosu na promenu xeme podataka.

    Pocetimo se da, kada smo podnosili upit upotrebom metoda execu-teQuery, rezultat upita se sadrao u objektu ResultSet. Interfejs ResultSetima metod getMetaData() koji vraa ResultSetMetaData objekat koji sadrimeta podatke o skupu rezultata. ResultSetMetaData, zauzvrat, sadri me-tode za pronalaee metapodataka informacije, kao xto su broj kolona urezultatu, ime odreenoe kolone ili tip odreene kolone. Na ovaj naqinmoemo izvrxiti upit qak i ako nemamo predstavu o xemi rezultata.

    Segment Java koda ispod koristi JDBC kako bi odxtampao imenai vrste svih kolona u skupu rezultata. Promeniva rs u kodu ispod pret-postava da se odnosi na ResultSet instancu obezbeenu kroz izvrxeeupita.

    ResultSetMetaData rsmd = rs . getMetaData ( ) ;f o r ( i n t i = 1 ; i

  • 5.1. SQL- J 13

    atributi) u odnosu na bazu podataka. Promeniva Conn pretpostava daje ve ostvaren Handle i da je konekcija sa bazom ve otvorena. MetodgetColumns uzima qetiri argumenta : ime kataloga (Null oznaqava da seime kataloga moe ignorisati), obrazac naziva xeme, obrazac imena ta-bele i obrazac imena kolone. Obrazac se moe koristiti i unutar SQLstringa i to kao % ili . Na primer, obrazac % odgovara svimimenima. Samo xeme kolona tabele zadovoavaju zadato ime ili xablon.Svaki red u setu rezultata sadri informaciju o jednoj koloni. Redovisadre podatke o broju kolona kao xto su ime kataloga, ime xeme, tabelakolona, vrstu kolone i tako dae. Ostale metode nam daju informacije obazi podataka poput relacije getTables(), referencama na osnovu sponogkuqa getCrossReference(), zatim ovlaxeima, ograniqeima baze poputmaksimalnog broja prikuqaka itd.

    Metadata interfejsi mogu se koristiti za razliqite zadatke. Naprimer, oni mogu da se koriste za pisae pregledaqa baze podataka kojibi omoguavao korisniku da pregleda tabele od kojih je saqiena samabaza. Takoe, korisnici mogu dae ispitati xemu baze, mogu odrediti re-dove u tabeli, mogu primeivati selekcije kako bi videli eene redove(filtrirae podataka) itd.

    J DBC prua niz drugih karakteristika, kao xto su promenivi sku-povi rezultata (updatableresultsets). To moe stvoriti promeniv skuprezultata iz upita koji obava izbor i/ili projekcija na relaciju baze.Aurirae n-torke u rezultujuem setu je svojevrsno aurirae setaodgovarajuih n-torki na samoj relaciji baze.

    Prema podrazumevanom, svaka SQL naredba se tretira kao po-sebna transakcija koja poqie po automatizmu. Metod setAutoCommit() uJDBC Connection interfejsu dozvoava da ovakvo ponaxae bude ukuqenoili iskuqeno. Tako, ako je Conn otvorena veza, conn.setAutoCommit(false)iskuquje automatsko startovae. Transakcije se moraju izvrxavati iliobezbediti RollBack eksplicitno korixeem ili conn.commit() ili co-nn.rollback(). conn.setAutoCommit(true) obezbeuje, odnosno ukuquje auto-macko izvrxee.

    JDBC obezbeuje interfejse koji se bave velikim objektima bezpotrebe da ceo veliki objekat bude kreiran u memoriji raqunara. Da naevelike objekte, ResultSet interfejs omoguava metode getBlob() i getClob()koje su sliqne kao i getString() metoda, ali se vraaju objekti tipa Blob iClob respektivno. Ovi objekti ne skladixte ceo veliki objekat, ve quvajulokatore za velike objekte, odnosno, ka aktielnimvelikim objektima u bazi podataka. Dobavae podataka iz ovih objekataje veoma nalik na preuzimae podataka iz ulazne datoteke ili ulaznogsignala, a moe se izvesti korixeem metoda kao xto su getBytes iligetSubString.

  • 14 5. SQL

    S druge strane, za skladixtee velikih objekata u bazi poda-taka, klasa PreparedStatement dozvoava da kolona u bazi podataka qijije tip Blob bude povezana sa ulaznim signalom (kao xto je fajl koji ebiti otvoren) upotrebom metoda setBlob(int parameterIndex, InputStreaminputStream). Kada se pripremena izjava izvrxava, podaci se qitaju izulaznog signala, i budu zapisani na Blob u bazi. Sliqno, Clob kolona moese podesiti pomou metoda setClob, koji uzima kao argumente parametarindeksa i tok karaktera.

    JDBC ukuquje tzv. RowSet funkciju koja omoguava rezultatimasetova da se prikupe kako bi bili transportovani do druge aplikacije.Red setova moe biti skeniran kako unazad tako i unapred i moe semodifikovati. Poxto redovi setova u trenutnku kada su preuzeti nisudeo same baze podataka, neemo pokriti detae ihove upotrebe u ovomdokumentu.

    5.1.2 ODBC

    O pen Database Connectivity ili ODBC standard definixe API koji apli-kacije mogu koristiti za otvarae veze sa bazom podataka, slaeupita i ispravki, i dobijae rezultata.Aplikacije kao xto su grafiqkikorisniqki interfejsi (GUI), statistiqki paketi i tabele mogu iskori-stiti isti ODBC API a povezivae na bilo koji server baze podatakakoja podrava ODBC. Svaki sistem baze podataka koja podrava ODBCobezbeuje biblioteku koja mora biti povezana sa programom klijenta.Kada klijencki program pozove ODBC API, kod u biblioteci komunicirasa serverom i izvrxava traenu akciju, i donesi rezultate.

    Primer sa slike 5.4 pokazuje primer programa pisanog u progra-mskom jeziku C. Program koristi gore pomenuti ODBC API. Prvi koraku korixeu ODBC-a u komunikaciji sa serverom je, logiqno, da se uspo-stavi veza sa serverom. Kako bi to odradio, program prvo izdvaja SQLokruee, a zatim i Handle sa konekcijom sa bazom podataka. ODBC defi-nixe tipove HENV , HDBC i RETCODE. Program zatim otvara konekcijusa bazom koristei SQLConnect. Ovaj poziv uzima nekoliko parametara,ukuqujui Handle konekcije, server na koji se povezuje, identifikatorkorisnika i xifru baze podataka. Konstanta SQL NTS oznaqava da jeprethodni argument null terminated string.

    Kada je jednom konekcija postavena, program moe slati SQLkomande u bazu podataka koristei SQLExecDirect. Promenive progra-mskog jezika C se mogu vezati sa atributima rezultata upita, tako da kadatraimo rezultate n-torki upotrebom komande SQLFetch, ene vrednostiatributa se quvaju u odgovarajuim promenivama programskoj jezika C.Funkcija SQLBindCol radi upravo to ; drugi argument identifikuje po-loaj atributa u rezultatu upita, a trei ukazuje na vrstu konverzacijeod SQL-a ka C-ju. Sledei argument daje adresu promenive. Za tipovepromenive duine poput karaktera nizova, posleda dva argumenta dajumaksimalnu duinu promenive i lokaciju gde stvarna duina treba da

  • 5.1. SQL- J 15

    void ODBCexample ( ){

    RETCODE e r r o r ;HENV env ; / environment /HDBC conn ; / database connect ion /SQLAllocEnv(&env ) ;SQLAllocConnect ( env , &conn ) ;SQLConnect ( conn , "db . ya l e . edu" , SQL NTS, " av i " , SQL NTS,

    " avipasswd" , SQL NTS) ;{

    char deptname [ 8 0 ] ;f l o a t s a l a r y ;i n t lenOut1 , lenOut2 ;HSTMT stmt ;char sq lquery = " s e l e c t deptname , sum ( s a l a r y ) from i n s t r u c t o r

    groupbydeptname" ;SQLAllocStmt ( conn , &stmt ) ;e r r o r = SQLExecDirect ( stmt , sq lquery , SQL NTS) ;i f ( e r r o r == SQL SUCCESS) {

    SQLBindCol ( stmt , 1 , SQL C CHAR, deptname , 80 , &lenOut1 ) ;SQLBindCol ( stmt , 2 , SQL C FLOAT, &sa la ry , 0 , &lenOut2 ) ;whi l e ( SQLFetch ( stmt ) == SQL SUCCESS) {

    p r i n t f ( "%s%g\n" , depthname , s a l a r y ) ;}

    }SQLFreeStmt ( stmt , SQL DROP) ;

    }SQLDisconnect ( conn ) ;SQLFreeConnect ( conn ) ;SQLFreeEnv( env ) ;

    }

    5.4 ODBC

    se quva kada je n-torka trai. Negativne vrednosti se vraaju za oblastiduine koje ukazuju da je vrednost Null, odnosno da ne postoji. Za tipovefiksne duine (kao xto su Integer ili Float), maksimalna duina poeje ignorisana, dok se negativna vrednost vraa za oblasti duine kojeoznaqavaju Null vrednosti.

    Izjava SQLFetch je, zapravo While peta koja se izvrxava sve dokSQLFetch ne vrati vrednost drugaqiju od SQL SUCCESS. Na svakom iz-vrxavau, program quva vrednosti u C promenivama koje su specifiko-vane pozivaem SQLBindCol i ispisuje te vrednosti.

    Na kraju sesije, program oslobaa Handle izjave, veza sa bazompodataka se prekida i oslobaa se veza sa SQL okrueem. Dobar pro-gramerski stil zahteva da rezultat svakog poziva funkcije mora da seproveri kako bi se utvrdilo da sam kod nema grexaka ; izostavili smoveinu ovih provera zarad kratkoe izvornog koda.

    Mogua je kreirati SQL izjavu sa parametrima ; na primer, raz-motriemo izjavu : insert into department values(?, ?, ?). Znaci pitaa sumesta za vrednosti koje e kasnije biti dodeene. Gore izjave se mogupripremiti, prevesti u bazu podataka i rapidno brzo izvrxavati pru-ajui stvarne vrednosti na mestima gde se nalaze znaci pitaa - u naxem

  • 16 5. SQL

    sluqaju, tako xto e se obezbediti naziv robe, zgrade i buet za relacijudepartment.

    ODBC definixe funkcije za razne zadatke, kao xto su prona-laee svih relacija u bazi podataka, ili pronalaee imena i vrstekolone rezultata upita ili relacija u bazi.

    Podrazumevano, svaka SQL naredba se tretira kao zasebna trans-akcija koja poqie automatski. SQLSetConnectOption(conn, SQL AUTOCO-MMIT, 0) iskuquje automacki poqetak konekcije conn, a transakcije mo-raju eksplicitno poqiati sa : SQLTransact(conn, SQL COMMIT ), ili sevratiti na : SQLTransact(conn, SQL ROLLBACK).

    ODBC standard definixe tzv. (conformancelevels), koji preciziraju podskupove funkcionalnosti definisane standa-rdom. Implementacija ODBC moe pruiti samo osnovne funkcije jezgra,ili moe pruiti vixe naprednih karakteristika (na nivou 1 ili nivou2). Nivo 1 zahteva podrxku za preuzimae informacije o katalogu, kao xtosu informacija o tome koje su relacije prisutne i koje su vrste ihovihatributa. Nivo 2 zahteva dodatne karakteristike, kao xto je mogunostda preuzima nizove parametara vrednosti i da preuzme detanije info-rmacije kataloga.

    ADO.NETADO.NET API dizajniran za V isual Basic .NET i C# programske jezike. Prua nam funk-cije za pristup podacima, koje se na visokom nivou ne razlikuju od funkcije JDBC iakose detai razlikuju. Sliqno kao i JDBC i ODBC, ADO.NET omoguava pristup rezul-tatima SQL upita, kao i da metapodacima, ali je znatno jednostavnije da ga koristimo odODBC-a. Baza podataka koja podrava ODBC moe pristupiti koristei ADO.NET API,a ADO.NET pozivi se prevode u ODBC pozive. ADO.NET moe da se koristi i sa ne-kim vrstama j kao xto je Microsoft-ov OleDB, XML, a odnedavno, entitetski okvir (Entity Framework) razvijen od strane Microsoft-a.

    SQL standard definixe nivo poziva interfejsa (CLI) koja je sli-qna ODBC interfejsu.

    5.1.3 UGRAENI SQL

    S QL standard definixe ugraivae SQL-a u raznim programskim je-zicima, kao xto su C, C++, COBOL, Pascal, Java, PL/I, ili Fortran.Jezik na kojem su SQL upiti ugraen je i naziva se j , aSQL strukture dozvoene prema jeziku domainu saqiavaju ugraeniSQL (engl. Embedded SQL).

    Programi napisani na jeziku domaina mogu koristiti ugraenuSQL sintaksu za pristup i aurirae podataka memorisanih u bazi. Ugra-eni SQL program se mora obraditi posebnim pre kom-pilacije. Pretprocesor zameuje ugraene SQL zahteve sa deklaracijamajeziqkog domaina i pozivima procedura koji omoguavaju Runtime iz-

  • 5.1. SQL- J 17

    vrxee pristupa bazi podataka. Zatim, dobijeni program se kompajlirakompajlerom jezika domaina. To je glavna razlika izmeu ugraenog SQL-a i JDBC-a, odnosno ODBC-a.

    U JDBC-u, SQL izjave se interpretiraju prilikom izvrxavaa(qak i ako su pripremene, prvo koristite funkciju pripremene izjave).Kada se koristi ugraeni SQL, SQL nekih vezanih grexaka (ukuqujuigrexake tipova podataka) moe biti uhvaen prilikom kompajliraa.

    Kako bi identifikovali zahteve ugraenog SQL-a pretprocesoru,koristiemo EXEC SQL izjavu, koja ima formu :

    EXEC SQL ;

    Taqna sintaksa za ugraene SQL zahteve zavisi od jezika na kojem jeugraeni SQL. U nekim jezicima, kao xto je COBOL, zarez se zameujesa END-EXEC.

    Mi emo staviti SQL INCLUDE SQLCA u program kako vi iden-tifikovali mesto gde e pretprocesor ubaciti specijalne promenivekoriene u komunikaciji izmeu programa i sistema baze podataka.

    Pre izvrxavaa bilo kog SQL iskaza, program se mora prvo po-vezati sa bazom podataka. Ovo se vrxi pomou :

    EXEC SQL connect to s e r v e r user username us ing password ;

    U ovom redu, Server identifikuje server na koji konekcija treba da sezasnuje.

    Promenive jezika domaina mogu se koristiti u okviru naredbiugraenog SQL-a, ali ima mora da prethodi kolona ( :) da bi se razli-kovale od SQL promenivih. Promenive koje se koriste ispod morajuse prvo deklarisati sekcijom DECLARE, kao xto je prikazano u nas-tavku. Sintaksa za deklarisae promenive, meutim, sledi uobiqajenusintaksu jezika domaina.

    EXEC SQL BEGIN DECLARE SECTION;i n t c r e d i t amount ;EXEC SQL END DECLARE SECTION;

    Ugraene SQL izjave su sliqne po formi sa redovnim SQL nared-bama. Postoji, meutim, nekoliko bitnih razlika, koje emo ovde napome-nuti.

    Za pisae relacionog upita, koristimo izjavu declare cursor. Re-zultat upita jox nije izraqunat. Umesto toga, program mora koristitiOpen i Fetch komande (koje su opisane kasnije u ovoj sekciji) kako bi do-bila rezultate n-torki. Kao xto emo videti, upotreba izjave Cursor jeanalogna iterakciji kroz rezultat postaven u JDBC.

  • 18 5. SQL

    Razmotrimo univerzitecku xemu. Pretpostavimo da imamo pro-menive jeziqkog domaina credit amount u naxem programu, deklarisanekao xto smo videli ranije, i da elimo da naemo imena svih uqenika kojisu vixe od credit amount sati. Moemo pisati ovaj upit na sledei naqin :

    EXEC SQLdec l a r e c cur so r f o rs e l e c t ID , namefrom studentwhere to t cred > : c r e d i t amount ;

    Promeniva c u prethodnom izrazu se zove cursor za upit. Koristimoovu promenivu da identifikuje upit. Zatim koristimo izjavu open, kojaizaziva da upit bude vrednovan. Izjava open u naxem primeru upita jesledea :

    EXEC SQL open c ;

    Ova izjava izaziva to da sistem baze podataka izvrxi upit i da saquvarezultate u okviru privremene relacije. Upit koristi vrednost jezikadomaina promenive (credit amount) u vreme izvrxavaa open izjave. AkoSQL upit rezultuje nekom grexkom, sistem baza podataka skladixti di-jagnostiku krexke u promenive SQL komunikacione oblasti (SQLCA -SQL Communication Area).

    Zatim koristimo niz izjava Fetch, od kojih svaka izaziva da vred-nosti jedne n-torke budu postavene u po jednu promenivu jezika domaina.Izjava Fetch zahteva jednu promenivu jezika domaina za svaki atributkao rezultat relacije. Za nax primer upita, potrebna nam je jedna pro-meniva da dri ID vrednost i druga koja dri vrednost name. Pret-postavimo da su te varijable pod imenima si i sn respektivno, i da sudeklarisani unutar sekcije DECLARE. Onda izjava :

    EXEC SQL f e t ch c in to : s i , : sn ;

    proizvodi n-torku koja predstava rezultujuu relaciju. Program za-tim moe manipulisati promenivama si i sn korixeem karakteristikeprogramskog jezika domaina.

    Jedan zahtev fetch vraa samo jednu n-torku. Da bismo dobili svezapise u rezultatu, program mora da sadri petu tako da se pree prekosvih zapisa. Ugraeni SQL pomae programeru u upravau ovih ite-racija. Iako je odnos konceptualno postaven, na n-torke rezultujuegupita su u nekom fiksnom fiziqkom poretku. Kada se program izvrxavapo zahtevu open na cursor, cursor se postava na taqku pristupa prvoj torciu rezultatu. Svaki put kada izvrxava izjava fetch, cursor se aurira daukae na sledeu n-torku u rezultatu. Kada nema vixe n-torki za obradu,matriqna promeniva SQLSTATE u SQLCA se postava na 02000 (xtoznaqi nema vixe podataka) ; taqna sintaksa za pristupae ovoj pro-menivoj zavisi od specifiqnog sistema baze podataka koji koristite.

  • 5.1. SQL- J 19

    Tako, moemo koristiti While petu (ili ekvivalentno pete) da obra-dimo svaku rezultujuu n-torku.

    Moramo koristiti izjavu close da ukaemo sistemu baze podatakana brisae privremenog odnosa koji odravan kao rezultat upita. U naxemprimeru, ova izjava ima oblik :

    EXEC SQL c l o s e c ;

    Ugraeni SQL izrazi za modifikaciju baze (update, insert i delete)ne vraaju rezultat. Tako, oni su nexto jednostavniji da se izraze. Zah-tev modifikacije baze podataka ima oblik :

    EXEC SQL < any va l i d update , i n s e r t , or de l e t e >;

    Host-jezik promenive, prethodi kao kolona, moe se pojaviti u SQL bazikao modifikacija izraavaa. Ako uslov grexke nastane u izvrxeu iz-jave, dijagnostika je postavena u SQLCA. Odnosi u bazi podataka mogutakoe biti aurirani kroz cursor-e. Na primer, ako elimo da dodamo100 do atribut plate svakog instruktora u muziqkom odeeu, moglibismo proglasiti cursor na sledei naqin :

    EXEC SQLdec l a r e c cur so r f o rs e l e c t from i n s t r u c t o rwhere dept name= Music f o r update ;

    Zatim moemo vrxiti iteraciju kroz n-torke obavaem fetch operacijana cursor-e (kao na slici ranije), a nakon svakog preuzimaa n-torki smoizvrxili sledei kod :

    EXEC SQLupdate i n s t r u c t o rs e t s a l a r y = sa l a r y + 100where cur rent o f c ;

    Transakcije mogu biti poqiane upotrebom EXEC SQL COMMIT , ilivraene nazad koristei EXEC SQL ROLLBACK.

  • 20 5. SQL

    SQLJJava ugraeni SQL, nazvan SQLJ , prua iste karakteristike kao druge ugraene SQL im-plementacije, ali koristei drugaqiju sintaksu za koju vixe odgovara da je ve prisutna uJavi, kao xto su iteratori. Na primer, SQLJ koristi sintaksu #sql umesto EXEC SQL,a umesto cursor-a, koristi Java interfejs iterator da donese rezultate upita. Tako rezul-tat izvrxavaa upita je Java iterator, a metod Next() iteratora Java interfejsa moe dase koristi za korak kroz rezultat n-torki, bax kao xto prethodni primeri koriste fetchna cursor-u. Iterator mora da ima deklarisane atribute, qije vrste odgovaraju tipovimaatributa u rezultatu SQL upita. Fragment koda ispod ilustruje upotrebu iteratora.

    #sql iterator deptInfoIter ( String dept name, int avgSal);deptInfoIter iter null;

    #sql iter { select dept name, avg(salary)from instructor

    group by dept name } ;while (iter.next()) {

    String deptName iter.dept name();int avgSal iter.avgSal();

    System.out.println(deptName + + avgSal);}

    iter.close();

    Upitnici u ugraenom SQL se normalno definixu kada se pixesam program. Postoje retke situacije kada upit treba da bude definisantokom izvrxea programa. Na primer interfejs aplikacije moe dozvo-liti korisniku da precizira uslove za izbor na odnosu jednog ili vixeatributa i moe konstruisati jednu where klauzulu u SQL upitu prili-kom izvrxavaa, sa uslovima na samo tih atributa za koje korisnik pre-cizira izbor. U takvim sluqajevima, string upita se moe konstruisatii pripremiti tokom izvrxea kao EXEC SQL PREPARE < queryname >FROM :< variable >, a cursor moe biti otvoren na upit name.

    5.2 j

    Ve smo videli nekoliko funkcija koje su ugraene u SQL jezik. Uovom delu emo pokazati kako programeri mogu pisati svoje funkcijei procedure, kako ih mogu saquvati u bazi podataka, a zatim ih pozvatiupotrebom SQL naredbi. Funkcije su posebno korisne u specijalizovanimtipovima podataka kao xto su slike i geometrijski objekti. Na primer,linijsko-segmentni tip podataka koji se koristi u mapama baze podatakana mora imati pridruenu funkciju koja proverava da li se dva segmentalinije preklapaju, a tip podataka koji ukazuje na sliku se moe odnositina funkcije za uporeivae dve slike.

    Procedure i funkcije omoguavaju da se u bazi podataka quva tzv.biznis logika, i da se kasnije izvrxava SQL naredbama. Na primer,

  • 5.2. J 21

    univerziteti obiqno imaju mnogo pravila o tome koliko kurseva uqenikmoe da da u datom semestru, minimalan broj kurseva koje nastavnik sapunim radnim vremenom mora da ispredaje u toku godine, maksimalan brojsmerova koje studenti mogu upisati, i tako dae. Dok poslovna logikamoe biti kodirana u odreenom programskom jeziku i potpuno saquvanavan baze podataka, eno definisae kao uskladixtene procedure u baziima nekoliko prednosti. Na primer, to omoguava da vixe aplikacijapristupi proceduri, a to omoguava jednu taqku promene u kodu u sluqajupromene pravila poslovaa, bez promene drugih delova aplikacije. Kodaplikacije onda moe pozivati uskladixtene procedure, umesto direktnogauriraa relacije u bazi.

    SQL omoguava definisae funkcija, procedura i metoda. Ovose moe definisati bilo preko proceduralnih komponenti samog SQL-a,bilo kroz neki eksterni programski jezik kao xto su, na primer, Java, Cili C++. Prvo emo razmotriti definicije u SQL-u, a onda emo videti- u qlanu 5.2.3 - kako treba koristiti definicije u sponim jezicima.

    Iako je sintaksa koja je ovde predstavena definisana standa-rdom SQL, veina baza podataka implementira nestandardne verzije ovesintakse. Na primer, proceduralni jezici koje podrava Oracle (PL/SQL),Microsoft SQL Server (TransactSQL) i PostgreSQL (PL/pgSQL) - svi se raz-likuju od standardne sintakse koju smo ovde predstavili.Kasnije emo ilustrovati neke razlike vezane za Oracle. Pogledajte odgo-

    c r e a t e func t i on dept_count (dept_name varchar (20) )r e tu rn s i n t e g e rbeginde c l a r e d count i n t e g e r ;

    s e l e c t count ( ) i n to d countfrom i n s t r u c t o rwhere i n s t r u c t o r . dept_name= dept_name

    return d count ;end

    5.5 j SQL-

    varajue sistemske priruqnike za vixe detaa. Iako delovi sintakse kojuovde predstavamo ne mogu biti podrani na takvim sistemima, konceptikoje opisujemo vae xirom implementacije, iako sa razliqitim sintaksa-ma.

    5.2.1 PROGLAXAVAE I POZIVAE SQL FUNKCIJA I PROCEDURA

    Pretpostavimo da elimo funkciju koja, s obzirom na naziv odeea,vraa broj instruktora u tom odeeu. Moemo definisati funkcijukao xto je prikazano na slici 5.5 4. Ova funkcija moe da se koristi uupitu koji vraa imena i buete svih odeea sa vixe od 12 instruktora :

    4. j j , "create or replace", "create", j j ( j) .

  • 22 5. SQL

    s e l e c t dept_name , budgetfrom i n s t r u c t o rwhere dept_count (dept_name) > 12 ;

    SQL standard podrava funkcije koje mogu da vrate kao rezultatetabele ; takve funkcije se nazivaju j ili Table Functions 5.Razmotrimo funkciju definisanu na slici 5.6. Funkcija vraa tabelukoja sadri sve instruktore odreenog odeea. Imajte na umu da je pa-rametar ove funkcije oznaqen tako da je fiksiran sa imenom funkcije(instructor of.dept name). Funkcija moe da se koristiti u upitu na sledeinaqin :

    s e l e c t from tab l e ( i n s t r u c t o r o f ( Finance ) ) ;

    Ovaj upitnik vraa sve instruktore na odeeu Finance. U navedenomsluqaju jednostavno je da se napixe upit bez korixea funkcije kojase oslaa na tabelu. Generalno, meutim, funkcije koje se oslaaju natabele mogu se posmatrati kao parametrizovani pregledi (parameterizedviews) koji generalizuju redovni pojam pregleda dozvoavajui parametre.

    c r e a t e func t i on i n s t r u c t o r s o f (dept_name varchar (20) )r e tu rn s t ab l e (

    ID varchar (5 ) ,name varchar (20) ,dept name varchar (20) ,s a l a r y numeric ( 8 , 2 ) )

    re turn tab l e( s e l e c t ID , name , dept_name , s a l a r y

    from i n s t r u c t o rwhere i n s t r u c t o r . dept_name = i n s t r u c t o r o f . dept_name) ;

    5.6 j SQL-

    SQL takoe podrava procedure. Debt Count funkcija moe bitinapisana i kao procedura :

    c r e a t e procedure dept_count proc ( in dept_name varchar (20) ,out d_count i n t e g e r )

    begins e l e c t count ( ) i n to d count

    from i n s t r u c t o rwhere i n s t r u c t o r . dept_name= dept_count_proc . dept_name

    end

    Kuqne reqi in i out ukazuju, respektivno, na parametre za kojese oqekuje da imaju vrednosti koje su im dodeene i parametrima qijevrednosti se postavaju u postupku kako bi se vratili rezultati.

    5. j j SQL :2003

  • 5.2. J 23

    Procedure se mogu pozivati bilo iz SQL procedura, bilo iz ugra-enog SQL-a pozivaem izjave :

    de c l a r e d_count i n t e g e r ;c a l l dept_count_proc ( Phys ics , d_count ) ;

    Procedure i funkcije se mogu pozivati iz dinamiqkog SQL-a, xto ilu-struje i JDBC sintaksa u odeku 5.1.1.4.

    SQL dozvoava vixe od jedne procedure istog imena, utoliko preukoliko je i broj argumenata procedura sa istim imenom drugaqiji. Ime,zajedno sa brojem argumenata, se koristi za identifikaciju procedure.SQL takoe dozvoava vixe od jedne funkcije sa istim imenom. Sve dokpostoje razliqite funkcije sa istim imenom, one se razlikuju u vrsti barjednog argumenta.

    5.2.2 JEZIK KONSTRUKTORA ZA FUNKCIJE I PROCEDURE

    S QL podrava konstruktore koji mu daju gotovo svu mo programskogjezika opxte namene. Deo SQL standarda koji se bavi ovim konstruk-cijama naziva se Persistent Storage Module ili PSM .

    Promenive su proglaxene koristei se Declare izjavom i moguimati vaei tip SQL podataka. Zadaci se izvode pomou izjave set. Ob-jediena izjava je oblika Begin ... End i moe sadrati vixestruke SQLizjave izmeu Begin i End. Lokalne promenive mogu biti proglaxene uokviru objediene izjave, kao xto smo videli u odeku 5.2.1. Objedienaizjava forme begin atomic ... end osigurava da su sve izjave sadrane u oji da se izvrxavaju u jednoj transakciji.

    SQL:1999 podrava While izjave i Repeat izjave poxtujui sledeusintaksu :

    whi le boolean expr e s s i on dosequence o f statements ;

    end whi l e

    repeatsequence o f statements ;

    u n t i l boolean exp r e s s i onend repeat

    Takoe postoji for peta koja omoguava iteraciju nad svim rezultatimaupita :

    de c l a r e n i n t e g e r d e f au l t 0 ;f o r r as

    s e l e c t budget from departmentwhere dept_name = Music

    dos e t n = n r . budget

    end f o r

  • 24 5. SQL

    Program pribava rezultate upita za pretragu i to po jedan red u jednomprolazu u promenivoj u peti for (u naxem primeru, to je promenivar). Izjava leave se moe koristiti za izlazak iz pete, dok iterate poqieod naredne n-torke, od poqetka pete, sa preskakaem preostalih izjava.

    Uslovne izjave koje podrava SQL ukuquju if-then-else izjave ko-rixeem sledee sintakse :

    i f boolean exp r e s s i onthen statement or compound statement

    e l s e i f boolean expr e s s i onthen statement or compound statement

    e l s e statement or compound statementend i f Reg i s t e r s a student a f t e r ensur ing c lassroom capac i ty i s not exceeded Returns 0 on succes s , and 1 i f capac i ty i s exceededc r e a t e func t i on r e g i s t e r S tuden t (

    in s_id varchar (5 ) ,in s_course id varchar (8 ) ,in s_sec id varchar (8 ) ,in s_semester varchar (6 ) ,in s_year numeric ( 4 , 0 ) ,out errorMsg varchar (100)

    r e tu rn s i n t e g e rbegin

    de c l a r e currEnro l i n t ;s e l e c t count ( ) i n to currEnro l

    from takeswhere course_id = s_course id and sec_id = s_sec id

    and semester = s_semester and year = s_year ;d e c l a r e l im i t i n t ;s e l e c t capac i ty in to l im i t

    from classroom natura l j o i n s e c t i o nwhere course_id = s_course id and sec_id = s_sec id

    and semester = s_semester and year = s_year ;i f ( currEnro l < l im i t )

    begini n s e r t i n to takes va lue s

    ( s_id , s_courseid , s_secid , s_semester , s_year , nu l l ) ;r e turn (0 ) ;

    end Otherwise , s e c t i o n capac i ty l im i t a l r eady reacheds e t errorMsg = Enrollment l im i t reached f o r course | | s_course id| | s e c t i o n | | s_sec id ;r e turn (1) ;

    end ;

    5.7 j j

  • 5.2. J 25

    SQL takoe podrava izjave case sliqne kao i C / C + + case iz-jave. Slika 5.7 daje vei primer upotrebe procesnog konstruktora u SQL-u. Funkcija registerStudent definisana na slici, registruje studenta usekciji kursa, nakon xto je utvrdila da je broj studenata u odeku neprelazi kapacitet dodeen sekciji. Funkcija vraa kod grexke, qija jevrednost vea ili jednaka 0 oznaqavajueg uspeha, i negativnu vrednostkoja oznaqava stae grexke, a poruka koja ukazuje na razlog za neuspeh jevraena kao parametar out.

    Nestandardna sintaksa za procedure i funkcijeIako SQL standard definixe sintaksu za procedure i funkcije, veina baza podataka neprate standard strogo, a postoji dosta varijacija u podranoj sintaksi. Jedan od razlogaza ovakvo stae je taj da ove baze podataka uvode podrxku za procedure i funkcije kako bisintaksa bila standardizovana i nastavaju da podravaju ihovu originalnu sintaksu. Nijeovde mogue nabrojati sintakse koje podrava svaka baza podataka, ali emo ilustrovati nekeod razlika u sluqaju Oracle PL/SQL-a, okazujui ispod verziju funkcije sa slice 5.5 kaoxto bi je definisao PL/SQL :

    create or replace function dept_count (dept_name in instructor.dept_name%type)return integer

    as

    d count integer;

    begin

    select count() into d countfrom instructor

    where instructor.dept name = dept name;

    return d count;

    end;

    Dok su dve verzije sliqne po konceptu, postoji niz maih sintaksnih razlika, od kojih suneke evidentne kada se uporede dve verzije funkcije. Iako nije ovde prikazana, sintaksaprotoqne kontrole u PL/SQL takoe ima nekoliko razlika u odnosu na sintaksu koja je ovdeprikazana.

    SQL proceduralni jezik takoe podrava signalizaciju (izuzevuslova), a deklarisae Handler-a moe prihvatiti izuzetak, kao u nared-nom kodu :

    de c l a r e out o f c lassroom s ea t s cond i t i onde c l a r e e x i t handler f o r out o f c lassroom s ea t s

    beginsequence o f statements

    end

    Izjave izmeu begin i end mogu podii izuzetak izvrxavaem signal out of-classroom seats. Handler kae da ako uslov nastaje, da se nexto preduzme,da se izae i da se prihvati nova end izjava. Alternativna akcija bi bilacontinue, koja nastava izvrxee od sledeeg izvextaja sledei onaj kojipodie izuzetak. Pored eksplicitno definisanih uslova, takoe postojeprethodna staa kao xto su sqlexception, sqlwarning ili not found.

  • 26 5. SQL

    5.2.3 SPONE JEZIQKE RUTINE

    Iko su procesna proxirea SQL-a veoma korisna, ona naalost nisupodrana na standardan naqin preko baza podataka. Qak i najosnov-nije karakteristike imaju drugaqiju sintaksu ili semantiku u razliqi-tim proizvodima baza podataka. Kao rezultat, programeri moraju da sux-tinski uqe novi jezik za svaki proizvod baze. Alternativa koja se dobijana podrci je definisati procedure kao imperativ za programski jezik,ali im omoguiti da se pozivaju iz SQL upita i da im se definicijeokidaq (engl. Trigger).

    SQL nam omoguava da definixemo funkcije u programskom jezikukao xto je Java, C#, C ili C++. Funkcije definisane na ovaj naqin mogubiti efikasnije nego funkcije odreene u SQL-u, a ako se proraqun nemoe izvesti preko SQL-a, moe se realizovati preko ovih funkcija.

    Spone procedure i funkcije mogu biti navedene na ovaj naqin(imajte u vidu da taqna sintaksa zavisi od specifiqnog sistema baze po-dataka koji koristite) :

    c r e a t e procedure dept_count_proc ( in dept_name varchar (20) ,out count i n t e g e r )

    language Cex t e rna l name / usr / av i / bin /dept_count_proc

    c r e a t e func t i on dept_count (dept_name varchar (20) )r e tu rn s i n t e g e rlanguage Cex t e rna l name / usr / av i / bin /dept_count

    Generalno, procedure sponih jezika treba da se bave Null vrednostima uparametrima (kako in, tako i out) i da vraaju vrednosti. Oni takoe mo-raju da komuniciraju sa statusima failure/success kako bi se izborili saizuzecima. Ova informacija se moe saopxtiti po ekstra parametrima :sqlstate vrednost za indikaciju failure/success statusa, parametar za spre-mae povratne vrednosti funkcije i indikator promenive za svaki re-zultat parametra/funkcije mora da ukazuje na vrednost Null. Ostali me-hanizmi su mogui prilikom rukovaa sa null vrednostima, na primerpropuxtaem pointer-a umesto vrednosti. Taqni mehanizmi zavise od bazapodataka. Meutim, ako se funkcija ne bavi ovakvim situacijama, moese dodati ekstra linija parameter style general u deklaraciju i to bi uka-zivalo na to da su spone procedure/funkcije uzete samo kao argumenti.

    Funkcije definisane u nekom programskom jeziku mogu se prevestivan sistema baze podataka, a kasnije se mogu uqitati i izvrxavati sakodom sistema baze. Meutim, to nosi rizik da grexka u programu moeda pokvari unutraxe strukture baze podataka, a takoe moe zaobiikontrolni pristup funkcionalnosti sistema baze podataka. Sistemi bazakoji su skoncentrisani vixe na performanse nego na bezbednost, izvrxa-vaju procedure na takav naqin. Baze podataka koje su skoncentrisane zabezbednost mogu da postupe po takvom kodu kao deo posebnog procesa, ko-municiraju sa vrednostima parametra, i donesu rezultate natrag, preko

  • 5.3. (TRIGGERS) 27

    interprocesne komunikacije. Meutim, prolazno vreme interprocesne ko-munikacije je priliqno visoko ; u tipiqnoj SQL arhitekturi, desetine istotine hiada instrukcija se mogu izvrxiti u vremenu predvienom zasamo jednu interprocesnu komunikaciju.

    Ako je kod napisan u bezbednom jeziku kao xto su Java ili C#,postoji jox jedna mogunost : izvrxavae koda u tzv. Sandbox-u unutarupita baze podataka samog procesa izvrxea. Sandbox omoguava da Javaili C# kod pristupa povrxini svoje memorije, ali spreqava kod u po-kuxaju qitaa ili auriraa upita izvrxea procesa. Takoe ga moespreqiti i ako pokuxa da pristupi fajlu da disku. Kreirae Sandbox-anije mogue za jedan jezik kao xto je C, xto omoguava nesmetan pris-tup memoriji preko pokazivaqa. Izbegavae interprocesne komunikacijesmauje preoptereee pozivima funkcija u velikoj meri.

    Nekoliko sistema baza podataka danas podrava spone jeziqkerutine koje se izvrxavaju u Sandbox-u u procesu izvrxea upita. Na pri-mer, Oracle i IBM DB2 dozvoavaju da se Java funkcije startuju kao deoprocesa same baze. Microsoft SQL Server dozvoava da se procedure pre-vedu u Common Language Runtime (CLR) i da se izvrxe u okviru procesabaze podataka ; mogli bi biti napisani takvi procesi, na primer, u C#ili V isual Basic-u. PostgreSQL omoguava funkcije definisane u vixe pro-gramskih jezika, kao xto su Perl, Python i Tcl.

    5.3 (Triggers)

    Okidaq je izjava da sistem automatki izvrxava kao sporedan efekatna modifikacije u bazi podataka. Kako bi dizajnirali mehanizam zaokidae, moramo ispuniti dva uslova :1. precizirati kada okidaq treba da se izvrxi. Ovo je podeeno na

    dogaaje koji uzrokuju da obaraq proveri stae i uslove koji morajubiti zadovoeni kako bi okidaq nastavio izvrxavae.

    2. specifikovati akcije koje se preduzimaju kada se okidaq izvrxava.Kada unosimo okidaq u bazu podataka, sistem baza podataka preuzimana sebe odgovornost za izvrxavae kad se god precizirani dogaaj

    desi, a odgovarajui uslov je zadovoen.

    5.3.1 POTREBA ZA OKIDAQIMA

    Okidaqi se mogu koristiti za implementaciju odreenog integritetaograniqea koja ne moe da se navede pomou SQL mehanizama. Oki-daqi su takoe korisni mehanizmi za upozoravae udi ili za pokretaeodreenih zadataka automatki kada se ispune odreeni uslovi. Kao ilu-straciju, moemo dizajnirati okidaq koji, bez obzira da li je n-torkainsert-ovana u relaciju ili Update-uje relaciju studenata, vraa ukupanbroj studenata na kursu. Kao drugi primer, pretpostavimo da skladixte

  • 28 5. SQL

    eli da odrava minimalni inventar za svaku stavku ; kada nivo inven-tara stavke padne ispod minimalnog nivoa, nalog moe biti postavenautomatki. U update-ovau ispravke nivoa inventara neke stvari, okidaquporeuje trenutni inventarski nivo sa minimalnim nivoom inventara zastavku, a ako je nivo na ili ispod minimuma, stvara novi poredak.

    Imajmo na umu da okidaqki sistemi ne mogu obiqno obavati au-rirae van baze podataka - ne moemo da koristimo okidaq u spoaxemsvetu. Umesto toga, dodajemo nareee u relaciji koja sadri preureee.Moramo stvoriti poseban trajno startovani sistem procesa koji perio-diqno skenira taj odnos. Neki sistemi baza podataka obezbeuju ugraenupodrxku za slae Email-ova iz SQL upita i okidaqa, koristei ve iz-nexeni pristup.

    5.3.2 OKIDAQI U SQL-U

    Razmislimo sada kako se okidaqi implementiraju u SQL. Ovde emopredstaviti sintaksu koja je definisana u SQL standardu, ali veinabaza podataka implementira nestandardne verzije ove sintakse. Iako si-ntaksa koju ovde dajemo ne moe biti podrana na takvim sistemima, ko-ncepti koje ovde opisujemo vae xirom implementacija. Kasnije u ovojsekciji emo diskutovati o nestandardnim prekidaqima i ihovim imple-mentacijama.

    c r e a t e t r i g g e r t imes lot_check1 a f t e r i n s e r t on s e c t i o nr e f e r e n c i n g new row as nrowf o r each rowwhen (nrow . time_slot_id not in (

    s e l e c t time_slot_idfrom time_slot ) ) / t ime_slot_id not pre sent in t ime_slot /

    beginr o l l b a ck

    end ;

    c r e a t e t r i g g e r t imes lot_check2 a f t e r d e l e t e on t ime s l o tr e f e r e n c i n g o ld row as orowf o r each rowwhen ( orow . time_slot_id not in (

    s e l e c t time_slot_idfrom time_slot ) / l a s t tup l e f o r time_slot_id de l e t ed from

    time_slot /and orow . time_slot_id in (

    s e l e c t time_slot_idfrom s e c t i o n ) ) / and time_slot_id s t i l l r e f e r en c ed from s e c t i o n /

    beginr o l l b a ck

    end ;

    5.8

    Slika 5.8 prikazuje kako okidaqi mogu da se koriste kako bi seosigurao referentni integritet na time slot id atributu relacije section.

  • 5.3. (TRIGGERS) 29

    Prva definicija prekidaqa na slici predstava kako se prekidaq inici-jalizuje insertovaa u relaciju section i osigurava da se time slot idvrednost validno ubaci. SQL izjava insert moe ubaciti po nekoliko n-torki u relaciju, a klauzula for each row u kodu prekidaqa se moe ekspli-citno ponoviti u svakom insertovanom redu. referencing new row klauzulastvara novu promenivu nrow (nazovimo je promeniva transakcije) kojaskladixti vrednost ubaqenog reda nakon ubacivaa.

    Izjava when precizira uslov. Sistem izvrxava ostatak okidaqasamo za n-torke koje zadovoavaju uslov. Begin atomic ... end klauzula moeposluiti da se prikupi vixe SQL izjava u jednom saopxteu lokacije. Unaxem primeru, doduxe, postoji samo jedna izjava, xto nadae izvrxavatransakciju koju je izazvao okidaq. Tako svaka transakcija koja krxi re-ferentni integritet ograniqea bude vraena nazad, obezbeujui po-datke u bazi koji zadovoavaju ograniqee.

    Nije dovono da se proveri referentnu tabelu na samom umetau.Takoe bi trebalo da razmotrimo brisae i aurirae section-a, kao ibrisae i aurirae referentne tabele time slot. Druga okidaqka defi-nicija na slici 5.8 razmatra sluqaj time slot-a. Ovaj okidaq proveravada li time slot id i dae postoji u torci time slot, odnosno da li ni jednan-torka ne sadri podatak o vrednosti u time slot id-ju ; u suprotnom, re-ferentni integritet bi mogao biti povreen.

    Da bi se obezbedio referentni integritet, takoe moramo krei-rati okidaqe da bi se izborili sa ispravkama za aurirae sekcije ;opisujemo naqin koji se moe izvrxiti kao aurirae, ili ga moemoostaviti da ih qitaoci definixu na vebama.

    Za aurirae, okidaq moe navesti atribute koji izazivaju izvr-xee okidaqa ; moe nadograditi druge atribute kako bi izazvao da budeizvrxen. Na primer, ako elimo da specifikujemo da se taj okidaq trebaizvrxiti nakon auriraa grade atributa u relaciji takes, pisaemo :

    a f t e r update o f takes on grade

    Klauzula referencing old row as moe da se koristi za kreirae pro-menive koja skladixti staru vrednost auriranog ili obrisanog reda.Klauzula referencing new row as se moe koristiti sa aurirae kao do-datak insertovau.

    Slika 5.9 pokazuje kako se okidaq moe koristi da bi se saquvalavrednost atributa tot cred n-torke student.Okidaq se izvrxava samo kada se atribut grade aurira od vrednosti kojaje ili nula ili F, do dela kada indikuje da je kurs uspexno zavrxen.Izjava update je normalne SQL sintakse, osim za korixee promenivenrow.

    Realniji primer implementacije ovog okidaqa takoe moe sre-diti korekciju grade koja moe izmeniti uspexan zavrxetak u neuspexan,i rukovae umetaa u kojoj odnos grade ukazuje na uspexan zavrxetak. To

  • 30 5. SQL

    c r e a t e t r i g g e r cred i t s_earned a f t e r update o f takes on ( grade )r e f e r e n c i n g new row as nrowr e f e r e n c i n g o ld row as orowf o r each rowwhen nrow . grade F and nrow . grade i s not nu l l

    and ( orow . grade = F or orow . grade i s nu l l )begin atomic

    update students e t to t cred= tot_cred+

    ( s e l e c t c r e d i t sfrom coursewhere course . course_id= nrow . course_id )

    where student . id = nrow . id ;end ;

    5.9 credits_earned

    emo ostaviti da bude veba za qitaoce.

    Kao drugi primer upotrebe okidaqa, akcija delete n-torke studentmoe biti da proveritmo da li student ima sve stavke u take relaciju, iako take, da ih obrixemo.

    Mnogi sistemi baza podataka podravaju razne druge okidaqkedogaaje, kao xto su kada se korisnik (aplikacija) uloguje na bazu (otvaravezu), sistem je gasi, ili se vrxe promene postavki sistema.

    Okidaqi (Trigger-i) se mogu aktivirati pre dogaaja (insert, deleteili update) umesto nakon dogaaja. Okidaqi koji se izvrxavaju pre dogaajamogu posluiti kao dodatna ograniqea koja mogu sprijeqiti nevaeeispravke (updates), umetaa (inserts) ili brisaa (deletes). Umesto da nas-tavi akciju da se izvrxava do grexke, okidaq moe preduzeti mere zarexavae problema, tako da update, insert ili delete postaju nevaei.Na primer, ako pokuxamo da ubacimo instruktora u odeeu qije se imene pojavuje u relaciji department, okidaq bi mogao da ubaci departmentu n-torku u glavnom kuqu. Kao drugiprimer, pretpostavimo da umetnuta vrednost ukazuje na prazno, verovatnokako bi ukazivala na odsustvo ocene. Moemo definisati okidaq kojizameuje vrednost sa vrednoxu null. Izjava set se moe koristiti zaobavae takvih modifikacija. Primer takvog okidaqa se pojavuje naslici 5.10.

    c r e a t e t r i g g e r s e t n u l l b e f o r e update on takesr e f e r e n c i n g new row as nrowf o r each rowwhen (nrow . grade = )begin atomic

    s e t nrow . grade = nu l l ;end ;

    5.10 set

  • 5.3. (TRIGGERS) 31

    Umesto obavaa rade za svaki pogoeni red, moemo izvrxitijednu akciju za celu SQL izjavu koja je dovela do insert, delete ili update.Da bismo to uradili, mi koristimo klauzulu za svaku izjavu umesto zasvaki red. Klauzule referencing old table as ili referencing ne table as seonda mogu oznaqiti kao privremena tabela (nazvana )koja sadre sve zahvaene redove. Tranzicione tabele se ne mogu koris-titi pre okidaqa ali mogu posle, bez obzira na to da li su to okidaqiizjave ili okidaqi redova.

    Jedna SQL naredba se zatim moe koristiti za obavae vixeradi na osnovu tranzicionih tabela.

    Sintaksa nestandardnih okidaqaIako je sintaksa okidaqa opisanih u ovom delu deo standardnog SQL-a, a podrana je odstrane IBM DB2, veina drugih sistema baza podataka ima nestandardnu sintaksu kojaprecizira okidaqe i ne moe se sprovesti u SQL standardu. Dajemo neke od razlika ispod ;vidite odgovarajue sistemske priruqnike za vixe detaa.

    Na primer, u Oracle sintaksi, za razliku od standardne SQL sintakse, kuqna req row se nepojavuje u izjavi referencing. Kuqna req atomic ne pojavuje posle begin. Pomiae nrowu izjavi select umetnute u izjavu za update mora poqeti sa dvotaqkom ( :) da obavesti sistemkoja promeniva nrow je eksterno definisana u SQL izjavi. Dae, podupiti nisu dozvoeniu when i if klauzulama. Mogue je rexiti ovaj problem pomeraem sloenog predikta izklauzule when u poseban upit koji quva rezultat u lokalnu promenivu, a zatim pomenemo tupromenivu kao if klauzulu, a telo okidaqa tada kree u odgovarajuu then klauzulu. Dae,u Oracle, okidaqima nije dozvoeno da izvrxe transakciju vraaa direktno ; oni umesto dakoristite funkciju nazvanu raise application error kako ne bi samo vratile transakciju, alivraaju i poruku o gre7i na korisniku/aplikaciji koja je izvrxila ispravku.

    Okidaqi se mogu iskuqiti ili ukuqiti,podrazumevano je dasu ukuqeni kada su kreirani, ali moe biti iskuqeni pomou altertrigger trigger name disable (neke baze podataka koriste alternativnu si-ntaksu kako bi onemoguili disable trigger trigger name). Okidaq koji jeonemoguen moe biti ponovo omoguen. Okidaq moe biti odbaqen (xtoga trajno uklaa), korixeem komande drop trigger trigger name.

    Vraajui se naxem primeru, skladixtu inventara, pretposta-vimo da imamo sledee odnose :

    inventory (item, level), koji napomie trenutni iznos stavke u skla-dixtu.

    minlevel (item, level), koji napomie minimalni iznos stavke koja seodrava.

    reorder (item, amount), koji napomie iznos stavke da se naruqi kadaen nivo padne ispod minimuma.

    orders (item, amount), koji napomie koliqinu iznosa stavke koja trebada se naruqi.

    Imajmo na umu da smo bili oprezni kada smo postavali nalog tekonda kada je iznos sa malo minimalnog nivoa padao minima-lnog nivoa. Ako proveravamo samo da li je nova vrednost posle auriraa

  • 32 5. SQL

    ispod minimalnog nivoa, moemo da naruqimo pogrexno dok je stavka veponovo naruqena ! Tada moemo da koristimo okidaq prikazan na slici5.11.

    c r e a t e t r i g g e r r eo rde r a f t e r update o f amount on inventoryr e f e r e n c i n g o ld row as orow , new row as nrowf o r each rowwhen nrow . l e v e l ( s e l e c t l e v e lfrom min l eve lwhere min l eve l . item = orow . item )

    begin atomici n s e r t i n to o rde r s

    ( s e l e c t item , amountfrom reo rde rwhere r eo rde r . item = orow . item ) ;

    end ;

    5.11

    SQL-bazirani sistemi baza podataka uveliko koriste okidaqe, ma-da pre SQL : 1999 oni nisu bili deo SQL standarda. Naalost, svaki sis-tem baza podataka sprovodi sopstvenu sintaksu za okidaq, xto dovodi donekompatibilnosti. SQL : 1999 sintaksa za okidaq koji smo ovde koristilije sliqna, ali ne i identiqna, sintaksi IBM DB2 i Oracle sistemima bazapodataka.

    5.3.3 KADA NE KORISTITI OKIDAQE

    Postoji mnogo dobrih upotreba okidaqa (Trigger-a) kao xto su one kojesmo upravo videli u qlanu 5.3.2., ali je neke najboe koristiti upra-vajui se alternativcnim tehnikama. Na primer, mogli bismo imple-mentirati osobinu on delete cascade ograniqea primarnog kuqa pomouokidaqa, umesto da koristimo kaskadnu funkciju. Ne samo bi bilo vixeposla za implementaciju, nego bi bilo mnogo tee za korisnika baze darazume skup ograniqea sprovedenih u bazi podataka.

    Kao drugi primer, okidaqi se mogu koristiti za odravae mate-rijalizovanih pogleda (materialized views). Na primer, ako elimo da po-drimo veoma brz pristup ukupnog broja registrovanih uqenika za svakudeonicu kursa, moemo da uradimo ovo stvaraem odnosa :

    s e c t i o n_r e g i s t r a t i o n ( course_id , sec_id , semester , year , to ta l_students )

    definisanu kroz upit :

    s e l e c t course_id , sec_id , semester , year , count ( ID) as tota l_studentsfrom takesgroup by course_id , sec_id , semester , year ;

  • 5.3. (TRIGGERS) 33

    Vrednost ukupnih studenata za svaki predmet mora da se odrava uvek odstrane okidaqa kod relacije insert, delete ili update nad n-torkom takes.Takvo odravae moe zahtevati umetaa, aurirae ili brisae n-torki od section registration, i okidaqi moraju biti u skladu sa tim napi-sani.

    Okidaqi su korixeni za odravae kopija ili replike baza po-dataka. Kolekcija okidaqa na insert, delete ili update moe biti kreiranana svakoj relaciji koja evidentira promene u odnosima. Takve promene senazivaju relacije change ili delta relacije.

    Drugi problem sa okidaqima lei u nenamernom izvrxeu koja jeizazvala akciju kada se podaci uqitavaju iz rezervne kopije, ili kada sebaza podataka aurira sa glavnog sajta na rezervni sajt. U takvim slu-qajevima izazvani okidaqi su ve izvrxeni, i obiqno ne bi trebalo dabudu ponovo izvrxeni. Prilikom uqitavaa podataka, okidaqi mogu bitieksplicitno onemogueni. Za rezervne kopije replika sistema koje mogukopirati glavni sistem, okidaqi bi morali biti inicijalno onemogueni,a omogueni kada se sa sajta za rezervne kopije preuzima obrada prima-rnog sistema. Kao alternativa, neki sistemi baza podataka dozvoavaju daokidaqi budu specificirani kao not for replication, koji dae obezbeujuda oni ne budu izvrxeni tokom replikacije baze. Ostali sistemi bazapodataka obezbeuju sistemsku promenivu koja oznaqava da je baza po-dataka replika na kojoj se ponava akcija baze podataka ; telo okidaqatreba da proveri ovu promenivu i izae ako promeniva ukazuje na staetrue. j .

    Okidaqe treba pisati sa velikom paom jer grexka u okidaqimaotkrivena prilikom izvrxavaa moe prouzrokovati neuspeh u izjaviakcije koja je pokrenula sam okidaq. Osim toga, akcija nad jednim oki-daqem moe iskuqiti jox jedan okidaq. U najgorem sluqaju, to bi mo-glo da dovede qak do beskonaqnog lanca pogrexnog okidaa. Na primer,pretpostavimo umetae okidaqa na relaciji koja izaziva jox jedno (novo)umetae na istoj relaciji. Akcija ubacivaa onda okida jox jedno uba-civae akcije, i tako dae do beskonaqnosti (ad infinitum). Neki sistemibaza podataka ograniqavaju tu duinu lanaca okidaqa (na primer, do 16ili 32) i razmatraju due lance okidaqa kao grexku. Ostali sistemi ozna-qavaju kao grexku bilo koji okidaq koji pokuxava da uputi na relacijuqiju je modifikaciju izazvao okidaq za izvrxavae.

    Okidaqi mogu posluiti u veoma korisne svrhe, ali je najboe daih izbegavamo kada postoji alternativa. Mnoge okidaqke aplikacije mogubiti zameene sa odgovarajuom upotrebom uskladixtenih procedura okojima smo raspravali u qlanu 5.2.

  • 34 5. SQL

    5.4

    Razmotrimo instancu relaciji prereq prikazane na slici 5.12 koja sa-dri informacije o raznim kursevima koji se nude na univerzitetu ipreduslov su za svaki predmet 6.

    course_id prereq_id

    BIO-301 BIO-101BIO-399 BIO-101CS-190 CS-101CS-315 CS-101CS-319 CS-101CS-347 CS-101EE-181 PHY-101

    5.12 j prereq

    Pretpostavimo sada da elimo da saznamo koji su kursevi-direktnoili indirektno-preduslov za odreeni kurs, recimo, CS-347. Dakle, e-limo da naemo kurs koji je direktan preduslov za CS-347, ili je predu-slov za kurs koji je preduslov za CS-347, i tako dae.

    Tako, ako je CS-301 preduslov za CS-347, i CS-201 je preduslov zaCS-301, i CS-101 je preduslov za CS-201 ; zatim CS-301, CS-201 i CS-101su svi preduslovi za CS-347.

    Tranzitivno zatvarae relacije prereq je relacija koja sadri sveparove (cid, pre) takva da je prethodno direktan ili indirektan preduslovza cid. Postoje brojne aplikacije koje zahtevaju proraqun sliqnih tranzi-tivnih zatvaraa na hijerarhijama. Na primer, organizacija se obiqnosastoji od nekoliko nivoa organizacionih jedinica. Maxine se sastojeod delova koji zauzvrat imaju svoje pod-delove i tako dae ; na primer,bicikl moe imati pod-delove poput toqkova i pedala, koji zauzvrat imajusvoje pod-delove kao xto su gume, felne i ice. Prelazna zatvaraa semogu koristi na takvim hijerarhijama da pronau, na primer, sve delovebicikla.

    5.4.1 TRANZITIVNO ZATVARAE UZ KORIXEE ITERACIJA

    Jedan od naqina da se napixe gori upit je da koristimo -j : prvo se pronau oni predmeti koji su direktni preduslov za CS-347, zatim oni predmeti koji su preduslov svih predmeta u okviru pr-vog seta, i tako dae. Ovaj proces se nastava sve dok ne postignemoiteraciju kod koje nema dodatih predmeta. Slika 5.13 prikazuje funk-ciju findAllPrereqs(cid) koja se brine za ovaj zadatak ; funkcija preuzima

    6. prereq j j j j j

  • 5.4. 35

    course id od kursa kao parametar (cid), izraqunava skup svih direktnihi indirektnih preduslova tog kursa, a vraa set. Postupak koristi triprivremene tabele : c prereq : skladixti skup n-torki kako bi ih vratio. new c prereq : skladixti kurseve pronaene u prethodnoj iteraciji. temp : koristi se kao privremeno skladixtee dok se neizmanipulixusetovi kurseva.

    Imajte na umu da SQL omoguava stvarae privremenih tabela kori-xeem komande create temporary table ; takve tabele su dostupne samo u

    okviru transakcije izvrxavaa upita, i odbacuju se kada se transakcijazavrxi. Xtavixe, ako dve instance findAllPrereqs teku istovremeno, svakadobija svoju kopiju privremenih tabela ; ako su delili kopiju, ihov re-zultat moe biti netaqan.

    Postupak ubacuje sve direktne preduslove kursa cid u new c prereqpre repeat pete. Repeat peta prva dodaje sve kurseve iz new c prereq uc prereq.

    Sledee, ona izraqunava preduslove svih tih kurseva u new c pre-req, osim onih koji su ve naeni u preduslovu cid, a quva ih u privremenojtabeli temp. Konaqno, ona zameuje sadraj new c prereq sadrajem temp.Repeat peta se prekida kada ne nalazi nove (indirektne) preduslove.

    Slika 5.14 pokazuje preduslove koji se mogu nai u svakoj itera-ciji, ako procedura poziva kurs pod nazivom CS-347.

    Napomiemo da upotreba except klauzule u funkciji osigurava dafunkcija radi qak i u (abnormalnim) uslovima gde postoji ciklus pre-duslova. Na primer, ako je a preduslov za b, b je preduslov za c, a c jepreduslov za a, postoji ciklus.

    Dok ciklusi mogu biti nerealni u toku preduslova kursa, moguisu u drugim aplikacijama. Na primer, pretpostavimo da imamo odnosflights(to, from) koji kae do kojih gradova se moe doi iz drugih gra-dova direktnim letom. Moemo da napixemo kod sliqan onom u funkcijifindAllPrereqs, da pronae sve gradove koji su dostupni od strane nizajednog ili vixe letova iz jednog grada. Sve xto treba da uradimo je dazamenimo prereq by flight i zameniti ga odgovarajuim imenom atributa. Uovoj situaciji, ne moe biti dostupnih ciklusa ali e funkcija raditipravilno jer e eliminisati gradove koji su ve vieni.

    5.4.2 REKURZIJA U SQL-U

    Malo je neugodno da se specifikuje tranzitivno zatvarae ako ko-ristimo iteraciju. Postoji alternativni pristup, koristei rekur-zivne definicije pogleda koji je lakxi za korixee.

    Moemo koristiti rekurziju kako bi definisali skup kurseva kojisu preduslovi za odreeni kurs, na primer CS-347, na naqin koji je opisan

  • 36 5. SQL

    c r e a t e func t i on f i ndA l lP r e r eq s ( c id varchar (8 ) ) Finds a l l c ou r s e s that are p r e r e q u i s i t e ( d i r e c t l y or i n d i r e c t l y ) f o r

    c idr e tu rn s t ab l e ( course_id varchar (8 ) )

    The r e l a t i o n prereq ( course_id , prereq_id ) s p e c i f i e s which course i s d i r e c t l y a p r e r e q u i s i t e f o r another course .

    beginc r e a t e temporary tab l e c_prereq ( course_id varchar (8 ) ) ;

    t ab l e c_prereq s t o r e s the s e t o f cou r s e s to be returnedc r e a t e temporary tab l e new c_prereq ( course id varchar (8 ) ) ;

    t ab l e new_c_prereq conta in s cour s e s found in the prev iousi t e r a t i o n

    c r e a t e temporary tab l e temp ( course_id varchar (8 ) ) ; t ab l e temp i s used to s t o r e in t e rmed ia t e r e s u l t s

    i n s e r t i n to new c_prereqs e l e c t prereq_idfrom prereqwhere course_id = c id ;

    r epeati n s e r t i n to c_prereq

    s e l e c t course_idfrom new c_prereq ;

    i n s e r t i n to temp( s e l e c t prereq . course_id

    from new c_prereq , prereqwhere new c_prereq . course_id = prereq . prereq_id

    )except (

    s e l e c t course_idfrom c_prereq

    ) ;d e l e t e from new c_prereq ;i n s e r t i n to new c_prereq

    s e l e c t from temp ;

    d e l e t e from temp ;un t i l not e x i s t s ( s e l e c t from new c_prereq )end repeat ;r e turn tab l e c_prereq ;

    end

    5.13

    u nastavku. Kursevi koji su preduslovi (direktni ili indirektni) na CS-347 su :1. Kursevi koji su preduslovi za CS-347 i2. Kursevi koje su preduslovi za one kurseve koji su preduslovi (di-

    rektno ili indirektno) za CS-347.Imajte na umu da je sluqaj 2 , jer definixe skup kurseva kojisu preduslovi CS-347 u pogledu seta kurseva koji su preduslovi CS-347.Drugi primeri prelaznog zatvaraa, kao xto su pronalaee svih pod-delova datog dela (direktno ili indirektno) mogu se rekurzivno defini-sati na sliqan naqin.

    Od verzije SQL : 1999, SQL standard podrava j, koristei se with recursive klauzulom, gde su pogled (engl.V iew) ili privremeni pogled (engl. temporary view) izraeni u pogledu

  • 5.4. 37

    j j n- C1

    01 (CS-301)2 (CS-301), (CS-201)3 (CS-301), (CS-201)4 (CS-301), (CS-201), (CS-101)5 (CS-301), (CS-201), (CS-101)

    5.14 CS-347 j j findAllPrereqs

    samoga sebe. Rekurzivni upiti mogu da se koriste, na primer, za koncizneizraze prelaznih zatvaraa. Podsetimo se da se with klauzula koristi zadefinisae privremenog pogleda qija je definicija dostupna samo upituu kojem je ona definisana. Dodatna kluqna req recursive precizira da jepogled rekurzivan.

    Na primer, moemo da naemo svaki par (cid, pre) takav da je predirektno ili indirektno preduslov za kurs cid. To emo postii SQLrekurzivnim pogledom prikazanim na slici 5.15.

    with r e c u r s i v e c_prereq ( course_id , prereq_id ) as (s e l e c t course_id , prereq_idfrom prereq

    unions e l e c t prereq . prereq_id , c_prereq . course_idfrom prereq , c_prereqwhere prereq . course_id = c_prereq . prereq_id

    )s e l e c t from c_prereq ;

    5.15 SQL-

    Bilo koji rekurzivni pogled mora biti definisan kao zajednicadva podupita : koji je nerekurzivan i koji koristi rekurzivni pogled. U primeru na slici 5.15, bazni upit jeizbor na prereq dok se rekurzivan upit izraqunava pridruivaem prereqi rec prereq.

    Znaqee rekurzivnog pogleda je najboe xvatiti na sledei na-qin. Prvo se izraquna bazni upit i dodaju se sve rezultante n-torkina relaciji rekursivno definisanog pogleda rec prereq (koja je u poqetkuprazna). Sledee, izraqunava se rekurzivni upit koristei se trenutnimsadrajem relacije pogleda, i dodaje sve rezultujue n-torke nazad napregled odnosa. Ponavaju se gori koraci sve dok ne bude bilo vixenovih n-torki koje trebaju da se dodaju u relaciju pogleda. Rezultujuainstanca relacionog pogleda se naziva definicije rekur-zivnog pogleda (Termin

    fiksna se odnosi na qienicu da ne postoji

    daa promena). Relacioni pogled je takoe definisan da sadri upravoone n-torke u fiksnoj taqki.

  • 38 5. SQL

    Primenom gore iznexene logike na nax primer, mi emo prvopronai sve direktne preduslove svakog kursa izvrxavaem osnovnog upi-ta. Rekurzivan upit dodaje jox jedan nivo kurseva u svakoj iteraciji, domaksimalne dubine kursa. U tom trenutku je relacija prereq postignuta.U ovom trenutku nema novih n-torki koje se dodaju prikazu, i dostignutaje fiksna taqka.

    Da bismo pronaxli preduslove za odreeni predmet, kao xto jeCS-347, moemo izmeniti nivo sponog upita dodajui klauzulu :

    where

    rec prereq.course id = CS-347. Jedan od naqina da se proceni upit sa izbo-rom je izraqunati puni sadraj rec prereq koristei iterativnu tehniku,a zatim izaberati iz ovog rezultata samo one upite qije n-torke sadreCS-347. Meutim, to bi dovelo do proraqunatih parova za sve kurseveod kojih su svi irelevantni, osim onih za kurs CS-347 ! U stvari, sistembaza podataka ne zahteva da koristimo goru iterativnu tehniku da biizraqunali puni rezultat rekurzijom upita i da bi onda izvrxiti izbor.Moemo dobiti isti rezultat koristei druge tehnike koje mogu bitiefikasnije, a koje se koriste u funkciji findAllPrereqs koju smo ranijeve videli.

    Postoje neka ograniqea rekurzivnog upita sa rekurzivnim pogle-dom ; konkretno, pitae treba da bude monotono, odnosno en rezultat nainstanci relacije pogleda V1 treba da bude nadskup egovog rezultata narelaciji pogleda V2 ako je V1 nadskup V2. Intuitivno, ako se doda jox n-torki na relaciju pogleda (engl. view relation), rekurzivan upit treba davrati najmae isti skup n-torki kao i ranije, a moda vrati i dodatnen-torke.

    Rekurzivne upite ne treba koristiti na nekim od sledeih ko-nstrukata, jer bi upit postao :

    agregacija na rekurzivnom prikazu ; ne postoji na podupitima koji koriste rekurzivni pogled ; set razlika qija desna strana koristi rekurzivni pogled.

    Na primer : ako je rekurzivno pitae oblika r - v gde je v rekurzivnipogled, ako dodamo n-torku na v rezultat upita postaje mai, odnosnoupit vixe nije monoton.

    SQL takoe omoguava stvarae rekursivno definisanih stalnihpogleda korixeem create recursive view na mestu with recursive. Nekeimplementacije podravaju rekurzivne upite koristei drugaqiju sinta-ksu ; pogledajte odgovarajue sistemske priruqnike za vixe detaa.

    5.5 j

    Podrxka agregacija u SQL-u, koji smo ranije videli, je veoma mona,ihvata se u koxtac sa najqexim zadacima sa lakoom. Meutim,

  • 5.5. J 39

    postoje neki od zadataka koje je texko efikasno implementirati u osnovnefunkcije agregacije. U ovom delu, uqimo funkcije koje su dodate SQL-u ikoje obavaju neke takve zadatke.

    5.5.1 RANGIRAE

    Pronalaee poloaja promenive u veem setu je qesta operacija. Naprimer, eleli bismo da dodelimo uqenicima ocene u klasi na osnovuihove proseqne ocene (GPA, engl. grade point average), gde ocena 1 idestudentima sa najvixom proseqnom ocenom, ocena 2 studentima sa nared-nim prosekom ocena itd. Povezani tip upita je da pronau percentilekojima vrednosti i pripadaju (na primer, doi trei, sredi trei, iligori trei). Dok se ovakvi upiti mogu izraziti preko SQL konstrukcijakoje smo do sada videli, povezanim tipovima je vrlo texko da se izrazepreko takvih konstrukcija i vrlo lako postaju irelevantni tipovi. Pro-grameri mogu razvrstati takav upit delimiqno na SQL, a delimiqno naneki programski jezik. Mi emo ovde prostudirati SQL podrxku neposre-dnom izjaxavau ove vrste upita.

    U naxem primeru univerziteta, relacija takes pokazuje koji jerang svaki student zaradio u svakom kursu ponaosob. Da bi ilustro-vali rangirae, pretpostavimo da imamo pogled student grades(ID, GPA)dodeujui proseqne ocene svakom studentu 7.

    Rangirae se vrxi sa specifikacijom order by. Sledei upit dajerang svakog uqenika :

    s e l e c t ID , rank ( ) over ( order by (GPA) desc ) as s_rankfrom student_grades ;

    Imajte na umu da redosled n-torki u izlazu nije definisan tako da . Mora biti ubaqena dodatna order by klau-zula kako bi bile sortirane, a to je prikazano na primeru ispod :

    s e l e c t ID , rank ( ) over ( order by (GPA) desc ) as s_rankfrom student_gradesorder by s_rank ;

    Osnovni problem sa rangovaem je kako se nositi sa sluqajemvixestrukih n-torki sa istim rasporedom atributa. U naxem primeru,to znaqi kako emo se odluqiti xta da radimo u sluqajevima kada dvauqenika imaju istu proseqnu ocenu. Funkcija rank daje isti rang svim to-rkama koji su jednake po atributu. Na primer, ako najvixi prosek deledva studenta, obojica se rangiraju sa 1. Sledei rang bi bio 3, a ne 2tako da, ako tri uqenika dobiju rang koji je naredni do najvixeg, oni bi

    7. SQL student_grades j j j j j j

  • 40 5. SQL

    svi dobili rang 3, a naredni student/studenti bi bili rangirani sa 6itd. Tu je, takoe, i funkcija dense rank koja ne stvara praznine u naru-qivau. U gorem primeru, n-torke sa drugom najveom vrednoxu e sveodreda dobiti rang 2, n-torke sa treeg e biti rangirane sa 3 itd.

    Mogue je izraziti prethodni upit osnovnim SQL agregatnim fu-nkcijama koristei sledei upit :

    s e l e c t ID , (1 + ( s e l e c t count ( )from student_grades Bwhere B.GPA > A.GPA) ) as s_rank

    from student_grades Aorder by s_rank ;

    Trebalo bi biti sasvim jasno da je rangirae studenta jedno-stavno 1 plus broj studenata sa najveom proseqnom ocenom, xto gorepitae upravo precizira. Meutim, ovaj proraqun rangiraa svakog stu-denta oduzima vreme koje je linearno vee u odnosu na vreme potrebno zaveliqinu same relacije. Na velikim relacijama, gori upit bi se izvrxa-vao puno vremena. Nasuprot tome, sistemska implementacija rank klauzulemoe j i izraqunati rank za mnogo mae vremena.

    Rangirae se moe uraditi u okviru particija podataka. Na pri-mer, pretpostavimo da elimo da rangiramo studente po odeeu, a nepo celom univerzitetu. Pretpostavimo da je pogled definisan kao stude-nt grades, ali ukuquje i ime odeea : dept grades(ID, dept name, GPA).U tom sluqaju, sledei upit daje rang uqenika u svakoj sekciji :

    s e l e c t ID , dept_name ,rank ( ) over ( p a r t i t i o n by dept_name order by GPA desc ) as dept_rank

    from dept_gradesorder by dept_name , dept_rank ;

    Spona order by klauzula rasporeuje rezultujue n-torke po nazivu ode-ea, a u okviru svakog odeea po rangu.

    Vixestruki rank izrazi mogu da se koriste u okviru jedne iza-brane izjave ; tako moemo dobiti ukupno rangirae i rangirae unu-tar odeea koristei dva rank izraza u istoj select klauzuli. Kada serangirae (eventualno sa podelama) java zajedno sa group by klauzu-lom, primeuje se prvo klauzula group by, a podela (engl. partitioning)i rangirae se vrxi nad sortiranim rezultatima. Takve agregatne vre-dnosti se zatim mogu koristiti za rangirae. Mogli smo napisati naxerangirae studenta preko student grades bez upotrebe pogleda, koristeijedanu select klauzulu. Ostavamo detae kao vebu za vas.

    Funkcije rangiraa se mogu koristiti za pronalaee n-torki navrhu, ugradom rangoranog upita u upit spoaxeg nivoa ; detae emoostaviti za vebu. Imajte na umu da je doi n jednostavno isti kao gorin samo sa . Nekoliko sistema baza podataka danasobezbeuju nestandardna SQL proxirea kako bi dikektno naveli samoone n-torke koje su stvarno potrebne ; takve ekstenzije j funk-

  • 5.5. J 41

    ciju rank i pojednostavuju funkciju optimizatora. Na primer, neke bazepodataka dozvoavaju da se klauzula

    limit ndoda na kraj SQL upita qime

    se postie to da samo prve n-torke budu na izlazu ; ova klauzula se ko-risti zajedno sa klauzulom order by kako bi obezbedila n-torke sa vrha,xto ilustruje sledei upit koji pronalazi ID i GPA od 10 najboih stu-denata u redosledu GPA :

    s e l e c t ID , GPA)from student_gradesorder by GPAl im i t 10 ;

    Meutim, klauzula limit ne podrava podelu tako da ne moemo dobitin-torke unutar svake particije bez obavaa rangiraa ; dae, ukolikovixe od jednog studenta dobije isti GPA, mogue je da e jedan bitiukuqen u gorih 10, a ostali bi bili iskuqeni.

    Unesto funkcije rank moe se koristiti nekoliko drugih. Na pri-mer, percent rank n-torka daje n-torku kao frakciju. Ako postoje n-torke uparticiji, a rang n-torke je r, onda se ihov procentualni rang definixeako :

    r 1n 1

    a kao Null ako postoji samo jedna n-torka u particiji 8. Funkcija cume dist(skraeno od cumulative distribution, odnosno

    j)

    za n-torku se definixe kao :p

    n

    gde je p broj n-torki u particiji sa vrednostima sortiranim po pretho-dnom ili sortiranom redosledu n-torke, a n ukupan broj n-torki u parti-ciji. Funkcija row number sortira redove i daje svakom redu jedinstvenibroj koji odgovara enom poloaju u sortiranom redu ; razliqiti redovisa istim sortiranim vrednostima bi dobili razliqite brojeve redova, na naqin.

    Konaqno, za datu konstantu n, rang funkcijentile(n)uzima n-

    torke u svakom podeli po ve definisanom poretku i deli ih na n-korpesa identiqnim brojem n-torki 9. Za svaku n-torku, funkcija ntile(n) zatimdaje broj korpi u kojoj je postavena, sa brojem korpi poqevxi od 1. Ovafunkcija je posebno korisna za izgradu histograma na osnovu procen-tila. Narednim upitom moemo pokazati kvartile u kojima svaki uqenik

    padne na osnovu proseqne ocene (GPA) :

    s e l e c t ID , n t i l e (4 ) over ( order by (GPA desc ) ) as q u a r t i l efrom student_grades ;

    8. j j j 9. j n- j j n, j n- ( )

    j 1. n- - , , j n- j.

  • 42 5. SQL

    Prisustvo Null vrednosti moe da zakomplikuje definiciju ranga,jer nije jasno gde treba da se javaju prvi rangovi u sortiranom poretku.SQL dozvoava korisniku da odredi gde bi trebalo da se javaju ko-rixeem nulls first, a gde korixeem nulls last, na primer :

    s e l e c t ID , rank ( ) over ( order by GPA desc nu l l s l a s t ) as s rankfrom student_grades ;

    5.5.2 WINDOWING

    Prozorski upiti izraqunavaju ukupnu funkciju nad dometima torki.Ovo je korisno za, na primer, agregatno izraqunavae fiksnog opsegavremena ; raspon vremena se naziva . Prozori se mogu preklapati, ato je sluqaj kada n-torka moe doneti vixe od jednog prozora. Ovo se raz-likuje od particija koje smo ranije upoznali, a kod kojih n-torka donosisamo jednu particiju.

    Primer upotrebe prozora je analiza trenda. Uzmimo u obzir naxraniji primer prodaje. Prodaja moe varirati xiroko iz dana u dan na os-novu faktora kao xto su vreme (na primer snena oluja, poplava, uragan).Meutim, tokom dovono dugog vremenskog perioda, oscilacije mogu bitimae (nastavajui primer, rodaja moe

    nadoknaditi vremenski vezane

    padove). Analiza trixta berze je jox jedan primer upotrebe konceptaprozora. Razni pokretni proseci nalaze se na poslovnim i investicio-nim Web sajtovima.

    Relativno je lako napisati SQL upit koristei one funkcije kojesmo ve prouqavali i izraqunati agregatno stae preko jednog prozora,na primer, prodaju preko fiksnog perioda od 3 dana. Meutim, ako elimoda uradimo ovo za svaki period od 3 dana, pitae postaje glomazno.

    SQL obezbeuje funkciju prozora da bi podrao takve upite. Pre-tpostavimo da je dat pogled tot credits (year, num credits) koji daje ukupanbroj uzetih kredita od strane studenata svake godine. Imajte na umu daovaj odnos moe sadrati najvixe jednu n-torku za svaku godinu. Razmo-trimo sledei upit :

    s e l e c t year , avg ( num_credits )over ( order by year rows 3 preced ing )as avg_tota l_cred i t s

    from to t_c r ed i t s ;

    Ovaj upit izraqunava prosek u tri predhodne n-torke. Tako, za 2009. go-dinu, ako su n-torke za 2008. i 2007. prisutne u relaciji tot credits gdesvaka godina predstava samo po jednu n-torku, rezultat definicije pro-zora je prosek vrednosti za godine 2007, 2008, i 2009. Prosek svake go-dine se raquna na vrlo sliqan naqin. Za najraniju godinu u odnosu natot credits, proseqna bi bila samo za tu godinu, dok je za narednu godinuprosek gotovo za dve godine. Imajte na umu da ako relacija tot credits ima

  • 5.5. J 43

    vixe od jedne n-torke za odreenu godinu, moda postoji vixe moguihn-torki koje su sortirane po godini. U ovom sluqaju, definicija prethod-nih n-torki je zasnovana na implementaciji zavisnoj o sortirau, i nijejedinstveno definisana.

    Pretpostavimo da umesto da idu unazad za neki fiksni broj n-torki, elimo prozor koji e se sastojati od svih prethodnih godina. Toznaqi da se broj prethodnih godina ne smatra fiksnim. Kako bismo dobiliukupne proseqne kredite preko svih prethodnih godina pixemo :

    s e l e c t year , avg ( num_credits )over ( order by year rows unbounded preced ing )as avg_tota l_cred i t s

    from to t_c r ed i t s ;

    Mogue je korixee reqi following umesto preceding. Ako smoovo uradili u naxem primeru, vrednost godine oznaqava poqetak prozoraumesto kraja. Sliqno moemo navesti da prozor poqie pre trenutne n-torke, a zavrxava posle e :

    s e l e c t year , avg ( num_credits )over ( order by year rows between 3 preced ing and 2 f o l l ow i ng )as avg_tota l_cred i t s

    from to t_cr ed i t s ;