PL/SQL -kieli WWW-palveluiden tuottamisessa



Samankaltaiset tiedostot
PROSEDUURIT, FUNKTIOT JA HERÄTTIMET - ESIMERKKEINÄ ORACLE, SQL SERVER, MYSQL JA OCELOT JOUNI HUOTARI K2009

Proseduurit, funktiot ja herättimet - esimerkkeinä Oracle, SQL Server, MySQL ja OCELOT. Jouni Huotari S2008

Kirjasto Relaatiotietokannat Kevät Auvinen Annemari Niemi Anu Passoja Jonna Pulli Jari Tersa Tiina

HELIA 1 (15) Outi Virkki Tietokantasuunnittelu

TIEDONHALLINTA - SYKSY Luento 11. Hannu Markkanen /10/12 Helsinki Metropolia University of Applied Sciences

TIETOKANNAT: MYSQL & POSTGRESQL Seminaarityö

IDL - proseduurit. ATK tähtitieteessä. IDL - proseduurit

ATK tähtitieteessä. Osa 3 - IDL proseduurit ja rakenteet. 18. syyskuuta 2014

Tietokantasovellus (4 op) - Web-sovellukset ja niiden toteutus

ELM GROUP 04. Teemu Laakso Henrik Talarmo

Tiedonhallinnan perusteet. Viikko 1 Jukka Lähetkangas

Concurrency - Rinnakkaisuus. Group: 9 Joni Laine Juho Vähätalo

Opettajana Mika Sorsa, HAMK:n ammatillisen opettajakoulutuksen opetusharjoittelija

SQL-perusteet, SELECT-, INSERT-, CREATE-lauseet

Insert lauseella on kaksi muotoa: insert into taulu [(sarakenimet)] values (arvot)

Tietokannanhoitaja DBA (Database Administrator) ja tietokannan hallinta

HELIA 1 (17) Outi Virkki Tietokantasuunnittelu

Maiju Mykkänen Susanna Sällinen

WWW-sivut HTML-kielellä esitettyä hypertekstiaineistoa

PERL. TIE Principles of Programming Languages. Ryhmä 4: Joonas Lång & Jasmin Laitamäki

Lyseopaneeli 2.0. Käyttäjän opas

Ohjelmoinnin perusteet Y Python

Järjestelmäarkkitehtuuri (TK081702) Web Services. Web Services

Tutoriaaliläsnäoloista

Harjoituksen aiheena on tietokantapalvelimen asentaminen ja testaaminen. Asennetaan MySQL-tietokanta. Hieman linkkejä:

Visual Basic -sovelluskehitin Juha Vitikka

Johdanto Javaan ja tietokantojen käsittelyyn Java Database Connectivity (JDBC)

Dart. Ryhmä 38. Ville Tahvanainen. Juha Häkli

AJAX-konsepti AJAX. Asynkronisuus. Nykyisten web-ohjelmien ongelmia. Asynchronous JavaScript And XML

815338A Ohjelmointikielten periaatteet Harjoitus 4 vastaukset

TIETOKANTOJEN PERUSTEET MARKKU SUNI

Alkuraportti. LAPPEENRANNAN TEKNILLINEN YLIOPISTO TIETOJENKÄSITTELYN LAITOS CT10A Kandidaatintyö ja seminaari

DXL Library ja DXL-kielen olemus. Pekka Mäkinen SoftQA Oy http/

TIE PRINCIPLES OF PROGRAMMING LANGUAGES Eiffel-ohjelmointikieli

815338A Ohjelmointikielten periaatteet Harjoitus 3 vastaukset

Valppaan asennus- ja käyttöohje

Sisällys. 1. Omat operaatiot. Yleistä operaatioista. Yleistä operaatioista

4. Lausekielinen ohjelmointi 4.1

TIE Principles of Programming Languages CEYLON

Ohjelmointitaito (ict1td002, 12 op) Kevät Java-ohjelmoinnin alkeita. Tietokoneohjelma. Raine Kauppinen

TIEP114 Tietokoneen rakenne ja arkkitehtuuri, 3 op. Assembly ja konekieli

EXEC SQL BEGIN DECLARE SECTION

5/20: Algoritmirakenteita III

IT-OSAAJA, TIETOJENKÄSITTELYN ERIKOISTUMISOPINNOT

Asennusohje. Sahara-ryhmä. Helsinki Ohjelmistotuotantoprojekti HELSINGIN YLIOPISTO Tietojenkäsittelytieteen laitos

5. HelloWorld-ohjelma 5.1

Ohjelmoinnin peruskurssien laaja oppimäärä

TIEP114 Tietokoneen rakenne ja arkkitehtuuri, 3 op. Assembly ja konekieli

1. Omat operaatiot 1.1

Tekninen kuvaus Aineistosiirrot Interaktiiviset yhteydet iftp-yhteydet

Tietojärjestelmä tuotantoympäristössä. Sovellusohjelmat Helsingin ammattikorkeakoulu Stadia / Tekniikka ja liikenne Vesa Ollikainen

LINUX-HARJOITUS, MYSQL

T Hypermediadokumentin laatiminen. Sisältö. Tavoitteet. Mitä on www-ohjelmointi? Arkkitehtuuri (yleisesti) Interaktiivisuuden keinot

11/20: Konepelti auki

Chapel. TIE Ryhmä 91. Joonas Eloranta Lari Valtonen

TAMPEREEN TEKNILLINEN YLIOPISTO Digitaali- ja tietokonetekniikan laitos. Harjoitustyö 4: Cache, osa 2

Ohje luottamuksellista tietoa sisältävien sähköpostiviestien lähettämiseen ja vastaanottamiseen

Action Request System

Hohde Consulting 2004

Nebula pilvi 9.0 saatavuusalueiden välinen verkkoliikenne

ADA. Ohjelmointikieli. Ryhmä 5 Henna Olli, Päivi Hietanen

Testidatan generointi

Office ohjelmiston asennusohje

AS C-ohjelmoinnin peruskurssi 2013: C-kieli käytännössä ja erot Pythoniin

Asennusohje. Sahara-ryhmä. Helsinki Ohjelmistotuotantoprojekti HELSINGIN YLIOPISTO Tietojenkäsittelytieteen laitos

Sähköpostitilin käyttöönotto

Ohjelmoinnin perusteet Y Python

tään painetussa ja käsin kirjoitetussa materiaalissa usein pienillä kreikkalaisilla

Kielioppia: toisin kuin Javassa

HSMT Tietokannoista. Ville Leppänen. HSMT, c Ville Leppänen, IT, Turun yliopisto, 2008 p.1/32

Oracle-tietokanta. Riku Nykänen 1/2010

Alkuarvot ja tyyppimuunnokset (1/5) Alkuarvot ja tyyppimuunnokset (2/5) Alkuarvot ja tyyppimuunnokset (3/5)

Järjestelmäarkkitehtuuri (TK081702) Avoimet web-rajapinnat

SQLite selvitysraportti. Juha Veijonen, Ari Laukkanen, Matti Eronen. Maaliskuu 2010

Makrojen mystinen maailma lyhyt oppimäärä

HELIA 1 (21) Outi Virkki Tietokantasuunnittelu

Written by Administrator Monday, 05 September :14 - Last Updated Thursday, 23 February :36

15. Ohjelmoinnin tekniikkaa 15.1

Luento 5. Timo Savola. 28. huhtikuuta 2006

Luento 4. Timo Savola. 21. huhtikuuta 2006

Joko tunnet nämän Oracle10g SQL:n piirteet? Kari Aalto Saariston IT

18 LIITTYMÄT MUIHIN JÄRJESTELMIIN

Zeon PDF Driver Trial

Ohjelmointikielet ja -paradigmat 5op. Markus Norrena

Tietokannan konversio

Maastotietokannan torrent-jakelun shapefile-tiedostojen purkaminen zip-arkistoista Windows-komentojonoilla

Harjoitustyö: virtuaalikone

Tuotteiden tiedot: Lisää uuden tuotteen tiedot. Muuta tai poista tuotteen tiedot. Selaa kaikkien tuotteiden tietoja.

Ohjelmointiharjoituksia Arduino-ympäristössä

Sisältö. 2. Taulukot. Yleistä. Yleistä

Tietokannat. CREATE TABLE table(col1,col2,... ); Luo uuden taulun. CREATE TABLE opiskelijat(opnumero,etunimi,sukunimi);

Aalto Yliopisto T Informaatioverkostot: Studio 1. Oliot ja luokat Javaohjelmoinnissa

JAVA-PERUSTEET. JAVA-OHJELMOINTI 3op A JAVAN PERUSTEET LYHYT KERTAUS JAVAN OMINAISUUKSISTA JAVAN OMINAISUUKSIA. Java vs. C++?

1.3Lohkorakenne muodostetaan käyttämällä a) puolipistettä b) aaltosulkeita c) BEGIN ja END lausekkeita d) sisennystä

Maestro Sähköpostilähetys

Yleistä. Nyt käsitellään vain taulukko (array), joka on saman tyyppisten muuttujien eli alkioiden (element) kokoelma.

C-ohjelmoinnin peruskurssi. Pasi Sarolahti

Järjestelmäarkkitehtuuri (TK081702)

Pertti Pennanen DOKUMENTTI 1 (5) EDUPOLI ICTPro

Tietokannat. CREATE TABLE table(col1,col2,... ); Luo uuden taulun. CREATE TABLE opiskelijat(opnumero,etunimi,sukunimi);

Transkriptio:

Janne Autio PL/SQL -kieli WWW-palveluiden tuottamisessa Tietojärjestelmätieteen kandidaatintutkielma 26.1.2007 Jyväskylän yliopisto Tietojenkäsittelytieteiden laitos Jyväskylä

TIIVISTELMÄ Autio, Janne Aleksi PL/SQL kieli WWW-palveluiden tuottamisessa Jyväskylä: Jyväskylän yliopisto, 2007. 34 s. Kandidaatintutkielma Lyhenne PL/SQL muodostuu sanoista Prosedural Language / Structured Query Language. Kyseinen ohjelmointikieli on käytännössä Oracle-sidonnainen, proseduraalinen kieli (prosedural language), toisin kuin sen taustalla oleva kuvaileva (declarative) SQL-kieli. PL/SQL-kieltä alettiin kehittää, koska Oracletietokantasovelluksen yhteyteen tarvittiin täsmälleen sen tarpeita vastaava proseduraalinen lisä SQL-kieleen. Tarkoituksena oli mahdollistaa proseduraalisen koodin suorittaminen, joka voisi sisältää muun muassa ehdollisia, iteratiivisia ja jaksollisia käskyjä. PL/SQL-kieli on kehitetty monipuoliseksi välineeksi lähinnä Oracle-tietokannan käyttöä varten, ja tätä käyttötarkoitusta varten sitä käytetään ja kehitetään edelleen aktiivisesti. Siitä löytyy useita oliopiirteitä kuten kapselointi, funktioiden kuormitus ja tiedon piilotus, myöhemmissä versioissa myös esimerkiksi periytyminen. Syntaksiltaan, rakenteeltaan ja datatyypeiltään PL/SQL muistuttaa pitkälti ADA-ohjelmointikieltä, joka on vuonna 1979 kehitetty korkean tason kieli. Oracle-tietokantaa voidaan www-ympäristössä käyttää PL/SQL-kielellä mutta myös Javalla ja esimerkiksi.net-ympäristön tukemalla koodilla, mikä tilanteena antaa aihetta vertailla eri tekniikoita niiden soveltuvuuden ja etuisuuksin kannalta Oraclen käyttöä ajatellen. Tämän tutkielman osalta tarkasteltava tietokantatyyppi on Oracle, ja sen tukemia ohjelmointitekniikoita tarkastellaan lähinnä PL/SQL-kielen näkökulmasta. Tutkielmassa käydään läpi

PL/SQL-kielen perusnäkökulmia sekä sivutaan sen erityispiirteitä ja Oracletietokannan hallintajärjestelmään sidoksissa olevia ominaisuuksia. Lukijalle pyritään tarjoamaan käsitys siitä, jolloin sitä voi olla hyödyllistä käyttää yleisesti toteutusvaihtoehtona tai esimerkiksi Javan sijasta, mutta esille tulee myös sen asettamia haasteita www-palveluiden tuottamisessa. Tutkimusongelmana on selvittää, millä tavalla PL/SQL-kieltä tyypillisesti käytetään ominaisuuksiensa puolesta tietokannan käsittelyssä ja erityisesti www-ympäristössä. Tutkielmassa esitellään kyseisen kielen rakennetta ja tiettyjä ominaisuuksia sekä Oracle-tietokannan ja PL/SQL-kielen piirteitä wwwsovelluskehityksessä yleisesti. AVAINSANAT: PL/SQL, Oracle, proseduuri, paketti, www-sovellus

Ohjaaja: Jorma Kyppö Tietojenkäsittelytieteiden laitos Jyväskylän yliopisto Tarkastaja: Markku Sakkinen Tietojenkäsittelytieteiden laitos Jyväskylän yliopisto

SISÄLLYSLUETTELO 1 JOHDANTO... 6 2 PL/SQL-KIELI JA ORACLE-YMPÄRISTÖ... 8 2.1 Oracle-tietokanta... 8 2.2 Oracle PL/SQL-kielen historiaa... 9 2.3 PL/SQL-kieli työvälineenä... 10 2.4 PL/SQL-lohkon perusrakenne... 11 3 WWW-PALVELUIDEN KEHITTÄMINEN... 14 3.1 PL/SQL www-sovelluksen perusominaisuudet... 14 3.2 Kursoreiden ominaisuudet ja käyttö... 16 3.3 Pakettien ominaisuudet ja käyttö... 17 3.4 Parametrien välitys www-sovelluksessa... 20 3.5 Herättimet osana tietokantaa... 25 3.6 Tyypillisiä, verkkoa käyttäviä operaatioita PL/SQL-kielessä... 26 4 PL/SQL-KIELI VERRATTUNA JAVAAN ORACLE TIETOKANTAOHJELMOINNISSA... 28 5 ORACLE-TIETOKANNAN HALLINTAJÄRJESTELMÄN TIETOTURVA... 30 6 YHTEENVETO... 31 7 LÄHDELUETTELO... 33

6 1 JOHDANTO Useat kehittyneet WWW-palvelut käyttävät jossain muodossa tietokantaan varastoitua tietoa hyväkseen, jolloin tietokannan hallinta on oleellisessa osassa muun muassa sovelluksen toimivuuden, tehokkuuden ja käytettävyyden kannalta. PL/SQL-kieli on Oraclen pitkään kehittelemä työväline lähinnä tietokannan monipuoliseen ja tehokkaaseen hallintaan eri rajapintojen kanssa. Nykyaikaiset www-sovellukset sisältävät ja käyttävät hyvin monipuolisia tekniikoita, jotka pystyvät vastaamaan palveluiden vaatimien ominaisuuksien toteutukseen. Oracle on pyrkinyt pitämään PL/SQL-kielen varteenotettavana vaihtoehtona myös vaativimpien sovellusten kehittämisessä. Lisäksi monet tietokantoja tukevat ohjelmointitekniikat sisältävät olio-ohjelmoinnista tuttuja piirteitä, jotka saattavat olla eräs edellytys ohjelmointiin käytettävän tekniikan tehokkuuteen ja soveltuvuuteen laajempien sovellusten kehittämistä varten. Oracle-yhtiö alkoi saavuttaa menestystä 80-luvun alkupuolella julkaistessaan Oracle-tietokannan hallintajärjestelmästä version 3.0, jonka ominaisuudet riittivät silloiseen relaatiotietokantojen hyödyntämiseen. Myöhemmin Oraclejärjestelmästä on kehittynyt yksi markkinoiden kilpailukykyisimmistä relaatiotietokanta-alustoista, joka tukee useita käyttöjärjestelmiä, ja muun muassa käytettävyyteen ja tietoturvaan liittyviä moderneita tekniikoita hyvin monipuolisesti. PL/SQL-kieli mahdollistaa Oracle-tietokannan käyttämisen proseduraalisesti myös www-ympäristössä. Oracle-yhtiön kontrolloima PL/SQL-kielen kehitystyö on eräs tapa pitää kyseinen ohjelmointikieli hyvin räätälöitynä ja kattavana juuri Oracle-tietokannan hallintajärjestelmän käyttöä varten, mutta myös tietokannan käyttöön liittyvien edistysaskelten liittämisestä PL/SQLtekniikkaan on huolehdittu tarpeen mukaan. Koska Oraclea voidaan käyttää myös eräillä muilla ohjelmointikielillä, on siitä hyötyä niin yritykselle kuin PL/SQL-ohjelmointikielen kehittämisellekin sopivan kilpailuasetelman myötä.

7 Kyseessä oleva ohjelmointikieli on ominaisuuksiltaan varsin monimuotoinen, kun sen käytössä otetaan huomioon perusominaisuuksien lisäksi wwwympäristöön liittyvät toiminnot, mutta myös omintakeinen rakenteiltaan ja syntaksiltaan. Ennen PL/SQL-kielen valitsemista työvälineekseen tai sen arvioimiseksi on hyödyllistä perehtyä sen perusrakenteisiin sekä kielikohtaisiin ominaisuuksiin ja termeihin. Tässä tutkielmassa käsitellään kokonaisuutena Oracle-alustan ja PL/SQLohjelmointikielen ominaisuuksia niin erillisinä tekniikoina kuin ominaisuuksiensa puolesta www-sovelluksen kehityksessä. Tutkimusmenetelmänä on pääasiassa käytetty kirjallisuuskatsausta, mutta myös perehtymistä PL/SQL-sovelluksen koodiin. Toisessa luvussa käsitellään lähinnä Oracle-tietokannan hallintajärjestelmän ja PL/SQL-kielen perusominaisuuksia sekä kolmannessa luvussa lisäksi kyseisten tekniikoiden www-ympäristössä usein tarvittuja ominaisuuksia. Neljännessä luvussa otetaan esille PL/SQL-kieleen ja www-sovelluksiin liittyvinä aiheina lisäksi kyseisen ohjelmointikielen vertailua Javaan. Viidennessä luvussa tarkastellaan melko pintapuolisesti Oraclen tietoturvanäkökulmia. Nämä useat aihepiirit vaikuttavat PL/SQL-kielen soveltuvuuteen sen käyttötarkoituksiin, jotka on hyödyllistä huomioida mahdollisen kehitettävän www-palvelun toteutustavan osalta, joka useissa tapauksissa voi olla juuri Oracle-tietokanta ja PL/SQL-kieli.

8 2 PL/SQL-KIELI JA ORACLE-YMPÄRISTÖ Tässä luvussa esitellään perusteita Oracle-tietokannasta ja tämän tietokantaohjelmiston käyttöön tarkoitetusta PL/SQL-kielestä. Oracle toimii lähes poikkeuksetta alustana ja tietokantana käytettäessä tätä kyseistä kieltä esimerkiksi www-palvelun toteutuksessa. 2.1 Oracle-tietokanta Oracle on hyvin yleinen relaatiomallinen tietokanta. Ensimmäinen versio siitä kehitettiin vuonna 1978, jolloin sen ominaisuudet olivat vielä varsin suppeat nykyversioon verrattuna. Oracle-nimeä käytetään sekä sen omistavasta yhtiöstä että itse tietokannan hallintaohjelmistosta (puhekielessä myös pelkästä tietokannasta), joka on useiden yritysten ja instituutioiden suosiossa esimerkiksi skaalautuvuutensa, siirrettävyytensä ja luotettavuutensa ansiosta. Oracle tukee kaikkia yleisimpiä tietokoneita ja käyttöjärjestelmiä. Data talletetaan Oracle-tietokannassa loogisesti taulualueisiin ja fyysisesti tiedostoihin. Taulualueet koostuvat erityyppisistä lohkoista (segments), joita voivat olla esimerkiksi indeksilohkot ja datalohkot. Lohkot koostuvat puolestaan yhdestä tai useammista ilmenemistä (extents), jotka ryhmitellään yhtenevien datablokkien (data block) perusteella. Datablokki on tiedontalletuksen perusyksikkö, ja fyysisellä tasolla tiedostot koostuvat yhdestä tai useammasta datablokista, joiden koko voi vaihdella. Datan ohella Oracletietokanta sisältää vähintään yhden instanssin (instance), joka muodostuu lähinnä datan käsittelyyn tarvittavasta muistialueesta ja tietokannan eri osien välisistä taustaprosesseista. Instanssi muodostetaan kun tietokanta käynnistetään.

9 Proseduureja ja funktioita voidaan tallentaa Oracle-tietokantaympäristöön, jossa niitä voidaan suorittaa. Näitä tietokannan käsittelyä varten luotavia ohjelmanosia voidaan rakentaa pääasiassa PL/SQL- ja Java-ohjelmointikielillä tietokannan hallintaohjelmiston versiosta riippuen. 2.2 Oracle PL/SQL-kielen historiaa Oracle-yhtiö oli aikaisemmin johtavassa asemassa tietokannan hallintaohjelmistojen markkinoilla tarjotessaan deklaratiivisia, eiproseduraalisia tekniikoita tietokantojen ja niihin liittyvien sovellusten suunnitteluun. Oracle Server tuote on nykypäiviin asti säilyttänyt asemansa tehokkaana, kehittyneenä ja vakaana relaatiotietokantaan pohjautuvana teknologiana. Oracle Serveriin liittyvänä sovelluksena kehitettiin Oracle Forms tietokantasovelluksen suunnittelutyökalu, jonka eräänä kantavana ideana on tarjota korkean tason tuottavuutta kehittäjille. Tässä ohjelmassa sovelluksen suunnittelu on tehty yksinkertaiseksi toimenpiteeksi graafisuutta pitkälti hyödyntäen. Aluksi Oraclen mullistava deklaratiivinen lähestymistapa yhdistettynä relaatiotietokantaan riitti asiakkaille, mutta ohjelmistoalan mentyä eteenpäin odotukset ja vaatimukset nousivat samalla, joten Oraclen oli otettava uusi askel tietokantatuotteidensa kehityksessä. Vuonna 1991 Oracle julkaisi Oracle Version 6.0 nimeä kantavan tietokannan hallintaohjelmiston, jossa relaatiotietokannan aikaisemman käsittelyteknologian tueksi oli kehitetty proseduraalinen tuki nimeltään PL/SQL. Ensimmäinen versio PL/SQL-kielestä oli varsin rajoittunut erityisesti proseduurien ja funktioiden uudelleenkäytettävyyden osalta, koska niitä ei voinut pysyvästi tallentaa. Puutteistaan huolimatta tälle proseduraalista logiikkaa SQL-kielen yhteyteen tuovalle kielelle oli kysyntää. Aluksi havaituista ongelmista muun muassa siirrettävyys on parantunut huimasti nykyversioon mennessä. Pitkän ajan tähtäimenä PL/SQL Version 2.0 julkaisusta lähtien on ollut

10 uudelleenkäyttöä entistä paremmin tukeva ohjelmointiympäristö, jossa moduuleita voidaan ongelmitta kutsua ja niiden käyttöoikeuksia hallita. PL/SQL-kielen kehittely on ollut jatkuvaa ja se palveleekin nykyisin hyvin Oracle-sovelluskehityksessä ja tietokannan hallinnassa. 2.3 PL/SQL-kieli työvälineenä Kyseinen ohjelmointikieli on melko läheisesti sidoksissa Oracle-tuotteisiin, joihin se on suunniteltukin eräänlaiseksi tietokannan käsittelytyökaluksi, eli pääasiassa tuotteita laajentavaksi teknologiaksi. SQL-kyselykieli on täysin sulautettuna osana PL/SQL-kieltä, jolloin sitä voidaan yhdistellä melko vapaasti proseduraalisiin ohjelmarakenteisiin. Tämänkaltainen kiinteä integraatio näiden kielten välillä mahdollistaa ottamaan täyden hyödyn irti sekä deklaratiivisesta että proseduraalisesta logiikasta. PL/SQL on melko epätavallinen ohjelmointikieli, joka on toisaalta myös sen vahvuus, koska sen ominaisuudet tukevat erityisen hyvin tietokannan hallintaan liittyviä toimenpiteitä ja ohjelmointirakenteita. SQL-lauseiden lisäksi kyseisestä kielestä löytyy ohjelmoijan työtä helpottamaan esimerkiksi kursorit (cursors), herättimet (triggers) ja paketit (packages). Kursorit auttavat tietokantaan talletetun datan hyödyntämisessä ja herättimet puolestaan ovat pieniä tietokantaan talletettuja ohjelmanpätkiä, jotka lisäävät tietokannan toiminnallisuutta ja älykkyyttä, eli myös tietoturvaa. Paketit mahdollistavat ohjelmistokehittäjälle olio-ohjelmointityylisen suunnittelun. Paketteihin voidaan koota yhteen PL/SQL:n tukemia objekteja, ne tukevat hyvin modulaarisuutta, kapselointia ja uudelleenkäyttöä. Myös mahdollisen businesslogiikan piilottaminen pakettiin voi olla käytännöllistä. Haittana voi olla suurempi muistinkulutus ladattaessa koko paketti muistiin käytettäessä jotain sen sisältämää objektia. Syntaksiltaan PL/SQL on moniin muihin ohjelmointikieliin verrattuna melko

11 yksinkertainen. Operaattorit ja merkistö muutenkin ovat suurimmaksi osaksi esimerkiksi Javasta tuttuja. 2.4 PL/SQL-lohkon perusrakenne PL/SQL-lohkon kuten esimerkiksi proseduurin rakenne muodostuu eheästä loogisesta rakenteesta, joka kyseisessä kielessä näyttää myös useimmiten helposti ymmärrettävältä. Seuraavassa on esitetty yksinkertainen ohjelmanpätkä, jolla voidaan päivittää tietokantaa haluttujen ehtojen mukaisesti SQL-kieltä hyväksikäyttäen. PROCEDURE maintain_company (action_in IN VARCHAR2, id_in IN NUMBER, name_in IN VARCHAR2 := NULL) IS BEGIN IF action_in = 'DELETE' THEN DELETE FROM company WHERE company_id = id_in; ELSIF action_in = 'INSERT' THEN INSERT INTO company (company_id, name) VALUES (id_in, name_in); END IF; END; Kun moduulin eli esimerkiksi funktion tai proseduurin (kuten yllä) rakennetta tarkastellaan kokonaisuutena, voidaan siitä tyypillisesti erottaa tietyt rakenteelliset osiot. Nämä alla kuvatut osiot muodostavat kokonaisuutena PL/SQL-lohkon. Toisaalta lohko muodostaa kokonaisuuden loogisesti toisiinsa

12 liittyvistä objekteista, kuten muuttujien määrityksistä ja suoritettavista lauseista. Lohkon otsikko (Block Header): Tämä osio on oleellinen vain nimetyille lohkoille eli proseduureille tai funktioille. Lohkot voivat olla myös nimettömiä (anonymous) kokonaisuuksia. Otsikko määrittää miten nimettyä lohkoa kutsutaan. Deklaratiivinen osio (Declarative section): Lohkon osio, joka ilmoittaa muuttujat, kursorit ja alilohkot, joihin voidaan viitata Suoritus- (Execution) ja Poikkeus (Exception) -osioissa. Suoritusosio (Execution section): Tämä lohkon osio sisältää PL/SQL:n ajonaikaisen kääntäjän suorittamat koodilauseet. Poikkeusosio (Exception sektion): Osio, joka käsittelee normaalissa ohjelman suorittamisessa mahdollisesti tapahtuvat poikkeukset eli varoitukset ja virhetilanteet. Luonteeltaan tämä osio on tärkeässä asemassa jokaisen PL/SQLlohkon merkityksessä, koska poikkeuksien käsittelyä voidaan näin paremmin keskittää ja rakentaa tarpeenmukaiseksi. KUVIO 1. PL/SQL-lohko

13 Nimettömän lohkon osalta rakenne voi olla seuraava: DECLARE Declaration Section BEGIN Execution Section EXCEPTION Exception Section END; PL/SQL-lohkon järjestys on myös sama, miten PL/SQL-kääntäjä (The PL/SQL Engine) sen suorittaa. Kääntäjä saa lohkon sisältämän suoritettavan koodin Oracle Serveriltä. Proseduraalinen osuus ja SQL-lauseet suoritetaan eri osissa tietojärjestelmää. KUVIO 2. PL/SQL Engine

14 3 WWW-PALVELUIDEN KEHITTÄMINEN Rakennettaessa tietokantapohjaista www-palvelua/sovellusta selaimella käytettäväksi, on PL/SQL-kielellä paljon annettavaa, myös verrattuna uudempiin ohjelmointikieliin. Se sisältää monipuolisesti tietokannan webkäyttöä tukevia ominaisuuksia ja mahdollistaa laajalti datan interaktiivisuuden ja dynaamisuuden www-palvelussa. 3.1 PL/SQL www-sovelluksen perusominaisuudet Tyypillisesti PL/SQL-kielellä kehitetty www-sovellus on joukko tallennettuja proseduureja, jotka kommunikoivat interaktiivisesti www-selaimen kanssa HTTP-protokollan välityksellä. Interaktiivinen toiminto voi mahdollisesti olla vaikkapa www-sivulla esitetyn lomakkeen lähetä napin painallus tai linkin klikkaus, jolloin tietokantapalvelin tarvittaessa suorittaa määrätyt proseduurit. Jos esimerkkitilanteena on lomake, jonka lähettämiseen liittyy tallennetun PL/SQL-proseduurin suorittaminen, voidaan käyttäjän syöttämiä tietoja käyttää monipuolisesti parametreina. Parametreja voidaan välittää palvelimelle myös URL-osoitteen yhteydessä. Www-selain näyttää tietokantapalvelimen suorittaman proseduurin mahdollisesti sisältämät ja käyttäjälle näytettävät tulosteet, jotka tulevat selaimen tulkittavaksi HTML-koodina. Www-sivu generoituu täten dynaamisesti riippuen suoritetun proseduurin käyttäytymisestä, johon vaikuttaa tietokannan sisältö ja välitetyt parametrit. Proseduurin generoimalta HTML-sivulta lähetetty kutsu takaisin palvelimen jollekin proseduurille ja sieltä takaisin selaimelle uutena (mahdollisesti erilaisena) HTML-sivuna muodostaa periaatteen dynaamiselle www-käyttöliittymälle PL/SQL-kieltä käytettäessä. PL/SQL-proseduuri voi tulostaa myös esimerkiksi JavaScriptkoodia selaimen tulkittavaksi.

15 PL/SQL-kielen käytön vahvuudet dynaamisen www-sovelluksen yhteydessä tulevat esiin erityisesti tietokantaperusteisessa palvelussa, jossa tarvitaan tietokantapalvelimen tarjoamaan tehokkuutta ja joustavuutta. Muistinhallinnaltaan PL/SQL-sovellus on kilpailukykyinen verrattuna vastaaviin palvelinpohjaisiin tekniikoihin kuten CGI:hin (Common Gateway Interface). PL/SQL-sovellus käyttää perinteisen tyylin mukaisesti HTML-tulostukseen Oraclen tietokannan hallintaohjelmiston paketeista löytyviä funktioita, joiden kutsuminen ohjelmakoodissa toimii yleisluontoisella ja yksinkertaisella syntaksilla. Seuraavassa on esitetty kaksi eri tapaa määrittää HTML-sivun otsikko sekä tulostaa kappaleen otsikko ja hieman tekstiä. Ensimmäinen esimerkki käyttää puhtaasti funktioita ilman HTML-tagien tulostusta. owa_util.mime_header('text/html'); htp.htmlopen; htp.headopen; htp.title('html-sivun otsikko'); htp.headclose; htp.bodyopen( cattributes => 'TEXT="#000000" BGCOLOR="#FFFFFF"'); htp.header(1, 'Kappaleen otsikko'); htp.para; htp.print('kappaleen tekstiä.'); htp.bodyclose; htp.htmlclose; Ja toinen ehkä hieman helpompi vaihtoehto toimii tulostamalla HTML-tageja selaimen tulkittavaksi print-funktiolla. htp.print('<html>'); htp.print('<head>'); htp.print('<meta http-equiv="content-type" content="text/html">'); htp.print('<title>html-sivun otsikko</title>'); htp.print('</head>'); htp.print('<body TEXT="#000000" BGCOLOR="#FFFFFF">'); htp.print('<h1>kappaleen otsikko</h1>'); htp.print('<p>kappaleen tekstiä.'); htp.print('</body>'); htp.print('</html>');

16 3.2 Kursoreiden ominaisuudet ja käyttö Määritelmältään PL/SQL-kielessä kursori on staattinen objekti, johon voidaan myös määrittää toimimaan kursori-muuttuja osoittimena. Eli käytännössä muuttuja, joka viittaa SQL-operaatioita suorittavaan alueeseen proseduurissa tai funktiossa. Tätä muuttujan sisältämää tietoa on mahdollista käsitellä ohjelmassa. Kursorimuuttujia voidaan välittää proseduureille ja funktioille parametreina, ja proseduurit ja funktiot voivat palauttaa näiden muuttujien arvoja. Kursorimuuttuja voi viitata eri kursoreihin elinaikanaan. Kursoreiden tarjoamiin etuihin kuuluvat myös kapselointi, ylläpidon helppous ja joustavat käyttöoikeudet. Kapselointiin kuuluu tietokantaoperaatioiden keskittäminen siihen tallennettuun proseduuriin, joka avaa kursorimuuttujan. Ylläpitoominaisuuksiltaan kursoria muutettaessa tarvitsee muutos tehdä vain yhteen paikkaan, joka löytyy talletetusta proseduurista. Käyttöoikeuksien puolesta käyttäjällä tarvitsee olla vain suoritusoikeus siihen proseduuriin, joka avaa kursorin, esimerkiksi lukuoikeus kursorin SQL-lauseen käyttämiin tietokantatauluihin ei ole välttämätön. Kursorin sisältämän SQL-kyselyn palauttama tulosjoukko (result set) on tietty määrä tietokantataulun rivejä, joita voidaan prosessoida yhtä kerrallaan. Yksinkertaisimmillaan kursorin määrittäminen ohjelmakoodissa voi näyttää seuraavalta: DECLARE CURSOR kursori1 IS SELECT tyontekija_nro, nimi, virka FROM tyontekija WHERE osasto_nro = 50; Tämä kursori sisältäisi tulosjoukkonaan alla olevan taulukon mukaiset tiedot.

17 KUVIO 3. Kursorin tulosjoukko Kursoreitten toimintaa voidaan ohjata useilla eri komennoilla kuten avaaminen, rivin poiminta ja sulkeminen. Kursorin sisältämät rivit voidaan käydä läpi myös FOR-silmukalla. Kursorimuuttujan määrittäminen proseduurin tai funktion yhteydessä vaatii esittelyyn liittyvät käskyt. 3.3 Pakettien ominaisuudet ja käyttö Paketti voidaan määritellä kokoelmaksi PL/SQL-kielen objekteja, kuten proseduureja, funktioita, muuttujia, vakioita, kursoreita ja poikkeuksia. Pakettien käyttö on eräs tapa koota yhteen yksittäisiä proseduureja ja funktioita. Tämä toimenpide tuo mukanaan useita etuja, jotka mahdollistavat sovelluskehityksen organisoinnin tehostamisen, käyttöoikeuksien määrittämisen keskittämisen ja monipuolistamisen, paketin objektien muuttamisen itsenäisesti ilman niihin liittyvien muitten objektien uudelleenkääntämistä ja useiden paketin objektien lukemisen muistiin kerralla. Lisäksi paketti voi sisältää globaaleita muuttujia tai kursoreita, jotka ovat kaikkien paketin sisällä olevien proseduurien ja funktioiden käytössä. Eräänä tärkeänä oliopiirteenä pakettien käytössä on myös proseduurien ja funktioiden kuormittaminen, eli voidaan käyttää samannimisiä proseduureja tai funktioita, joilla on toisistaan tyypiltään tai määrältään eroavat parametrit. Paketin jotain proseduuria tai funktiota kutsuttaessa valitaan parametrien perusteella sopivin käytettäväksi. Seuraavassa esimerkissä näytetään käyttäjän autentikointia varten luotu

18 paketti. Ensimmäinen kokonaisuus on paketin esittelyosio (specification) ja seuraavana kokonaisuutena on paketin runko-osio (package body). Esittelyosiossa esitellään paketin yleiset tyypit, muuttujat, vakiot ja aliohjelmat, joita voidaan kutsua paketin ulkopuolelta. Paketin runko-osiossa määritellään esittelyosiossa esitellyt objektit, myös yksityiset objektit, jotka eivät ole näkyvissä tai käytettävissä paketin ulkopuolella. Yleisesti voidaan kutsua paketin sisältämiä objekteja, mikäli omataan suoritusoikeus (Execute) pakettiin tai sen sisältämiin proseduureihin (Execute any procedure). PACKAGE: AUTENTIKOINTI CREATE OR REPLACE PACKAGE autentikointi AS /* Tämä paketti sisältää käyttäjän tunnistamiseen tarvittavat aliohjelmat */ FUNCTION getuserid RETURN VARCHAR2; /* Funktio hakee talletetun evästeen käyttäjän tunnistuksen varmentamiseksi ja palauttaa tunnistautuneena olevan käyttäjän tunnuksen. */ PROCEDURE setuserid(id varchar2 DEFAULT NULL); /* Jos id ei ole NULL, niin proseduuri tallettaa käyttäjän tunnistuksen evästeeksi. Jos id on NULL, niin tunnistus poistetaan. */ FUNCTION UserIdOk RETURN BOOLEAN; /* Tarkastaa käyttäjä tunnistamisen. Palauttaa TRUE, jos tunnistaminen on voimassa muutoin FALSE. */ END; /

19 PACKAGE BODY: AUTENTIKOINTI CREATE OR REPLACE PACKAGE BODY autentikointi AS FUNCTION getuserid RETURN VARCHAR2 IS c_cookie OWA_COOKIE.COOKIE; BEGIN c_cookie := OWA_COOKIE.GET('uid'); IF c_cookie.vals.count < 1 THEN RETURN NULL; END IF; IF c_cookie.vals(1) = '' THEN RETURN NULL; END IF; RETURN c_cookie.vals(1); END; PROCEDURE setuserid(id varchar2 DEFAULT NULL) IS BEGIN OWA_UTIL.MIME_HEADER('text/html', FALSE); OWA_COOKIE.SEND('uid',id); OWA_UTIL.HTTP_HEADER_CLOSE; END; FUNCTION UserIdOk RETURN BOOLEAN IS BEGIN IF getuserid IS NOT NULL THEN RETURN TRUE; ELSE RETURN FALSE; END IF; END; END; /

20 3.4 Parametrien välitys www-sovelluksessa Jotta PL/SQL-kielellä luodusta www-palvelusta saataisiin dynaamisesti toimiva, on käyttäjän ja palvelimen välinen kommunikointi oltava riittävän interaktiivista. Käyttäjältä pyydettävien tietojen keräämiseen voidaan soveltaa vapaasti käytettävyyteen liittyviä ohjeita, mutta sovelluksen toimivuuden kannalta tärkeintä on saada proseduurin suorituskäsky liikkeelle palvelimelle toimitettavaksi esimerkiksi nappia painamalla, jolloin käyttäjän syöttämä data voidaan välittää samalla eteenpäin. Toinen yleisesti käytetty tapa parametrien välityksessä on URL-osoite, joka on mahdollista määrittää linkin yhteydessä. Selain voidaan ohjata parametreilla täydennettyyn URL-osoitteeseen klikatun linkin kautta tai muuten proseduurin ohjaamana. Seuraavassa esitetään esimerkki ohjelmakoodista, jossa palaute -proseduuri käyttää saamiaan parametreja hyödykseen toiminnassaan. Proseduuri on osa matkatoimiston www-pohjaista varausjärjestelmää. Sen tehtävänä on ohjata käyttäjän täyttämän palautelomakkeen tietojen lähettämiseen ja tietokantaan tallentamiseen liittyvää toimintaa. Palautteen kelpaavuus tarkastutetaan ennen tietokantaan tallentamista tarkastuksen suorittavassa proseduurissa, jonka koodia ei seuraavassa esimerkissä ole näkyvillä. Ohjelmakoodissa usein esiintyvä VARCHAR2 on PL/SQL-kielessä yleisesti käytetty tietotyyppi, joka voi sisältää sekä numeerisia arvoja että kirjainmerkkejä. Sille varattu muistitila voidaan erikseen määrittää suluissa annetulla numeroarvolla. PALAUTE /* Esitellään aluksi proseduurin muuttujat */ CREATE OR REPLACE PROCEDURE palaute(p_palaute_id VARCHAR2 DEFAULT NULL, p_from VARCHAR2 DEFAULT NULL, p_pvm VARCHAR2 DEFAULT NULL,

21 p_p_nimi VARCHAR2 DEFAULT NULL, p_p_email VARCHAR2 DEFAULT NULL, p_p_palaute VARCHAR2 DEFAULT NULL, p_p_vastauspyynto VARCHAR2 DEFAULT NULL, p_action VARCHAR2 DEFAULT NULL) AS CURSOR cur_palautteet IS SELECT * FROM palautteet ORDER BY p_pvm; vp_muuttuja NUMBER(1):=0; BEGIN /* Tarkastetaan saadun p_action parametrin sisältö ja toimitaan sen mukaisesti */ IF p_action = 'Lähetä' THEN INSERT INTO palautteet(palaute_id, p_pvm, p_nimi, p_email, p_palaute, p_vastauspyynto) VALUES (palaute_seq.nextval, SYSDATE, p_p_nimi, p_p_email, p_p_palaute, p_p_vastauspyynto); OWA_UTIL.REDIRECT_URL('kiitos_palautteesta'); ELSE apu.pbegin('palaute'); apu.pmenu2('palaute'); apu.pbordersbegin; IF p_action='virhe' then /* Jos tarkasta_palaute on huomannut sivulla virheitä niin sivulle palautetaan p_action parametrissa "virhe" */ htp.p('<p><font color="red"><b>kentissä oli virheitä, tarkasta seuraavat kohdat:</b></font>'); htp.p('<ul><li>nimi-kentässä merkkejä voi olla 2-50,</li>'); htp.p('<li>sähköpostiosoite-kentässä merkkejä voi olla 3-30,</li>'); htp.p('<li>palaute-kentässä merkkejä voi olla 2-1000</li></ul></p>');

22 END IF; htp.p('<p><b>lähetä postia matkatoimiston henkilökunnalle:</b></p>'); --htp.p('<form ACTION="mailto:jaalauti@cc.jyu.fi" METHOD="POST">'); htp.p('<form ACTION="tarkasta_palaute" METHOD="POST">'); /* Lomake ei mene tarkastukseen, koska se annetaan oletuksena olevalle sähköpostiohjelmalle, jossa tietoja voi taas muokata. */ htp.p('<b>nimesi: </B><BR>'); htp.p('<input type="text" name="p_p_nimi"><br><br>'); htp.p('<b>sähköpostiosoitteesi: </B><br>'); htp.p('<input type="text" name="p_p_email"><br><br>'); htp.p('<b>palaute: </B><br>'); htp.p('<textarea name="p_p_palaute" rows=8 cols=50> </textarea><br><br>'); htp.p('<input type="checkbox" name="p_p_vastauspyynto" value="1">vastausta pyydetään <BR><BR>'); /* Lomakkeen mukana välitettävät parametrit */ htp.p('<input TYPE=Hidden name="p_from" value="lähetys">'); htp.p('<input TYPE=Hidden name="p_palaute_id" value="p_palaute_id">'); htp.p('<input TYPE=Hidden name="p_pvm" value="p_pvm">'); htp.p('<input TYPE=Submit name="p_action" value="lähetä">'); htp.p('<input TYPE=reset VALUE="Tyhjennä">'); htp.p('</form>'); END IF; IF autentikointi.useridok THEN /* Seuraavat apu-pakettia käyttävät rivit muodostavat HTML-taulukon */ htp.p('<div id="kavennus">'); htp.p('<hr>'); htp.p('<p><b>lähetetyt palautteet:</b></p>'); FOR p_rec IN cur_palautteet LOOP apu.trowb; apu.tbegin(0,0);

23 apu.tdatab('0%',10); htp.p('<b>pvm: </b>'); apu.tdatae; apu.tdatab('0%',10); htp.p('<b>' p_rec.p_pvm '</b>'); apu.tdatae; apu.trowe; apu.trowb; apu.tdatab('0%',10); htp.p('palaute-id: '); apu.tdatae; apu.tdatab('0%',10); htp.p(p_rec.palaute_id); apu.trowe; apu.trowb; apu.tdatab('0%',10); htp.p('nimi: '); apu.tdatae; apu.tdatab('0%',10); htp.p(p_rec.p_nimi); apu.trowe; apu.trowb; apu.tdatab('0%',10); htp.p('sähköposti: '); apu.tdatae; apu.tdatab('0%',10); htp.p(p_rec.p_email); apu.trowe; apu.trowb; apu.tdatab('0%',10); htp.p('palaute: '); apu.tdatae; apu.tdatab('0%',10); htp.p(p_rec.p_palaute); apu.trowe; apu.trowb; apu.tdatab('0%',10);

24 htp.p('vastauspyyntö: '); apu.tdatae; apu.tdatab('0%',10); IF p_rec.p_vastauspyynto=1 THEN htp.p('vastausta pyydetään'); ELSE htp.p('ei vastauspyyntöä'); END IF; apu.trowe; apu.trowb; apu.tdatab('0%',10); apu.tdatae; apu.tdatab('0%',10); apu.trowe; apu.tend; htp.p('<hr>'); END LOOP; htp.p('</div>'); END IF; apu.pbordersend; apu.pend; EXCEPTION /* Jos tietoja ei löydy niin ilmoitetaan virheestä käyttäjälle */ WHEN NO_DATA_FOUND THEN apu.errorpage('tietoja ei löydy!'); WHEN OTHERS THEN apu.errorpage('tapahtui järjestelmän sisäinen virhe. Ota yhteys tietokannan ylläpitäjään.'); END; / Www-ympäristössä edellä olevan palaute -proseduurin koodi toimii taustalla seuraavan näköisessä käyttöliittymässä, jossa avoinna on palautesivu.

25 KUVIO 4. PL/SQL-kieltä käyttävän www-sovelluksen käyttöliittymä 3.5 Herättimet osana tietokantaa Herätin (Trigger) on tietokantaan tallennettu proseduuri, joka aktivoituu kun haluttu SQL-operaatio suoritetaan. Tyypillisesti SQL-komennoista INSERT, UPDATE tai DELETE komento käynnistää herättimen toiminnan. Oracleympäristössä myös PL/SQL- tai Java-proseduurin suorittaminen voidaan määrittää ehdoksi herättimen aktivoitumiselle. Herätin luodaan komennolla CREATE TRIGGER. Seuraavassa ohjelmanpätkässä esitetään yksinkertainen herätinproseduuri, joka aktivoituu kun tietokantatauluun kohdistuu jokin SQLkäskyistä DELETE, INSERT tai UPDATE. Esimerkki herättimen aktivoivasta SQL-lauseesta: UPDATE Emp_tab SET sal = sal + 500.00 WHERE deptno = 10; Herätinproseduuri: CREATE OR REPLACE TRIGGER Print_salary_changes

26 BEFORE DELETE OR INSERT OR UPDATE ON Emp_tab FOR EACH ROW WHEN (new.empno > 0) DECLARE sal_diff number; BEGIN sal_diff := :new.sal - :old.sal; dbms_output.put('old salary: ' :old.sal); dbms_output.put('new salary: ' :new.sal); dbms_output.put_line('difference ' sal_diff); END; / BEFORE-käsky merkitsee sitä, että uudet arvot huomioidaan ennen kuin ne tallennetaan tietokantatauluun, jolloin niitä voidaan muokata tarvittaessa. FOR EACH ROW-käskyllä herätin aktivoidaan jokaisen SQL-komennon kohdalla eli tämä voi tapahtua mahdollisesti useita kertoja saman komennon käynnistämänä. 3.6 Tyypillisiä, verkkoa käyttäviä operaatioita PL/SQL-kielessä PL/SQL-kielen sisäänrakennettujen ominaisuuksien kuten tietokantaoperaatioiden ja ohjelmointilogiikan lisäksi Oraclesta löytyy paketteja, jotka tarjoavat useita Internetissä käytettäviä, verkkoa käyttäviä operaatioita ohjelmoijan työkaluiksi. Sähköpostin lähetys onnistuu esimerkiksi käyttämällä UTL_SMTP-pakettia. SMTP (Simple Mail Transfer Protocol) on yksikertainen, tekstipohjainen protokolla sähköpostien lähettämiseen Internetin välityksellä. Proseduurin muuttujien esittelyn jälkeen, jossa määritellään yleensä palvelimet ja sähköpostiosoitteet, viestin lähetys onnistuu käyttämällä paketin valmiita toimintoja. Esimerkki SMTP-protokollan käytöstä: mail_conn := utl_smtp.open_connection(mailhost, 25); utl_smtp.helo(mail_conn, postipalvelin); utl_smtp.mail(mail_conn, lahettaja); utl_smtp.rcpt(mail_conn, vastaanottaja); utl_smtp.open_data(mail_conn); utl_smtp.write_data(mail_conn, 'Esimerkkiviesti.' chr(13)); utl_smtp.close_data(mail_conn);

27 utl_smtp.quit(mail_conn); Samalla periaatteella paketteja käyttämällä voidaan määrittää paikallisen koneen palvelinominaisuuksia, kuten nimi ja IP-osoite. Voidaan avata myös TCP/IP-yhteys muihin verkossa oleviin koneisiin, sekä esimerkiksi lähettää ja vastaanottaa viestejä Socket-rajapintaa käyttäen. Lisäksi on mahdollista kontrolloida monipuolisesti HTTP-protokollaa sisältäen muun muassa evästeet, sessiot, Proxy-palvelimet ja uudelleenohjaukset. Eräänä tekniikkana www-ympäristöä käyttävälle tietokantaohjelmoijalle Oracle-sovellusympäristö tarjoaa PL/SQL Server Pages (PSP) -skriptit, jotka suoritetaan palvelinpäässä. Tämä skriptaustekniikka mahdollistaa dynaamisen sisällön lisäämisen, sisältäen SQL-kyselyiden tulokset, HTML-pohjaiselle wwwsivulle. PSP:tä sisältävien HTML-sivujen tekeminen onnistuu muun muassa siihen erikseen kehitetyllä ohjelmalla, mutta myös tavallisella tekstieditorilla. PSP-koodin suorittava palvelin lähettää lopputuloksena selaimelle HTMLsivun, joka sisältää täysin selaimen ymmärtämää koodia.

28 4 PL/SQL-KIELI VERRATTUNA JAVAAN ORACLE TIETOKANTAOHJELMOINNISSA Oracle-tietokanta on perinteisesti tukenut kahta ohjelmointikieltä sisäisesti, PL/SQL:ää ja Javaa. Oracle-sovelluspalvelimessa on implementoituna Javateknologian käyttämä J2EE-alusta (Java 2 Platform, Enterprise Edition), joka tarjoaa sovellusarkkitehtuurin Java-sovelluksien käyttämistä varten. Tämä tilanne aiheuttaa usein vertailua siitä, kumpi kielistä on parempi Oracleohjelmointiin. Käytännössä tilanteen voi ratkaista esimerkiksi ohjelmoijan mieltymykset ja kyvyt tai työtehtävän rooli. Kumpikin teknologia pitää sisällään myös heikkouksia, joita alla olevassa vertailussa otetaan esille. Melko karkealla tasolla määriteltyjä erityisominaisuuksia ovat: PL/SQL Datakeskeinen ja läheisesti sidoksissa tietokantaan. Oraclen itsensä kehittämä kieli, jonka yhteensopivuus muiden tietokannan hallintajärjestelmien kanssa on huono. Vaikea siirtää muihin järjestelmiin. Tietokantaan kohdistuvat dataoperaatiot ovat PL/SQL-kielessä hieman nopeampia kuin Javassa. Syntaksiltaan ja ohjelmointirakenteiltaan lähtökohtaisesti yksikertaisempi käyttää kuin Java, mutta huonommin skaalautuva laajoissa toteutuksissa. Java Avoin standardi eli ei ole räätälöity Oraclea varten eikä ole sen omaisuutta. Vapaasti kehitettävissä, mutta toisaalta kaikkien ominaisuuksien täydellinen yhteensopivuus ei ole taattu.

29 Vaatii hieman resursseja tyyppimuunnoksiin Oracle-tietokannan ja Javan tietotyyppijärjestelmien välillä. Kokonaisuudessaan vaikeampi ohjelmointikieli käyttää Oracletietokannan hallintaan.

30 5 ORACLE-TIETOKANNAN HALLINTAJÄRJESTELMÄN TIETOTURVA Oracle-yhtiö julkaisee säännöllisesti, pääsääntöisesti neljännesvuosittain päivityksiä tuotteisiinsa. Asiakkaiden käytössä on päivityksistä tiedottava ennakkovaroitusohjelma, joka kertoo päivityksessä paikattavat ohjelmistot. Yleisesti ottaen Oracle-tietokannan hallintajärjestelmän tietoturvaa pidetään korkeatasoisena ja myös suurien organisaatioiden käyttöön sopivana, jolloin datamäärät ovat suuret ja käyttäjät hajaantuneet laajalle alueelle. Luotettavuutta on kasvattanut kymmenien vuosien kehitystyö Oracletuotteissa. Kaikesta huolimatta Oracle-tietokannasta ja PL/SQLkomponenteista on löydetty tasaiseen tahtiin useita kymmeniä haavoittuvuuksia, joita Oracle pyrkii korjaamaan päivityksissään. Viime aikoina erityisesti autentikointiin on liittynyt jopa kriittisiä haavoittuvuuksia. Oraclen tietoturvapäivityskäytäntö on saanut runsaasti kritiikkiä hitaudestaan ja kattamattomuudestaan, jolloin asiakas voi tuntea ohjelmiston turvattomaksi. Oracle Database 10g versiosta lähtien tietokannan kryptaus on jo varsin tehokkaalla tasolla johtuen pitkälti sen tukemasta AES (Advanced Encryption Standard) kryptausalgoritmista, jossa salaus on 256-bittinen. Tietokannan käyttöoikeuksia on kehitetty ja pyritty tarkentamaan entistä monipuolisemmalla oikeuksienhallinnalla. Oracle-tietokannan hallintajärjestelmän yhteyteen on kehitetty useita erillisiä ohjelmia huolehtimaan muun muassa henkilöllisyydenhallinnasta ja käyttäjien autentikoinnista.

31 6 YHTEENVETO Oracle-tietokannan hallintajärjestelmä pohjautuu relaatiotietokannan käyttämiseen tietojen tallentamisessa ja SQL-kielisiin komentoihin talletettujen tietojen hyödyntämisessä. PL/SQL-kieli on proseduraalinen lisäteknologia, joka sisältää SQL-kyselyt osana ohjelmointikieltä. PL/SQL-kieli muistuttaa syntaksiltaan varsin paljon ADA-ohjelmointikieltä ja onkin varsin helppo omaksua. Ohjelman rakenteet PL/SQL-kielessä on suunniteltu loogisiksi kokonaisuuksiksi, joissa voidaan käyttää useista ohjelmointikielistä tuttuja ehdollisia, iteratiivisia ja jaksollisia käskyjä. PL/SQL-kielessä ohjelmamoduulina käytetään usein proseduuria, jonka rakenne noudattaa lohkoksi kutsuttua loogista kokonaisuutta. Järjestyksessä lohkon muodostavat sen nimiosio, muuttujia varten oleva määritysosio, ohjelman ydinkoodin suoritukseen tarkoitettu suoritusosio ja lopuksi poikkeusten käsittelyä varten oleva poikkeusosio. Www-sovelluksen kannalta PL/SQL-kielen rakenteisiin voidaan yhdistää sujuvasti selaimen ymmärtävää HTML-kieltä, ja yleisesti Oracle-palvelimella voidaan suorittaa monimutkaisiakin PL/SQL-sovelluksia, jotka palauttavat lopputuloksena selaimelle sen ymmärtämää koodia. Parametrien välitys on keskeinen osa PL/SQL-kielen dynaamista ja interaktiivista toimintaa, ja tätä varten kyseisestä ohjelmointikielestä löytyykin muun muassa SQL-kyselyitä sisältäviä kursorimuuttujia ja proseduurien parametrien välitystä tukevia oliopiirteitä. Parametrien välitys onkin usein keskeinen osa www-palvelun toimintaperiaatetta, jolloin käyttäjän antamia syötteitä välitetään palvelimelle ja sieltä takaisin selaimelle. Tietokantasovelluksen dynaamisuutta lisäävät herättimet, jotka reagoivat aktivoitumalla tietokantaoperaatioista. Lisäksi www-ominaisuuksiltaan PL/SQL-kieli tukee useita verkkoa käyttäviä operaatioita, joita löytyy runsaasti valmiista paketeista. Paketit ovat eräänlainen

32 oliopiirre PL/SQL-kielessä, koska niihin voidaan koota yhteen yleensä jollakin tapaa toisiinsa liittyviä objekteja, joita voidaan kutsua myös paketin ulkopuolelta. Koska Oracle-tietokanta tukee myös muun muassa Javaa eräänä ohjelmointikielenään, verrataan PL/SQL-kieltä ominaisuuksiltaan usein tähän. Kummatkin kielet sisältävät omat vahvuutensa, mutta Oracle pyrkii kehittämään omistamaansa PL/SQL-kieltä niin, että se voisi palvella käyttäjiä ensisijaisena ohjelmointiratkaisuna. Oraclen tietoturvakysymykset ovat herättäneet keskustelua niin Oracle-tietokannan kuin PL/SQL-kielen komponenttien osalta. Suosittuna tietokantaohjelmistona Oraclen on parannettava jatkuvasti tietoturvaansa, jo kilpailuasemansakin säilyttämiseksi. Useat tutkimukset perehtyvät Oracle-tietokantaan ja sen ominaisuuksiin etenkin nykymarkkinoilla, mutta Oracleen sidoksissa olevaa PL/SQL-kieltä on tutkittu huomattavasti vähemmän.

33 7 LÄHDELUETTELO Feuerstein, S. & Pribyl, B., 1997. Oracle PL/SQL Programming (Second Edition) [online], O'Reilly & Associates. Saatavilla WWW-muodossa <http://www.unix.org.ua/orelly/oracle/prog2/index.htm> Kirves, A., 2006. ITviikko [online]. Saatavilla WWW-muodossa <http://www.itviikko.fi/page.php?page_id=15&news_id=200621533> Meade, K., 2006. PL/SQL Loops and the Performance Problem they May Cause [online], Oracle Underground FAQ. Saatavilla WWW-muodossa < http://www.orafaq.com/node/864> Oracle Corporation, 2002. Developing Web Applications with PL/SQL [online]. Saatavilla WWW-muodossa <http://www.di.unipi.it/~ghelli/didattica/bdl/b10501_01/appdev.920 /a96590/adgweb.htm> Oracle FAQ Knowledge Base, 2005. PL/SQL [online], Oracle Underground FAQ. Saatavilla WWW-muodossa <http://www.orafaq.com/faq/plsql> Helsingin yliopisto, 2004. Oracle tietokanta [online]. Saatavilla WWWmuodossa <http://rinkka.helsinki.fi:7778/orasov/www_apl.ohjeet.tulosta?man=1 &kie=fin&luk=1> Oracle Technology Network, 2006. Oracle Database Security and Compliance [online]. Saatavilla WWW-muodossa <http://www.oracle.com/technology/deploy/security/databasesecurity/index.html> Oraclenotes.com, 2003. Saatavilla WWW-muodossa <http://www.oraclenotes.com/dba/list_plsql_history.cfm> Powell, G., 2004. Oracle8i PL/SQL [online]. Saatavilla WWW-muodossa <http://www.oracledbaexpert.com/oracle/plsql.html>

34 Scalzo, B., 2006. Engineering Better PL/SQL [online], Oracle Underground FAQ. Saatavilla WWW-muodossa <http://www.orafaq.com/node/846>