Helsingin yliopisto Tietojenkäsittelytieteen laitos
 

Tietojenkäsittelytieteen laitos

Tietoa laitoksesta:

 

Oracle Web Server:iä käyttävien WWW-sovellusten toteutus Tietokantasovellusten harjoitustyö -kurssilla

Tässä ohjeessa kuvataan WWW-sovellusten toteuttaminen Oracle Web Server:iä käyttäen Helsingin yliopiston tietojenkäsittelytieteen laitoksen Informaatiojärjestelmien harjoitustyö- kurssin yhteydessä.

Sisältö:
Manuaalit
Toteutusympäristö
Tietokannan käsittely SQL:llä
Tietokantaproseduurit
Tietokannan WWW-kytkentä
   Viittaaminen tauluihin ja proseduureihin
   WWW-käyttöoikeuksien antaminen
   Tietokantaproseduurin kytkeminen sivuun
   HTML:n generointi tietokantaproseduurissa
     Kirjastopakkaus IHT
     Uusi kirjastopakkaus IHT2
   Esimerkkejä
Johdatus PL/SQL -kieleen
Kalvomateriaalia
Vinkkejä
Tämän ohjesivun vanha versio

Manuaalit ja ohjekirjat

Alkuun

Toteutusympäristö

Tietokanta toteutetaan Helsingin yliopiston atk-osaston palvelinkoneeseen kontti tietokantainstanssiin ttst käyttäen Oracle 7 -tietokantapalvelinta. Kukin opiskelija saa oman Oracle-käyttäjätunnuksen, joka on voimassa ryhmän toiminta-ajan. Opiskelijalla on ennen tunnuksen hankkimista oltava voimassaoleva käyttäjätunnus atk-osaston unix-laitteistoihin. Oracle-tunnus on muotoa ops$<unix_tunnus>, esim. ops$virtanen. Käyttöoikeus tunnukseen tarkistetaan unix-tunnuksen perusteella, joten tunnukseen liittyvää Oracle-salasanaa ei välttämättä tarvitse tietää.

Alkuun

Tietokannan käsittely sql:llä

Alkuun

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

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
   EXIT

jos tiedoston nimi olisi pros1.pl se käännettäisiin komennolla:  sqlplus / @pros1.pl 

Proseduurin toimivuutta voi testata sqlplus-ympäristössä seuraavasti:

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.showpagevarsinainen tulostus
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.

Alkuun

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=123

Omistajan Oracle-tunnus on sisällytettävä myös proseduurikutsuihin, esim. ops$virtanen.proseduuri1.

Alkuun

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 lauseella

grant execute on proseduurin_nimi to www_user;

Vaikka ohjelman suorittamiseen riittävätkin pelkästään tietokantaproseduureille annetut suoritusoikeudet, on myös tauluille annettava vähintään lukuoikeus, jotta ohjaajien apuvälineet toimisivat. Taulun oikeudet 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.

Alkuun

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:8889/ttst/owa/kayttaja.proseduurin_nimi 

    Alkuosa ylläolevasta URL:sta (http://kontti.helsinki.fi:8889/ttst/owa/) 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:

    • 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)
    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. 


    Esimerkki: 

    
    <FORM 
    ACTION="http://kontti.helsinki.fi:8889/ttst/owa/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 rakenteeltaan
    create 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.

Alkuun

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.

    Pakkauksiin sisältyvät proseduurit on kuvattu  pfd-muotoisessa manuaalissa, (Adobe Acrobat-muoto) samassa muodossa löytyy myös  20 sivuinen tiivistelmä (Adobe Acrobat -pdf).  Saatavilla on myös  HTML-muodossa oleva manuaali.

    Lisäohjeita HTML:n tuottamisesta PL/SQL-kielellä löytyy vinkkisivulta.

    Alkuun

    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.

    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

    Alkuun

    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.

Alkuun

Esimerkkejä:

Alkuun

PL/SQL -proseduurit