Vinkkejä INFO-työhön

HUOM: Esimerkit tällä sivulla ovat vanhoja ja käyttävät vanhaa Oracle 7 -kantaa. Jos vastaavaa rakennetta halutaan käyttää Oracle 8 -kannan kanssa on URL-muutettava yleisohjeen mukaiseksi (portiksi 8011 ja owa:n tilalle plsql )


Virheilmoitukset

Jos proseduuria suoritettaessa sattuu virhe, johon ohjelmassa ei ole varauduttu tuottaa web server virheilmoituksen 'Request failed ...'. Tämä ilmoitus ei kerro mitään virheen laadusta. Laajempaa virhetietoa on kuitenkin saatavissa. Tieto sattuneesta virheistä löytyy muuttujista sqlcode (virhekoodi) ja sqlerrm (ilmoitusteksti). Nämä muuttujat ovat käytettävissä proseduurin exeption -osassa. Liitä siis proseduurisi loppuun ennen END:iä vaikkapa seuraava koodipätkä, missä pnimi on proseduurisi nimi:

exception
when others then
     htp.p('<h3>Proseduurin pnimi suoritus päättyi virheeseen:</h3>'); 
     htp.p('<font color=red>'|| sqlerrm || '</font>');

Virheen mahdollisia syitä löydät Oraclen virheilmoitus-manuaalista.

Taulukkomuotoisten lomakkeiden käyttö

Oracle PL/SQL mahdollistaa taulukkomuotoisten parametrien käyttön www-sivulta käynnistettävässä proseduurissa. Manuaalin mukaan taulukon arvojen pitäisi olla kutsuttaessa yhdessä. Käytännössä näin ei kuitenkaan tarvitse olla. Tämä mahdollistaa taulukkomalliset syöttö- tai ylläpitolomakkeet siten, että kukin taulukon sarake välitetään omana taulukkoparametrina ja indeksi sitoo kokonaisuuden (siis taulukon rivin) yhteen.

Taulukkomallinen lomake onnistuu kuitenkin suoraviivaisesti vain tekstikenttiä käyttämällä, sillä näistä lähetetään aina jokin arvo. Jos tekstikenttään ei ole kirjoitettu mitään, saa proseduuri parametri arvon 'null' ko. riviltä. Valintaruuduista lähetetään parametri vain jos ruutu on valittu. Jos yhtään vaihtoehtoa ei valita tai samannimisiä parametreja valitaan samalta rivillä useita, ei indeksi enää kytkekään rivin alkioita yhteen. Taulukon riveille ei ole syytä laittaa sekä tekstikenttiä että valintanappeja. Lomakkeen text-kenttä tuottaa aina parametriarvon, joka tyhjän kentän tapauksessa on kutsuttavan proseduurin kannalta null. Valintanapeista ei tuoteta parametria elleivät ne ole valittuina.

Esimerkiksi lomakkeen:

  <Form method="get"
    action="http://kontti.helsinki.fi:8889/ttst/owa/info1.oph">
  Anna hakuehto: br>
  < input type="text" name="onimi" size=20> 
  < input type="text" name="enimi" size=20><br>
  < input type="text" name="onimi" size=20>
  < input type="text" name="enimi" size=20><br>
  < input type="text" name="onimi" size=20>
  < input type="text" name="enimi" size=20><br>
  < input type="text" name="onimi" size=20>
  < input type="text" name="enimi" size=20><br>
  < input type="submit" value="HAE" >
  </form >
voisi käsitellä seuraava proseduuri, joka tulostaa annettujen parametrien arvot riveittäin ja tyhjän parametrin tilalle merkin '*':
   create or replace procedure oph (onimi in owa_util.ident_arr,
          enimi in owa_util.ident_arr) is
   c integer;
   begin
      htp.htmlOpen;
      htp.headOpen;
      htp.title('Testilomake INFOht s97');
      htp.headClose;
      htp.bodyOpen(NULL,'BGCOLOR=silver');
      htp.header(1,'testi');
      htp.blockquoteOpen;
      for c in onimi.FIRST .. onimi.LAST loop
         htp.p(nvl(onimi(c),'*')||nvl(enimi(c),'*'));
         htp.p('<br>');
      end loop;
   end;
   /
   show errors;
   exit;
Jos lomakkeen jättää tyhjäksi saa tulokseksi
    **
    **
    **
    **
Kun kahdella ensimmäisellä rivillä antaa A, B , C, D tulee tulokseksi:
    AB
    CD
    **
    **
Kun antaa A, B ensimmäisellä rivillä ja C,D kolmannella tulee tulokseksi:
    AB
    **
    CD
    **

Sari A. Laakson esimerkki taulukkomuotoisen lomakkeen käytöstä


Proseduurin testaus serverissä

HTML-sivuja tuottavaa proseduuria voi testata myös suoraan serverissä SQL- ympäristössä. Jos proseduurissa on silmukoita tällainen testaus on erittäin suositeltavaa, koska tällöin käyttäjä itse pystyy keskeyttämään päättymättömään silmukkaan jääneen prosessinsa. Tällaisessa testauksessa saa myös enemmän virheilmoitustietoa kuin www:n kautta proseduuria ajettaessa.

Seuraavassa on sql-komentotiedosto testaa.sql, jolla voi testata mitä tahansa proseduuria. Proseduurin kutsu annetaan komennolle parametrina.

testaa.sql:

	set serveroutput on
        spool testitulos.lis
        execute &1
        execute owa_util.showpage
        spool off
        exit

Oletetaan, että halutaan testata proseduuria p1(a char, b number). Komentoa testaa voisi tällöin käyttää esim seuraavasti:

	sqlplus / @testaa p1('Kalle',50)
Kaikki testauksen aikana tehtävä tulostus tulee sekä näytölle että tallentuu tiedostoon testitulos.lis. Jos testausprosessi ei pääty, voit avata uuden ikkunan konttiin ja tutkia unixin ps-komennolla, mitä sqlplus-ajoja sinulla on käynnissä, ja tarvittaessa keskeyttää prosessin kill-komennolla. Jos haluat tulokset jonnekin muualle kuin tiedostoon testitulos.lis, voit vaikkapa korvata 'spool testitulos.lis' -lauseen lauseella 'spool &2', jolloin voit antaa tiedoston nimen komennon toisena parametrina, esim. 'sqlplus / @testaa p1('Kalle',50) p1_testi.lis'.

JavaScript-tarkistukset

Lomakkeen kenttiin kirjoitetun tekstin voi kätevästi tarkastaa JavaSciptiä käyttäen myös työasemassa. Tällöin palvelimessa tarvittava ohjelmakoodi tulee yksinkertaisemmaksi, koska osa tiedon tarkistuksista voidaan jättää pois.

IHT2-pakkaus tulee sisältämään proseduurit, jotka generoivat tarvittavat JavaScript-koodit ja mahdollistavat niiden liittämisen kenttämäärityksiin.


&-merkin ja hipsun (') tuottaminen PL-ohjelmalla

SQL:ssä &-merkki on varattu merkki, joka osoittaa kääntäjälle korvattavan parametriarvon. HTML:ssä tätä merkkiä käytetään eräiden erikoismerkkien esityksessä. Esimerkiksi 'pienempi kuin' esitetään merkkijonona '&lt;', samoin tyhjämerkki saadaan aikaan merkinnällä '&nbsp;'. Edelleen &:-merkkiä käytetään HTML-linkeissä parametrien erottimena.

&-merkin voi upottaa tulostettavaan merkkijonoon kuten minkä tahansa merkin mikäli parametrin aloitustulkinta estetään kääntäjäasetuksilla. Tämä onnistuu sijoittamalla skriptiin ennen proseduurin alkua asetuskomento set define off. Proseduurin perään on syytä laittaa vastaava palautuskomento set define on.

Jos &:-merkki on merkkijonon viimeinen merkki, siihen ei sovelleta parametrin aloitustulkintaa, esim. htp.p('&'||'nbsp;'); onnistuu vaikka parametritulkintaa ei olisi estetty.

Hipsu (') aloittaa ja lopettaa SQL:ssä merkkijonon. Sen saa upotettua tulostettavaan merkkijonoon esittämällä se kahdennettuna, esim. htp.p('it''s') tuottaa merkkijonon it's.


Harri Laine, Harri.Laine@cs.helsinki.fi