WWW-sovellusten toteutus Oracle-tietokantaa käyttäen Tietokantasovellusten harjoitustyö -kurssilla
Tässä ohjeessa kuvataan WWW-sovellusten Helsingin yliopiston tietojenkäsittelytieteen laitoksen Tietokantasovellusten harjoitustyö- kurssin yhteydessä. |
Manuaalit ja ohjekirjat
- ORACLE 8:
- Huom. Oracle manuaalien käyttö on rajattu Helsinki.fi domainin sisäiseksi:
- Oracle tietokantapalvelimen manuaalit (mm. SQL ja PL/SQL)
- Developing PL/SQL Web Appications
- PL/SQL Web toolkit Reference (htp, yms)
- The Oracle Web Server FAQ
-
ORACLE 9:
- SQL Reference Manual
- SQLplus Quick Reference
- SQLplus User's Guide and Reference
- Error Messages
- JDBC Developers Quide and Reference
- PL/SQL User's Guide and Reference
- HTML
Toteutusympäristö
Tietokanta toteutetaan joko
Tietokannan käsittely sql:llä
- Alustustoimet koneessa kontti:
-
Komennoilla
setup o8 setenv ORACLE_SID tktb
luodaan tietokannan käyttöön tarvittava ympäristö - Alustustoimet koneessa bodbacka ovat seuraavat. Nämä rivit voi sijoittaa kyseisen koneen .bashrc tiedostoon.
- Sql-käynnistyy alustustoimien jälkeen kontissa interaktiivisena komennolla: sqlplus / . Koneessa bodbacka on annettava käynnistyskomento muodossa sqlplus, jolloin järjestelmä kysyy Oracle-käyttäjätunnusta sekä salasanaa. Komennon voisi antaa myös muodossa sqlplus oracletunnus/salasana, mutta tällöin salasana saattaa näkyä joissakin unix-prosessilistauksissa.
- Valmiin sql-skriptin skripti.sql voit ajaa komennolla sqlplus / @skripti.sql (tai sqlplus oracletunnus /salasana @skripti.sql ). Jos skripti loppuu exit-komentoon, palaa kontrolli unix-komentotulkin tasolle, muuten kontrolli jää SQL-komentotulkille (prompti 'SQL>').
Ylläolevat komennot voi sijoittaa .login tiedostoon, jolloin niitä ei tarvitse tehdä erikseen jokaisella käynnistyskerralla.
export CLASSPATH=/home/tkt_orac/OraHome1/JRE/lib
export ORACLE_HOME=/home/tkt_orac/OraHome1
export LD_LIBRARY_PATH=/home/tkt_orac/OraHome1/lib:$LD_LIBRARY_PATH
export TWO_TASK=test
export PATH=$PATH:/home/tkt_orac/OraHome1/bin
Jos tämän komennon annettuasi saat ilmoituksen siitä, ettei komentoa sqlplus löydy, et ole suorittanut ylläesitettyjä alustustoimintoja.
Kun komentotulkki on käynnistynyt voit antaa sql komentoja tai suoritaa valmiiksi laatimiasi komentotiedostoja. Esimerkiksi tiedostoon skripti.sql kirjoitetut komennot suoritetaan käskyllä
start skripti.sql
tai
@skripti.sql
Tietokantaproseduurit
Oracle Web Serveriä käytettäessä www-sovelluksen tietokantakytkentä toteutetaan tietokantaproseduurien avulla. Tietokantaproseduuri on tietokantaan talletettu käännetty tietokannan käsittelyohjelma. Proseduurilla voi olla parametreja. Proseduurien laatimiseen käytetään PL/SQL-ohjelmointikieltä. Kielestä löytyy laaja englanninkielinen manuaalimateriaali. Tähän dokumenttiin sisätyy lyhyt suomenkielinen tiivistelmä PL/SQL:n proseduureista . WWW-sovelluksissa tietokantaproseduureja käytetään tietokannan tietoja sisältävien WWW-sivujen tuottamiseen tai käsittelyyn, esimerkiksi
- raporttien laadintaan
- päivityslomakkeita sisältävien www-sivujen tuottamiseen
- www-sivulla olevan lomakkeen tietojen käsittelyyn
HUOM: REKURSIIVISTEN PROSEDUURIEN KÄYTTÖ ON KIELLETTYÄ!
Proseduurit voidaan toteuttaa esimerkiksi siten, että jokainen proseduuri kirjoitetaan erilliseen tiedoston ja proseduurit käännetään erikseen. Tiedoston rakenne on tällöin seuraava:
create or replace procedure proseduurin_nimi ( < parametrit > ) is paikalliset tietorakenteet begin proseduurin_runko end; / show errors EXITjos tiedoston nimi olisi pros1.pl se käännettäisiin komennolla: sqlplus / @pros1.plProseduurin toimivuutta voi testata sqlplus-ympäristössä seuraavasti:
Tulosta voi sitten ihailla tiedostosta (tiedosto.joku yllä). Tulos tulee myös näytölle ellei sitä erikseen estetä. Syntyneen html-sivun voi tarkistuttaa jossakin www-sivujen validointipalvelussa. Sopivan voi valita vaikkapa Heikki Kantolan listasta.
SQL> set serveroutput on tk-palvelin tulostakoon SQL> spool tiedosto.joku ohjataan tulostus tiedostoon SQL> execute proseduurin_nimi(parametrit) suoritetaan proseduuri SQL> execute owa_util.showpage varsinainen tulostus
Tietokannan WWW-kytkentä
Viittaukset omiin tauluihin ja proseduureihin
Harjoitustöissä käytettävä WWW-kytkentä on toteutettu siten, että viitattaessa proseduureissa tietokannan tauluun täytyy viittaukseen aina sisällyttää myös taulun omistajan Oracle-tunnus, esim.select sarake1 into muuttuja from ops$virtanen.testi where avain=123Omistajan Oracle-tunnus on sisällytettävä myös proseduurikutsuihin, esim. ops$virtanen.proseduuri1.
Oikeudet WWW-käyttöön
Harjoitustyön yhteydessä tapahtuvaan taulun käsittelyyn ja tietokantaproseduurien suoritukseen WWW:n kautta täytyy antaa lupa käyttäjälle www_user. Proseduuriin liittyvä suorituslupa on yksinkertaisinta antaa proseduurin koodin sisältävään tiedostoon kauttaviivarivin jälkeen sijoitettavalla lauseellagrant execute on proseduurin_nimi to www_user;
www_user:lle on annettava myös taulujen käsittelyoikeudet. Taulun lukuoikeuden voi antaa sql-komennolla:
grant select on taulun_nimi to www_user;.
Lupien hallintaa varten ovat käytettävissä myös unix-komentotiedostot:
$INFOTYO/sallikaikki Sallii www_user:lle kaikki operaatiot kaikkiin tauluihin ja antaa suoritusoikeudet kaikkiin käyttäjän proseduureihin $INFOTYO/sallitaulu taulu Sallii kaikki operaatiot tauluun taulu $INFOTYO/salliluku taulu Salliin vain lukuoperaatiot tauluun taulu. $INFOTYO/sallisuoritus proseduuri Sallii proseduurin proseduuri suorituksen; $INFOTYO/estakaikki Peruu kaikki myönnetyt oikeudet $INFOTYO/estataulu taulu Peruu kaikki oikeudet tauluun taulu Huomattakoon, että lupa proseduurin käyttöön on uudistettava aina käännöksen jälkeen. Jos annoit sallikaikki-skriptillä oikeudet kaikkiin tietokantakomponentteihisi, niin työhakemistosi tiedostosta gluvat.sql näet, mitä oikeuksia tulit antaneeksi.
Tietokantaproseduurin liittäminen WWW-sivuun
- Tietokantaproseduuriin viittava URL
Tietokantaproseduuri liitetään www-sivuun Oracle Web Serverin kautta käyttämällä viittausta
http://kontti.helsinki.fi:8011/tktb/plsql/kayttaja.proseduurin_nimi
Alkuosa ylläolevasta URL:sta (http://kontti.helsinki.fi:8011/tktb/plsql/) identifioi käytettävän tietokantayhteyden. Tämä osa on sama kaikissa linkeissä. Loppuosassa ilmoitetaan käynnistettävän tietokantaproseduurin nimi, esim ops$virtanen.prossu1.
Tämän muotoista viittausta voidaan käyttää millä tahansa www-sivulla. Generoitaessa tietokantaproseduureissa samaan tietokantayhteyteen perustuvia www-sivuja voi suhteellisena viittauksena käyttää muotoa käyttäjä.proseduurin_nimi.
- Parametriluettelo URL:ssa
Jos kutsuttavalla proseduurilla on parametreja, ne voidaan välittää proseduurille liittämällä linkin perään parametriluettelo. Parametriluettelon muoto on
?pNimi1=arvo1&pNimi2=arvo2 ...
Parametrin nimen täytyy olla tietokantaproseduurin määrittelyssä esiintyvä parametrinimi. Sen arvon täytyy sopia yhteen proseduurin määrityksessä annettun tietotyypin kanssa. Parametrien järjestyksen ei tarvitse olla sama, missä parametrit esiintyvät proseduurimäärityksessä. Jos proseduurin parametreilla ei ole oletusarvoja, on kaikille parametreille annettava kutsussa arvo.
- Parametrit HTML-lomakkeelta
Parametrit voidaan välittää myös HTML-lomakkeen kautta. Tällöin viittaus käynnistettävään proseduuriin annetaan FORM-lausekkeen ACTION määreenä. FORM-lausekkeessa esiintyvä METHOD määre kuvaa parametrien välitystavan: GET-tapa välittää parametrit ympäristömuuttujan QUERY_STRING arvona (tällöin parametrit myös näkyvät selaimen osoite-kentässä). POST-tapa välittää parametrit standardisyöttöjonon kautta. Proseduurin kannalta ei ole merkitystä sillä kumpaa välitystapaa käytetään. Ympäristömuuttujan koko on kuitenkin rajoitettu, joten, jos parametreja on monta ja niiden arvot voivat olla pitkiä, on syytä käyttää POST-tapaa.
Varsinaisia parametreja varten lomakkeeseen määritellään kenttiä. Kenttä määritellään HTML:n INPUT-, TEXTAREA- tai SELECT-lausekkeella. Lausekkeeseen sisältyvä NAME-määre kytkee kentän tietokantaproseduurin parametriin. NAME-määreen arvona on oltava parametrin nimi. HTML:ssa on eri tyyppisiä syöttökenttiä. INPUT-lausekkeen TYPE-määre määrää syöttökentän tyypin. Mahdollisia tyyppejä ovat:
Parametrien arvona välitetään kentän VALUE-määreen arvo tai, jos kenttään on kirjoitettu jotain, niin kirjoitettu arvo.INPUT-kenttien lisämääreitä on syytä katsoa HTML-ohjeista, esim. Jukka Packalenin HTLM-opas.
- checkbox (valintanappi)
- image (kuvallinen lähetysnappi)
- hidden (piilokenttä, josta ei näy mitään (paitsi lähdemuodossa))
- password (tekstikenttä, johon kirjoitettava arvo ei näy)
- radio (poissulkeva valintanappi)
- text (yksirivinen tekstikenttä)
- submit (lähetysnappi)
Esimerkki:
<FORM ACTION="http://kontti.helsinki.fi:8011/tktb/plsql/info1.esim1" METHOD="POST"> <INPUT TYPE="text" NAME="onimi" SIZE=40 MAXLENGTH=40 VALUE=""> <INPUT TYPE="submit" VALUE="HAE"> </FORM>Tuottaa yksikenttäisen lomakkeen, jonka kenttään Nimi kirjoitettu arvo välittyy omistajan info1 proseduurin esim1 parametrin onimi arvoksi. Proseduuri esim1 on rakenteeltaancreate or replace procedure esim1 ( in onimi varchar2) is begin tee_hommat; end;Proseduurille voi välittää myös taulukkomuotoisia parametreja. Näiden käytöstä löytyy lisäohjeita vinkkisivulta.
Sivun generointi tietokantaproseduurissa
Tietokantaproseduurin tarkoituksena on usein tuottaa uusi www-sivu, joka sisältää tietokannan tietoja, esimerkiksi kyselyn vastauksen. Tällaisten sivujen tuottamista varten on käytettävissä joukko kirjastorutiineja. Kirjastorutiinit on koottu pakkauksiksi. Keskeisimmin tarvittava pakkaus on htp, joka sisältää html-elementtien tuottamiseen tulossivulle tarvittavia proseduureja. htp-pakkauksessa on oma proseduuri kutakin html-lauseketyyppiä varten.
Linkki HTP-pakkauksen manuaaliin löytyy sivun alun manuaaliosasta.
Lisäohjeita HTML:n tuottamisesta PL/SQL-kielellä löytyy vinkkisivulta.
Kirjastopakkaus IHT (Infon HarjoitusTyö)
Kirjastopakkauksen IHT on Juhani Kuittisen proseduurikokoelman pohjalta laatinut Harri Laine. Se sisältää joukon hyödyllisiä proseduureja erityisesti lomakkeiden käsittelyyn. Näitä proseduureja käyttämällä säästyy kirjoitusvaivaa. Prodeduureista on hieman seuraavaa taulukkoa laveampi kuvaus kalvomateriaalissa. (Huom kalvoissa URL on väärin)IHT-pakkauksen asemasta voi keväästä 1999 alkaen käyttää uutta IHT2-pakkausta, joka on hieman IHT-pakkausta selkeämpi ja tarjoaa monipuolisempia apuvälineitä, mm. JavaScript-tarkistusten generoinnin.
Pakkauksen lähdekoodista voit katsoa proseduurien määrittelyitä. Proseduurit ovat:
- back(n int := -1);
- Liittää dokumenttiin Javascript linkit historiassa edelliseen ja seuraavaan dokumentiin siirtymiseksi. Tätä vastaavat napit tulevat mukaan header-proseduurilla, joten tätä ei erikseen pitäisi tarvita.
- footer( cdate varchar2, csignature varchar2);
- Päiväys ja csignature lopputeksti pienellä sivun alalaitaan
- formFieldsOpen(curl varchar2, cmethod varchar2);
- Aloittaa lomakkeen sekä liittää siihen käsittelijän (curl) ja parametrinvälitystavan (get,post - jälkimmäistä suositellaan)
- formfieldsClose;
- Lopettaa lomakkeen kenttäosuuden. Napit kannattaa laittaa erilliseksi nappiriviksi tämän jälkeen. Lomake lopetettava formEnd käskyllä.
- formField(cprompt varchar2, cname varchar2, csize integer, cmaxlength integer, cvalue varchar2);
- Määrittelee lomakkeen kentän. cprompt on kentän vasemmalle puolelle tuleva prompti, cname kentän nimi ja cvalue alkuarvo.
- formStandardButtons2(csubmit varchar2, creset varchar2);
- Määrittelee kaksi nappia submit ja reset ja niiden tekstit
- formButtonRowOpen
- Aloittaa nappirivistön
- formButtonRowItem(ctype varchar2, cname varchar2, cvalue varchar2);
- Nappi nappirivistöön: ctype ilmoittaa napin tyypin (submit/reset), cname on napin nimi (jos submit napille annetaan nimi aiheuttaa nappi parametrin lähetyksen kutsuttavalle proseduurille - voidaan vättää antamalla cname parametrille arvo NULL), cvalue on napin teksti ja mahdollisesti syntyvän parametrin arvo
- formButtonRowClose
- Sulkee nappirivistön
- formEnd
- Lopettaa lomakkeen
- formFieldText(cprompt varchar2, cname varchar2, cvalue varchar2, nrows int := 3, ncols int := 40);
- Kuten formField, määrittelee monirivisen syöttökentän
- formStandardButtons4;
- Määrittelee neljä nappia, yksi reset( alkuarvo) ja kolme submit-nappia (name=optype, value= Päivitä | Uusi tietue | Poista) Submit nappia vastaava optype-parametri tulee mukaan kutsuun.
- header(ctitle varchar2, cinst_url varchar2, cbgr varchar2);
- Määrittelee lomakkeen otsakkeen. ctitle on otsaketeksti. cinst_url linkki avustustekstiin, ja cbgr linkki taustakuvaan. Liittää dokumenttiin kuvalinkit historiassa edelliseen ja seuraavaan dokumenttii.
- shortMessage(cmsg varchar2);
- ilmoitus lihavoituna
Pakkaus IHT2
IHT2 on parannettu ja laajennettu versio IHT-pakkauksesta. Lisäpiirteitä ovat JavaScriptiin perustuvat toiminnot tuotettavalla HTML- sivulla. Pakkauksen versio 0.1 on valmistunut 14.2.1999.Pakkaus tarjoaa selaimessa JavaScriptilla tarkistettavina lomakkeen kenttätyyppeinä numeerisen kentän, numeerisen arvovälirajoitetun kentän sekä päiväyskentän. Näiden kenttien arvo tarkastetaan kentästä poistuttaessa (onBlur). Kentästä ei siis pääse pois, jos arvo on virheellinen. Jotta järjestelmä ei jumiutuisi, täytyy tällöin kuitenkin hyväksyä myös tyhjä kenttä. Pakollisten kenttien tarkistusta varten tulisi lomakkeeseen liittää lähetyksen yhteydessä tehtävä tarkistus (onSubmit). Koska kentät tarkistetaan erikseen, riittää lähetysvaiheessa tarkistaa, että kentässä on jokin arvo (tämä perustuu siihen oletukseen, että alkuarvot ovat kelvollisia). Kentän pakollisuustestin generointiin on tarjolla funktio, samoin tarkistusten kokoamiseen tarkistusohjelmaksi.
Pakkaus tarjoaa myös joitain sellaisia lomakkeen kenttätyyppejä, joihin ei liity tarkistuksia. Kenttiä voidaan sijoitella eri tyylisesti lomakkeelle. Pakkaukseen sisältyy myös apufunktioita (esim. form_field, add_any_js), joita voi käyttää omien laajennustoimintojen toteutuksessa.
Oheen on liitetty pakkauksen lähdekoodi toisaalta kuvaamaan yksityiskohtaisesti pakkauksen funktiot, toisaalta pohjaksi ja malliksi omien laajennusten tekemiselle. Pakkausta on testattu yleisimmin käytettäviksi oletettujen toimintojen osalta. Kuitenkin joitain virheitä on saattanut jäädä. Ilmoita siis havaitsemistasi virhetoiminnoista pakkauksen laatijalle (Harri.Laine@cs.helsinki.fi). Viat yritetään korjata mahdollisimman pian. Ilmoittele myös, jos mieleesi tulee joitain yleiskäyttöisiä funktioita, joilla pakkausta voisi laajentaa.
- Pakkauksen toimintojen kuvaukset
- Esimerkkinä pakkauksen käytöstä voit tarkastella testiohjelmaa testi8, joka sijoittaa lomakkeelle otsakkeen sekä eri tyyppisiä kenttiä. Lomakkeen käsittelevä ohjelma t8r käyttää pakkauksen palveluja tulostaakseen saamansa parametrit. Voit myös kokeilla testisovellusta.
Esimerkkejä:
- Seuraavat esimerkit eivät ole esimerkkejä siitä, miten käyttöliittymä
pitäisi tehdä. Niiden tarkoitus on näyttää miten proseduureja kytketään www-
sivuille ja miten tietokannan tiedot saadaan sivulle
-
Opiskelijoiden haku nimen perusteella
kyselylomakkella Ophaku.html.
Sivun lähdekoodin näet valitsemalla edellisen linkin ja katsomalla
lähdemuodon selaimen lähdekoodi-toiminnon avulla.
Kyselylomakkeen käsittelee tietokantaproseduuri opiskelija_data . Proseduuri tuottaa tulossivun, jossa näkyvät hakuehdon täyttävien opiskelijoiden tiedot. Kokeile vaikkapa hakua nimellä 'Va%'. Kysely kohdistuu Informaatiojärjestelmät kurssin esimerkkikantaan.
- Kyselylomake ophaku2.html on muuten samanlainen kuin kohdassa 1, mutta kyselyn käsittelevä proseduuri opiskeija_sel täydentää alkuperäisen sivun opiskelijoiden nimet sisältävällä linkkilistalla. Klikkaus nimeen aiheuttaa tietokantaproseduurin opiskelija_data kutsun.
- Esimerkki kirjastopakkauksen IHT (Infon HarjoitusTyö) käytöstä.
Kyselylomake ophaku3.html on samanlainen kuin kohdassa 2, mutta kyselyn käsittelevä proseduuri opiskelija_sel3 täydentää alkuperäisen sivun linkkilistalla löytyneistä opiskelijoista. Listasta valitsemisen käsittelee proseduuri opiskelija_crf, joka luo ylläpitolomakkeen valitun opiskelijan tietojen ylläpitoa varten. Tiedot lomakkeelle haetaan linkkiin liitetyn opiskelijatunnuksen perusteella.
Lomakkeeen lopussa on nappirivistö, jossa on yksi reset-nappi ja kolme submit-nappia. Submit-napin (päivitä, uusi tietue, poista) painamisen käsittelee proseduuri opiskelija_upd. Tämä tutkii, mitä submit-napeista on painettu ja suorittaa sen perusteella toiminnon. Poisto ei onnistu, muutos onnistuu. Proseduuri näyttää käsiteltävän rivin apuproseduurilla opiskelija_nayta.
Lisäystä varten luodaan uusi lomake proseduurilla opiskelija_uusi. Täytetty lomake käsitellään proseduurilla opiskelija_ins, joka vie tiedot kantaan.
PL/SQL -proseduurit
- Tässä esitetään lyhyt tiivistelmä PL/SQL-kielen
piirteistä. Tarkastelun kohteena on proseduurin määrittely.
- proseduurin nimi
- parametrien esittely
- paikallisten tietorakenteiden esittely
- toimintaosa
- poikkeukset
Lisää tietoa löytyy englanninkielisestä manuaalimateriaalista.
Proseduuri jakautuu 5 osaan
create or replace procedure proseduurin_nimi ( parametrit ) is paikalliset tietorakenteet begin toiminta_osa exception poikkeukset end;
Näistä osista parametrit, paikalliset tietorakenteet ja poikkeusosa voivat puuttua.
Parametrit
Yleisesti PL/SQL-proseduurin parametrien voivat olla syote-, tulos- tai sekä syöte- että tulosparametreja.Parametrin esittelyssä määritellään kunkin parametrin osalta käyttötapa (in / out / in out), nimi ja tietotyyppi.
Tietotyyppeinä tulevat kyseeseen SQL:n tietotyypit sekä PL/SQL:n omat tietotyypit.
create or replace procedure testi (teksti1 in char, luku1 in integer) is ....
Paikalliset tietorakenteet
Paikallisina tietorakenteina voidaan määritellä yksinkertaisia muuttujia, tietueita, taulukoita ja kursoreita.Yksinkertaisen muuttujan määrittelyssä annetaan muuttujan nimi ja tietotyyppi. Tietotyyppejä ovat SQL:n tietotyypit integer, number, char, varchar ja date. Ne määritellä kuten SQL:ssä. Lisäksi on käytettävissä Boolean tietotyyppi.
Tietotyyppi voidaan määritellä myös toisen muuttujan tai taulun sarakeen tietotyypin avulla.
Lausekkeella
s1kopio ops$virtanen.tauluA.sarake1%TYPE
määritellään muttuja s1kopio saman tyyppiseksi kuin käyttäjän ops$virtanen omistaman taulun tauluA sarake sarake1.
Tietuerakenne voidaan määritellä tauluun tai kyselyyn perusteuen.
rivi1 ops$virtanen.TauluA%ROWTYPE
cursor c1 is
select * from ops$virtanen.TauluB;
rivi2 c1%ROWTYPE;
Kyselyt määritellään kursoreiden avulla, kuten upotetussa sql:ssä. PL/SQL tarjoa kursoreiden läpikäyntiin kursorisilmukan, joka yksinkertaistaa käsittelyä upotettuun sql:ään verrattuna.
Toimintaosa
PL/SQL -kielen toimintaosassa ovat käytettävissä tavanomaiset ohjelmointikielen operaatiot ja rakenteet- sijoitusoperaatio (luku := 19 )
- lausekkeet, ( luku * 2 + toinen_luku )
- perusaritmetiikka (luku :=luku * 2 + toinen_luku )
- merkkijonojen liittäminen (Nimi:= etunimi || ' ' || sukunimi)
- proseduureja ja funktioita, mm. kaikki Oraclen SQL:n funktiot ohjelmointikielen funktioina
etukirjain := substr(Sukunimi,1,1); viikonpaiva:= to_char(sysdate,’DAY’);
if ehto then toiminto; end if; if ehto then toiminto1; else toiminto2; toiminto3; end if; if ehto1 then toiminto1; elsif ehto2 then toiminto2; toiminto3; else toiminto4; end if;Ehtorakenteita voi kerrostaa kuten yleensä ohjelmointikielissä.
if ehto then if ehto2 then toiminta1; elsif ehto3 then toiminta2; toiminta3; end if; else toiminta4; end if;
- Silmukat, mm
- while-silmukka - suoritetaan, niin kauan kun ehto on tosi
while ehto loop toiminta; end loop;
for muuttuja in alaraja .. yläraja loop toiminta; end loop;
for rivimuuttuja in kursori loop toiminta; end loop;Kursorisilmukassa suoritetaan aluksi kysely, suoritetaan toiminta jokaiselle riville ja lopuksi suljetaan kursori. Rivimuuttuja osoittaa kyselyn tulosriviin eikä sitä tarvitse erikseen määritellä. Rivin sarakkeisiin viitataan muodossa rivimuuttuja.sarakenimi.
cursor kkursori is select jotakin from jostakin for rivi in kkursori loop a:= rivi.kentta1; ... end loop;Kyselyn tulosrivejä voi käydä läpi myös while- silmukassa. Tällöin kursori on ensin avattava Open-lauseella ja rivillä olevat arvot täytyy hakea muuttujiin Fetch-lauseella kuten upotetussa SQL:ssä.
Poikkeukset
- Erilaiset virhetilanteet voidaan käsitellä poikkeuksina,
jolloin varsinainen ohjelmalogiikka pysyy ehkä selvempänä.
Poikkeustilanteina voidaan käsitellä valmiiksi määriteltyjä
poikkeuksia, joita on lueteltu allaolevassa taulukossa.
CURSOR_ALREADY_OPEN | is raised if you try to OPEN an already open cursor |
DUP_VAL_ON_INDEX | is raised if you try to store duplicate values in a database column that is constrained by a unique index. |
INVALID_CURSOR | is raised if you try an illegal cursor operation. For example, if you try to CLOSE an unopened cursor. |
INVALID_NUMBER | is raised in a SQL statement if the conversion of a character string to a number fails. |
LOGIN_DENIED | is raised if you try logging on to ORACLE with an invalid username/password. |
NO_DATA_FOUND | is raised if a SELECT INTO statement returns no rows or if you reference an uninitialized row in a PL/SQL table |
NOT_LOGGED_ON | is raised if your PL/SQL program issues a database call without being logged on to ORACLE |
PROGRAM_ERROR | is raised if PL/SQL has an internal problem. |
TIMEOUT_ON_RESOURCE | is raised if a timeout occurs while ORACLE is waiting for a resource. |
TOO_MANY_ROWS | is raised if a SELECT INTO statement returns more than one row. |
VALUE_ERROR | is raised if an arithmetic, conversion, truncation, or constraint error occurs. |
ZERO_DIVIDE | is raised if you try to divide a number by zero. |
Poikkeukset kirjataan proseduurin exception osaan muodossa:
when poikkeus1 then poikkeuskäsittelijän koodi when poikkeus2 then poikkeuskäsittelijän koodi
Myös omia poikkeuksia voi määritellä. Poikkeus aiheutetaan raise poikkeus lauseella. Katso lisää manuaalista.
Proseduurin loppuun on aina syytä sijoittaa poikkeuskäsittelijä tilanteelle others. Tämä suoritetaan ellei poikkeuskohtaista käsittelijää ole määritelty. Käsittelijä voisi tulostaa virheilmoituksen, vaikkapa seuraavasti:
exception when others then htp.p('<h3>Proseduurin pnimi suoritus päättyi virheeseen:</h3>'); htp.p('<font color=red>'|| sqlerrm || '</font>');
Harri.Laine@cs.Helsinki.FI