OLIOT SQL-99:SSÄ. Katriina Kovalainen Relaatiotietokannat nyt! -seminaari. Tietojenkäsittelytieteen laitos HELSINGIN YLIOPISTO

Samankaltaiset tiedostot
OLIOT SQL-99:SSÄ. Katriina Kovalainen Relaatiotietokannat nyt! -seminaari. Tietojenkäsittelytieteen laitos HELSINGIN YLIOPISTO

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

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

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

HELIA 1 (14) Outi Virkki Tiedonhallinta

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

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

HELIA 1 (15) Outi Virkki Tietokantasuunnittelu

HELIA TIKO-05 1 (22) ICT03D Tieto ja tiedon varastointi E.Räty, O.Virkki

Java kahdessa tunnissa. Jyry Suvilehto

3. Taulujen määrittely ja muuttaminen

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

3. TAULUJEN MÄÄRITTELY JA MUUTTAMINEN

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

CSE-A1200 Tietokannat

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

SQL - STRUCTURED QUERY LANGUAGE

Tietokannat II -kurssin harjoitustyö

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

on ohjelmoijan itse tekemä tietotyyppi, joka kuvaa käsitettä

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

HAAGA-HELIA Heti-09 1 (12) ICT05 Tiedonhallinta ja Tietokannat O.Virkki Näkymät

Muuttujatyypit ovat Boolean, Byte, Integer, Long, Double, Currency, Date, Object, String, Variant (oletus)

TIETOKANTOJEN PERUSTEET MARKKU SUNI

Taulukot. Jukka Harju, Jukka Juslin

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

Olio-ohjelmointi Javalla

Ohjelmoinnin jatkokurssi, kurssikoe

Ohjelmointiharjoituksia Arduino-ympäristössä

Java-kielen perusteet

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

Sisältö. 22. Taulukot. Yleistä. Yleistä

CS-A1150 Tietokannat CS-A1150 Tietokannat / 43

18. Abstraktit tietotyypit 18.1

Makrojen mystinen maailma lyhyt oppimäärä

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

1. Omat operaatiot 1.1

Metodit. Metodien määrittely. Metodin parametrit ja paluuarvo. Metodien suorittaminen eli kutsuminen. Metodien kuormittaminen

Sisällys. JAVA-OHJELMOINTI Osa 6: Periytyminen ja näkyvyys. Luokkahierarkia. Periytyminen (inheritance)

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

Harjoitus Olkoon olemassa luokat Lintu ja Pelikaani seuraavasti:

Ohjelmistojen mallintamisen ja tietokantojen perusteiden yhteys

HELIA 1 (21) Outi Virkki Tietokantasuunnittelu

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

Tietueet. Tietueiden määrittely

Tietokannat II -kurssin harjoitustyö

HELIA 1 (14) Outi Virkki Tiedonhallinta

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

Oliot ja tyypit. TIES542 Ohjelmointikielten periaatteet, kevät Antti-Juhani Kaijanaho. Jyväskylän yliopisto Tietotekniikan laitos

Luento 5. Timo Savola. 28. huhtikuuta 2006

812336A C++ -kielen perusteet,

CS-A1150 Tietokannat CS-A1150 Tietokannat / 44

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

Sisällys. 6. Metodit. Oliot viestivät metodeja kutsuen. Oliot viestivät metodeja kutsuen

SQL:N PERUSTEET MARKKU SUNI

Sisällys. 18. Abstraktit tietotyypit. Johdanto. Johdanto

HAAGA-HELIA TIKO-05 1 (19) ICT23a Tietokannan suunnittelu ja toteutus O.Virkki

SELECT-lauseen perusmuoto

Tiedonhallinnan perusteet. H11 Ovien ja kulun valvontajärjestelmän tietokanta

Operaattoreiden ylikuormitus. Operaattoreiden kuormitus. Operaattoreiden kuormitus. Operaattoreista. Kuormituksesta

Java-kielen perusteet

Oliosuunnitteluesimerkki: Yrityksen palkanlaskentajärjestelmä

Kielioppia: toisin kuin Javassa

SQL. ! nykystandardi SQL3 eli SQL'99. ! CREATE TABLE, ALTER TABLE ja DROP TABLE. ! CREATE VIEW ja DROP VIEW. ! CREATE INDEX ja DROP INDEX

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

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

Taulukot. Taulukon määrittely ja käyttö. Taulukko metodin parametrina. Taulukon sisällön kopiointi toiseen taulukkoon. Taulukon lajittelu

HELIA 1 (17) Outi Virkki Tietokantasuunnittelu

TIEDONHALLINTA - SYKSY Luento 8. Saapumisryhmä: Pasi Ranne /9/13 Helsinki Metropolia University of Applied Sciences

Sisällys. Yleistä attribuuteista. Näkyvyys luokan sisällä. Tiedonkätkentä. Aksessorit. 4.2

Taulukot, silmukat ja muut joka koodin pikku veijarit

4. Olio-ohjelmoinista lyhyesti 4.1

Tutoriaaliläsnäoloista

Mikä yhteyssuhde on?

Java ja tietokannan käsittely (JDBC)

Linkitetystä listasta perittyä omaa listaa käytetään muun muassa viestiin liittyvien vastausten säilömiseen.

Muistutus aikatauluista

KOHDELUOKAN MÄÄRITTELY

Tietorakenteet. JAVA-OHJELMOINTI Osa 5: Tietorakenteita. Sisällys. Merkkijonot (String) Luokka String. Metodeja (public)

Jokaisella tiedostolla on otsake (header), joka sisältää tiedostoon liittyvää hallintatietoa

Tieto- ja tallennusrakenteet

OpenOffice.org Base 3.1.0

15. Ohjelmoinnin tekniikkaa 15.1

9. Periytyminen Javassa 9.1

15. Ohjelmoinnin tekniikkaa 15.1

UML ja luokkien väliset suhteet

Verilogvs. VHDL. Janne Koljonen University of Vaasa

Samanaikaisuuden hallinta. Optiot transaktionaalisissa työnkuluissa

HELIA TIKO-05 1 (17) ICT03D Tieto ja tiedon varastointi Räty, Virkki

815338A Ohjelmointikielten periaatteet Harjoitus 3 vastaukset

Olio-ohjelmointi: Luokkien toteuttaminen. Jukka Juslin

Haskell ohjelmointikielen tyyppijärjestelmä

Hakukyselyt: SELECT * FROM taulu WHERE sarake1 = Malli Nimi [WHERE sarake1 LIKE M% ] [WHERE BETWEEN ehto1 AND ehto2] [WHERE sarake1 IN/= (alikysely)]

Tällä viikolla. Kotitehtävien läpikäynti Aloitetaan Pelifirman tietovaraston suunnittelu Jatketaan SQL-harjoituksia

Ohjelmointi 2 / 2010 Välikoe / 26.3

Ohjelmointikielet ja -paradigmat 5op. Markus Norrena

4.3.1 SQL tietokanta SQL:n kirjoitusasu SQL määrittelykielenä... 36

Sisällys. Yleistä attribuuteista. Näkyvyys luokan sisällä ja ulkopuolelta. Attribuuttien arvojen käsittely aksessoreilla. 4.2

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin perusteet, kurssikoe

Transkriptio:

OLIOT SQL-99:SSÄ Katriina Kovalainen Relaatiotietokannat nyt! -seminaari Tietojenkäsittelytieteen laitos HELSINGIN YLIOPISTO Helsinki 06.02.2003

Tiivistelmä SQL-standardia on kehitelty relaatiomallisesti talletetun tiedon määrittelyyn ja hallintaan. Vuonna 1999 SQL:stä julkaistiin viimeisin standardi SQL-99, johon on liitetty oliosuuntautuneita piirteitä. Työnimenä tällä standardilla oli SQL3, josta vanhemmissa viitteissä vielä puhutaan. Tässä työssä tarkastellaan tarkemmin SQL-99 oliosuuntautuneita piirteitä. Käyttäjä voi määritellä oman tietotyypin joko SQL:n tarjoamista perustyypeistä tai hän voi yhdistellä tyyppiin tarvitsemansa tiedot muista tyypeistä. Käyttäjän määrittelemää tietotyyppiä kutsutaan lyhyesti UDT:ksi (user defined data type). UDT vastaa olio-ohjelmointikielten abstraktia tietotyyppiä (ADT), joka sisältää sen attribuutit ja toiminnan. Tietotyypistä luodaan esiintymiä. Metodit määräävät tietotyypin esiintymän toiminnot ja niillä on määritelty näkyvyysaste, joka voi olla PRIVATE, PROTECTED tai PUBLIC. Rivityypillä voi määritellä monimutkaisia tietorakenteita tietotyypin sisälle. Nimetty rivityyppi eroaa rivityypistä sillä, ettei sen tarvitse olla osa muuta tietotyyppiä ja sillä on nimi. Rivityyppi voi olla myös viittaustyyppi, jonka arvona on osoitin (pointer) toiseen tietotyyppiin. Kokoelmatyyppi tarjoaa vastineen ohjelmointikielten taulukkorakenteille. Lopulta ainoa SQL standardiin jäänyt kokoelmatyyppi on ARRAY. Tietotyypeille luodaan automaattisesti tiettyjä toimintoja. Näitä ovat mm. konstruktori ja destruktori, observer ja mutator-toiminnot. Näiden avulla luodaan ja poistetaan tietotyypin esiintymiä tai alustetaan tai päivitetään tietotyypin attribuutin arvoja. Tietotyypeille voidaan määritellä ali- tai ylityyppejä. Alityypit perivät ylityyppinsä attribuutit ja toiminnan. SQL:ssä on myös määritelty suuret oliot LOB (large object), BLOB (binary large object) ja CLOB (character large object), jotka tukevat multimediatietokantojen käyttöä. SQL:ään on lisätty samalla uusia kontrollirakenteita UDT:n toiminnan mahdollistamiseksi.

Sisällys 1 Johdanto... 1 2 Olioiden määrittely... 1 2.1 Käyttäjän määrittelemä tietotyyppi (UDT)...1 2.2 Olion identiteetti...2 2.3 Kapselointi...3 2.4 Rutiinit...3 2.5 Perintä...4 2.6 Kuormitus...5 2.7 Heräte...5 3 Tyypit... 6 3.1 Rivityyppi...7 3.2 Nimetty rivityyppi...8 3.3 Viittaustyyppi...8 3.4 Erottelutyyppi...9 3.5 Kokoelmatyyppi...9 3.6 Suuret oliot...10 4 Kontrollirakenteet... 10 4.1 Yhdistetyt lauseet...11 4.2 Valinta- ja toistorakenteet...11 4.3 SQL komentojen suoritus...11 5 Yhteenveto... 11

1 Johdanto SQL-standardia on käytetty pitkälle toistakymmentä vuotta relaatiomallisen tiedon määrittelyyn ja hallintaan. Suurin osa relaatiotietokantajärjestelmien kehittäjistä tukee sitä. (Lausen Vossen: 144.) Vuonna 1999 SQL:stä julkaistiin viimeisin standardi, joka tukee oliosuuntautunutta tietojenkäsittelyä. Tästä standardista on käytetty työnimeä SQL3, jolla vielä monet lähteet viittaavat uuteen standardiin. Käytän tässä esityksessä vain sanaa SQL uusimmasta standardista. Uusia oliopiirteitä SQL:ssä ovat mm. käyttäjän määrittelemät tyyppi sekä muita uusia tietotyyppejä, kuten rivityyppi, viittaustyyppi ja kokoelmatyyppi, tyyppikonstruktorit, erilaiset rutiinit, olioidentiteetti, tiedon kapselointi, yleistys ja erikoistaminen tyyppihierarkiassa ja perintä. SQL:ssä on myös määritelty suuret oliot LOB (large object), BLOB (binary large object) ja CLOB (character large object), jotka tukevat multimediatietokantojen käyttöä (Lausen Vossen: 145). Näitä piirteitä esitellään seuraavissa kappaleissa tarkemmin. SQL:ään on lisätty samalla uusia kontrollirakenteita rutiinien toteuttamiseksi ja lohkomääritys useiden SQL-lauseiden peräkkäiseen suoritukseen. Näin SQL:n ja perinteisten ohjelmointikielien välinen ero on kaventunut. 2 Olioiden määrittely Oliot luodaan tietotyypeistä ja kerran luotu olio saa pysyvän identiteetin, joka säilyy koko sen eliniän. Tyypille voi määritellä attribuutteja ja metodeja, joille puolestaan voi määritellä näkyvyysasteen. Tyypillä voi olla alityyppejä ja ylityyppejä. SQL:ssä tyyppi vastaa käsitteenä tietokantataulua ja olion esiintymä taulun riviä. 2.1 Käyttäjän määrittelemä tietotyyppi (UDT) Käyttäjä voi määritellä SQL:ssä oman tietotyypin UDT:n (user defined data type), aikaisemmissa julkaisuissa käytetyn ADT:n (abstract data type) eli abstraktin tietotyypin, joka kapseloi attribuutit ja metodit yhdeksi olioksi käyttäjän määrittelemällä tavalla. Olion voi tuottaa (konstruoida) mistä tahansa tietotyypistä. Tietotyypin määrittely yleisellä tasolla: CREATE TYPE <tyypin nimi> AS [<alityyppi määrittely>] [<attribuutit>] [NOT FINAL] [<rutiinit>] (Gallaher 1992: 2, Schek 2001: 7.) 1

Tyypille määritellään nimi, attribuutit ja metodit. Alityyppi ja NOT FINAL -määrittelyihin palataan myöhemmin (ks. 2.2 Olion identiteetti ja 2.5 Perintä). Attribuutille on määriteltävä nimi ja tyyppi. Attribuutin tyyppi voi olla SQL:n perustyyppi ja joku sen tarjoamista uusista tietotyypeistä. Attribuutti määrittely voi olla esim. nimi VARCHAR (30) tai osoite(ostyyppi), jossa ostyyppi on joku käyttäjän määrittelemä tietotyyppi. (Schek 2001: 9.) Attribuutteja on kahdenlaisia: virtuaalisia ja talletettuja. Talletettu attribuutti sisältää vähintään nimen ja tietotyypin. Virtuaaliattribuutilla ei ole talletettua arvoa, vaan sen arvo johdetaan tai lasketaan ajon aikana. (Object Services and Consulting Inc.: 7, 10.) Jokaisella talletetulla attribuutilla on vähintään observer (tarkkaaja) ja mutator (muuttaja) toiminnot, joilla voidaan alustaa, lukea ja päivittää attribuutin arvoja (Schek 2001: 9, 12.). Esimerkiksi edellä määritellylle attribuutille osoite määritellään automaattisesti observer: FUNCTION osoite(osoitetyyppi) RETURNS VARCHAR(30) ja mutator: FUNCTION osoite(osoitetyyppi, VARCHAR(30) RETURNS osoitetyyppi. Observer-toiminnolla voi alustaa ja lukea tietotyypin attribuuttien arvoja ja mutator-toiminnalla muuttaa niitä. Tyyppiin liittyviä rutiineja nimitetään metodeiksi. Metodit määräävät tyypin olion käyttäytymisen, toiminnot, joita se/sillä voi tehdä. Attribuutteihin pääsee käsiksi vain metodien kautta. (Schek 2001: 10.) UDT:n määrittelyn yhteydessä luodaan automaattisesti konstruktori ja destruktori toiminnot, joilla voi luoda ja tuhota tyypin esiintymiä. Nämä funktiot ovat kaikkien käytettävissä eikä niille välitetä parametreja. (Object Services and Consulting Inc.: 3.) Tietokantataulu perustuu tyyppeihin ja ne luodaan CREATE-komentolla: CREATE TABLE henkilokunta OF henkilotyyppi ja olioiden esiintymät talletetaan tauluun riveinä. (Schek 2001: 13). 2.2 Olion identiteetti Oliolla on identiteetti, tunniste, joka yksilöi sen. Olion identiteetti säilyy koko sen eliniän, kun muut sen arvot muuttua. Olion identiteetti ei vanhene edes olion lakattua olemasta olemassa samaan tapaan kuin aikaleimaustakaan ei käytetä uudelleen. (Gallaher 1992: 3-4.) Tietokantataulumäärittelyssö määritellään miten OID (Object identifier) muodostetaan. Järjestelmä voi generoida olioille (tyypin ilmentymille) tunnisteen tai käyttäjä voi märitellä itse, millaista tunnistetta käytetään. Lisäksi määritellään voidaanko olioon viitata isäntäohjelmointikielessä suoraan tällä tunnisteella vai onko tunniste vain tietokannan sisäiseen käyttöön (Gallaher 1992: 2). 2

SQL:ssä ei ole mahdollisuutta tallettaa tietotyypin esiintymiä käyttäen vain niiden nimeä tunnisteena eikä välttämättä mitään komentoa, jota voidaan soveltaa kaikkiin tietyn tietotyypin esiintymiin (Object Services and Consulting Inc.: 4). 2.3 Kapselointi Tietotyypin attribuuteille ja metodeille voidaan määritellä eri asteinen näkyvyystaso (encapsulate level), joita on kolme: PUBLIC, PRIVATE ja PROTECTED. PUBLIC-määrittelyllä UDT:n osat ovat julkisia eli kaikki, joilla on oikeus viitata tietotyypin olioon, näkevät nämä osat tai vaihtoehtoisesti voivat käyttää niitä. PRIVATE-määrittelyllä UDT:n osat ovat vain UDT:n sisäiseen käyttöön. PROTECTED-määrellä määritellään, että osat näkyvät UDT:n sisällä ja sen kaikilla alityypeillä. (Gallaher 1992: 3.) 2.4 Rutiinit SQL-standardissa puhutaan Persisten Stored Modules:stä (PMS), kun tarkoitetaan funktioita, metodeja ja proseduureja tai niiden määrittelyjä (Reye: 38). Suomenkielisessä tekstissä on käytetty ilmausta rutiini. Metodeiksi nimitetään toimintoja, jotka liittyvät johonkin tietotyyppiin. Funktio on itsenäinen toimintolohko, joita kuitenkin kutsutaan samoin kuin metodeita. Proseduurin parametrin välitys on laajempaa kuin metodien ja funktioiden. (Ki-Joon Han, SQL99 Foundation Overview 6/7). Rutiinit ovat toimintalohkoja, joille voi välittää syöttöparametrin ja ne palauttavat tulosparametrin. Rutiinit voivat sisältää erilaisia kontrollirakenteita (ks. 4 Kontrollirakenteet), niihin voi olla määritelty paikallisia muuttujia ja niillä voi olla tietty virhekäsittelijä. (Reye: 40). Rutiinilla on oltava nimi. Funktiolle ja metodille voi välittää syöttöparametri ja se palauttaa yhden tietotyypin arvon RETURNS-lauseella. Proseduurille sen sijaan voi välittää parametrin, jonka tyyppi voi olla syöttöparametri (in), tulosparametri (out) tai sekä syöttö- että tulosparametri (inout). SQL:n sisäisellä parametrilla on oltava nimi ja tietotyyppi, joka voi olla mikä tahansa SQL:n avulla määritelty tietotyyppi. (Ki-Joon Han, SQL-Invoked Routines 1/2-2/2.) UDT sisältää attribuuttien lisäksi metodit, jotka määrittelevät UDT:n toiminnan. Osa tietorakenteista on staattisia ja ne ovat tietokantaan talletettuja rakenteita. Osa toteutetaan käännettävänä koodina, jonka täsmälliset arvot määrittyvät ajonaikaisten parametrien arvoista. (Gallaher 1992: 5.) 3

CREATE METHOD palkankorotus RETURNS euro FOR tyontekijatyyppi BEGIN DECLARE vanhapalkka euro; vanhapalkka = SELF.palkka IF (SELF.lastenmaara < 3) OR (SELF.projektit_lkm < 2) THEN SET SELF.palkka = 1,03 * vanhapalkka ELSE SET SELF.palkka = 1,05 * vanhapalkka ENDIF RETURNS SELF.palkka END. (Schek 2001: 17.) Rutiinit voi määritellä UDT:n tai SQL:n sisäisiksi, ulkopuolisiksi tai jopa SQL:n ulkopuolisiksi eli niillä voi kutsua toisella ohjelmointikielellä tehtyä toimintaa. Funktion tai metodin kutsu on SELECT-lause, kun proseduuria kutsutaan CALL-komennolla (Lausen Vossen: 146). 2.5 Perintä Alityyppimäärittelyllä (ks. 2.1 Käyttäjän määrittelemä tietotyyppi) UNDER <tietotyypin nimi>, voi tietotyypin määritellä alityypiksi olemassa olevalle tietotyypille, josta tulee tällöin alityypin ylityyppi. Sanotaan, että alityyppi erikoistaa ylityypin ja että ylityyppi yleistää alityypin. (Gallaher 1992: 6, 7.) Alityyppi perii ylityypiltään tämän attribuutit ja rutiinit. Lisäksi sillä voi olla omia attribuutteja ja rutiineita. Perintä tukee tiedon abstraktia esitystapaa, kun se sallii olioiden tyyppihierarkian, joka mahdollistaa uuden tietotyypin luomisen ilman, että vanhan ominaisuudet ja toiminta menetetään. (Gallaher 1992: 6.) Tietotyyppi ei voi olla itsenä ylityyppi (Gallaher 1992: 6). SQL tyyppihierarkia vaatii, että jokainen alityypin esiintymä on myös sen ylityypin esiintymä; alityyppi koostuu kaikista sen ylityypeistä. (Schek 2001: 19.) 4

Jokaiseen esiintymään liitetään käsite most spesific type eli tarkin tyyppi. Esiintymällä on aina joku tarkin tyyppi. Sen ei kuitenkaan tarvitse olla tyyppihierarkian alin alityyppi. Esimerkiksi henkilö-tyypillä voi olla alityypit opiskelija ja työntekijä. Tietyn esiintymän tarkin tyyppi voi kuitenkin olla henkilötyyppi eikä sen tarvitse olla työntekijä- tai opiskelijatyyppi. (Object Services and Consulting Inc.: 9.) Oletetaan, että tietokannassa on talletettuna henkilötyyppi, jonka nimi-attribuutin arvo on Johanna, ja opiskelijatyyppi, jonka nimi-attribuutin arvo on Maria. Johannan tarkin tyyppi on nyt henkilötyyppi ja Marian tarkin tyyppi on opiskelijatyyppi. Maria on alityyppinä kuitenkin myös henkilötyypin esiintymä. Nyt seuraavat SELECT lauseet palauttavat vastaavassa järjestyksessä: SELECT nimi FROM henkilö Johanna, Maria SELECT nimi FROM opiskelija Maria SELECT nimi FROM ONLY henkilö Johanna ONLY-määreellä voi siis karsia alityypin esiintymät ylityyppiä haettaessa (Reye: 18). FINAL-määreellä (ks. 2.1 Käyttäjän määrittelemä tietotyyppi) määritellään tietty rakenne lopulliseksi, sillä ei voi enää olla alirakenteita ja NOT FINAL taas määrittelee, että tyypillä voi olla alirakenteita. (Schek 2001: s 8.) Jos rutiini on määritelty tyypin useammassa ylityypissä, se peritään yleisimmältä ylityypiltä tai alityypin on nimettävä perityt osat uudelleen (Object Services and Consulting Inc.: 9). 2.6 Kuormitus Rutiinin kuormituksella (overloading) tarkoitetaan mahdollisuutta nimetä useampi rutiini samannimiseksi. Perinnän seurauksena alityyppi on saattanut periä ylityypeiltään samannimisiä rutiineita tai alityyppi haluaa toteuttaa samannimisen rutiinin, joka kuitenkin toimii eritavalla kuin ylityypin rutiini. (Object Services and Consulting Inc.: 5.) Ajon aikana valitaan rutiineista se, jonka parametrien tyypitys sopii parhaiten kutsuvan rutiinin parametrien tyypitykseen, ellei rutiinissa ole suoraan määritelty OVERRIDING-määreellä, minkä metodin se korvaa (Ki-Joon Han). Vain funktioita voi kuormittaa, proseduureja ei (Ki-Joon Han, Routine Overloading). 2.7 Heräte Triggeri eli liipaisin eli heräte on toiminta, joka käynnistyy automaattisesti, kun liipaisun edellyttämä ehto täyttyy. Herätteitä voi käyttää mm. takaamaan tietokannan eheyden tai huolehtimaan omista eheyssäännöistä. (Object Services and Consulting Inc.: 5.) 5

Liipaisimella täytyy olla nimi, ehto, joka määrittelee, milloin liipaisimen ohjelmoitu toiminta suoritetaan, taulu, jota muutos koskee, tapahtumatyyppi, joka aiheuttaa liipaisun (INSERT, DELETE, UPDATE) ja jos tapahtumatyyppi on UPDATE, on myös määriteltävä, mitä sarakkeita päivitys koskee. Liipaisimen voi määritellä laukeamaan ennen (BEFORE) tai jälkeen (AFTER) kyseisen tapahtuman tai ajankohdan voi määritellä itse. (Reye: 37). Liipaisimeen toiminnaksi voi määrittää minkä tahansa SQL-komennon tai komentojoukon, jossa voi olla myös valintarakenteita (ks. 4 Kontrollirakenteet) (Ki-Joon Han, SQL99 Foundation Overview 2/7.). Esimerkki liipaisimen määrittelystä: CREATE TRIGGER liipaisin AFTER DELETE ON taulu REFERENCING OLD ROW AS vanharivi FOR EACH ROW INSERT INTO loki VALUES ( Poistettu, vanharivi.avaintieto) (Reye: 36.) Esimerkissä poistettaessa rivejä taulu-nimisestä tietokantataulusta, niiden avaintieto-sarakkeen arvo ja sana Poistettu talletetaan loki-nimiseen tietokantatauluun. 3 Tyypit Perustyypit SQL:ssä ovat seuraavat: numeerinen arvo (numeric), joka voi olla tarkka (smallint, integer, decimal tai numeric) tai likimääräinen (real, float, double), merkkijono (string), joka voi olla kiinteä (fixed) tai vaihtelevan mittainen (varying) bitti (bit), kiinteä, vaihtelevan mittainen merkki (character) tai CLOB (character large object) sekä BLOB (binary large object), tosi/epätosi (Boolean), ns. datetime, joka voi olla päivämäärä (date), kellon aika (time) tai aikaleima (timestamp), intervalli (interval) (Ki-Joon Han). Näiden perustyyppien eli vakiotyyppien lisäksi SQL:ssä voi määritellä omia tietotyyppejä (UDT) ja uutena SQL tarjoaa nyt myös seuraavia tyyppirakenteita: rivityyppi, nimetty rivityyppi, viittaustyyppi, erottelutyyppi, parametrisoitu tyyppi, kokoelmatyyppi ja suuri olio. Myös NULL-arvo on tietotyyppi (Gallaher 1992: 5). 6

Seuraavassa esimerkki tyyppimäärittelystä: CREATE TYPE työntekijä_t (PUBLIC nimi CHAR(2), b_osoite osoite_t johtaja työntekijä_t, tulopäivä DATE, PRIVATE peruspalkka DECIMAL(7,2), tulospalkkio DECIMAL(7,2), PUBLIC METHOD työskennellyt (p työntekijä_t) RETUNRS INTEGER <koodi, joka laskee työskentelyajan pituuden>, PUBLIC METHOD työskennellyt (p työntekijä_t, p pvm) RETURNS työntekijä_t <koodi, jolla päivitetään työskentelyaikaa> PRIVATE METHOD palkka (p, työntekijä_t) RETURNS DECIMAL <koodi, jolla lasketaan palkka> (Object Services and Consulting Inc.: 6-7). Työskennellyt on esimerkki virtuaaliattribuutista, jolla on arvo vain ajon aikana. 3.1 Rivityyppi Rivityypillä määritellään monimutkaisia rakenteita. Se on UDT:n sisälle määritelty tyyppi ja koostuu joukoista kenttiä tai tietotyyppejä. Rivityypin määrittely muistuttaa taulun määrittelyä. Rivityypillä mahdollistetaan, että parametrin välityksessä voidaan välittää suurempia tietojoukkoja kuin yksi tietoalkio. (Object Services and Consulting Inc.: 7.) Esimerkissä työntekijätauluun luodaan rivityyppi osoite ja sen sisälle toinen rivityyppi postinumero: CREATE TABLE työntekijä (nimi CHAR(40), osoite ROW(katu CHAR(30), postinumero ROW(maatunnus CHAR(5), pnumero CHAR(10)) postitoimipaikka CHAR(20))); (Object Serveces and Consulting Inc.: 7.) 7

Attribuutteihin viitataan käyttäen ns. pistenotaatiota (dot notation) esim. tyyppi.attribuutti tai tyyppi.rivityyppi.attribuutti, jne. (Schek 2001: 11). 3.2 Nimetty rivityyppi Rivityyppejä voi määritellä myös UDT:n ulkopuolelle ja silloin niiden rakennetta ei ole kapseloitu. Esimerkki nimetystä rivityypistä: CREATE ROW TYPE tili_t (tilinro INT, tiliasiakas REF(asiakas_t), tyyppi CHAR(1), avattu DATE, saldo DOUBLE PRECISION); (Object Services and Consulting Inc.: 7.) 3.3 Viittaustyyppi Nimetty rivityyppi voi olla myös viittaustyyppi. Viittaustyyppi merkitään REF-määreellä (ks. edellinen esimerkki). Viittaustyypin arvo yksilöi tietyn rivityypin esiintymän. Se voi olla osoitin (pointer) toisen taulun riville tai olion identiteetti. (Object Services and Consulting Inc.: 7.) Esimerkissä mainittu asiakas_t viittaustyyppi voi viitata mihin tahansa riviin, jossa on tyyppi asiakas_t (Object Serveces and Consulting Inc.: 8). SCOPE-määreellä määritellään tyyppi, johon viittaustyyppi viittaa. Esimerkiksi FOR SCOPE tiliasiakas IS asiakas määritellään, että tiliasiakas viittaa asiakastyypin tietotyyppiin. (Object Services and Consulting Inc.: 8.) Taulumäärittelyssä SCOPE-määre on pakollinen (Schek 2001: 13). Viittauksissa voi käyttää myös polkuilmausta (path expression) -> (Object Services and Consulting Inc.: 8). 8

SELECT t.tiliasiakas->nimi FROM tili t WHERE t.tiliasiakas->osoite..kaupunki = Nokia AND t.saldo > 1000000; (Object Services and Consulting Inc.: 8.) Esimerkissä haetaan ensin tiliasiakas-sarakkeen arvo eli REF(asiakas_t)-tyypin ilmentymä riviltä, jonka tyyppi on tili_t. Tiliasiakas-sarakeen arvo on viittaus asiakas-tauluun. Haetaan siis asiakas-taulusta se nimi-sarakeen arvo, johon tiliasiakas-sarakkeen arvo viittaa. (Object Services and Consulting Inc.: 8.) 3.4 Erottelutyyppi Erottelutyypillä (distinct type) voidaan määritellä kaksi muuten yhtenevää tietotyyppiä erillisiksi tietotyypeiksi (Schek 2001: 15). Esimerkiksi: CREATE DISTINCT TYPE kruunu AS DECIMAL(9, 2) CREATE DISTINCT TYPE euro AS DECIMAL(9, 2) CREATE TABLE ruotsi-pankki (tilinro INTEGER, saldo (kruunu), CREATE TABLE suomi-pankki (tilinro INTEGER, saldo (euro), SELECT r.tilinro, r.saldo FROM ruotsi-pankki r, suomi-pankki s WHERE r.saldo >:saldo; Yritys verrata tyyppien euro ja kruunu ilmentymiä tuottaa nyt virheilmoituksen, vaikka saldojen esitysmuodot ovat samat (Schek 2001: 15). Erottelutyyppi on aina lopullinen tyyppi (FINAL) (ks. 2.5 Perintä) (Ki-Joon Han, Subtyping and Inheritance 1/2). 3.5 Kokoelmatyyppi SQL-standardiin jäi lopulta useista ehdokkaista vain yksi kokoelmatyyppi eli ARRAY. Se vastaa ohjelmointikielen taulukkorakennetta. ARRAY-tyypin alkioihin viitataan asettamalla hakasulkujen sisään alkion indeksinumero. (Reye: 11.) 9

Esimerkissä osa työntekijätyypin tyyppimäärittelystä: lapset VARCHAR(30) ARRAY[10] INSERT into työntekijä VALUES (, ARRAY[ Minna, Liisa ], ) SELECT * from työntekijä where lapset [2] = Liisa ; Kokoelmatyypissä ei voi esiintyä viittaustyyppiä eikä nimettyä rivityyppiä, jossa on viittaustyyppikenttä. (Object Services and Consulting Inc.: 10.) 3.6 Suuret oliot SQL3:ssa on tuki suurille olioille. Suuria olioita ovat BLOB (Binary Large Object) ja CLOB (Character Large Object), joiden perustana on yksinkertaistetumpi tietotyyppi LOB (Large Object), josta on karsittu pois joitakin operaatioita. Suuria tietotyyppijä käytetään erityisesti multimedia tietokannoissa, joihin talletetaan videoleikkeita, kuvia, ääntä ja suuria tekstidokumentteja. (Lausen Vossen: 145.) Suurille tietotyypeille on omia sisäänrakennettuja funktioita (Ki-Joon Han, LOB Functions), mutta yleisesti niiden käyttö on rajoitetumpaa kuin muiden tietotyyppien (Reye: 10). CREATE TABLE kirjat (nimi VARCHAR (30), ISBN VARCHAR(15), tiivistelmä CLOB(32K), teksti CLOB(20M), filmi BLOB(2G)); (Ki-Joon Han, Large Object Data Types.) 4 Kontrollirakenteet SQL:ä on kehitetty ohjelmointikielten suuntaan lisäämällä siihen kontrollirakenteita, kuten esimerkiksi valinta- ja toistorakenteet (CASE, IF) ja yhdistetyt lauseet. Uutena piirteinä SQL:ssä voi SET-komentolla arvo sijoittaa paikallisen muuttujan, sarakkeen tai UDT:n attribuutin arvoksi. (Object Services and Consulting Inc.: 12.) 10

CALL-kutsulla voidaan kutsua SQL:n ulkopuolista proseduuria. Ulkopuolisen rutiinin ohjelmointikielen voi määritellä LANGUAGE-määreellä ja sen sijainnin voi antaa suoraan. CAST-määreellä voidaan suorittaa tyyppikonversioita esimerkiksi desimaalimuotoisen numeron vai välittää rutiinille liukulukumuotoisena. (Ki-Joon Han, Exterlan Routines 1/2-2/2.) 4.1 Yhdistetyt lauseet Yhdistettyihin lauseisiin voi kerätä joukon SQL-lauseita yhteen lohkoon. Lauseet suoritetaan kokonaisuutena. Yhdistetty lause alkaa sanalla BEGIN ja päättyy sanaan END. Suoritettavat SQL-lauseet sijoitetaan niiden väliin. (Gallaher 1992: 9.) 4.2 Valinta- ja toistorakenteet IF, THEN, ELSIF rakenteella ja CASE rakenteella voidaan ohjelmointikielten tapaan valita ehdoista riippuen suoritettavat lauseet. WHILE, LOOP, FOR ja REPEAT komennot mahdollistavat silmukkarakenteen. (Object Services and Consulting Inc.: 12.) 4.3 SQL komentojen suoritus INSERT, DELETE ja UPDATE komentojen suoritukselle oliomäärittelyjen mahdollisuus on asettanut uusia eheysmäärityksiä mm. Jos rivi listään alitauluun, sama rivi on lisättävä kaikkiin alitaulun ylitauluihin tai vastaavasti, jos alitaulun sarakeen arvoa muutetaan, se on muutettava myös ylitaulujen riveille. Jos ylitaulun saraketta muutetaan, kaikkiin sen alitauluihin saman sarakkeen arvo on päivitettävä. (Lausen Vossen: 149.) ALTER-komentoa voi soveltaa myös olioihin. ALTER-komentolla voi lisätä, muuttaa tai poistaa sarakkeita, ylitauluja, rajoitteita ja tietotyyppejä. (Object Services and Consulting Inc.: 12.) 5 Yhteenveto SQL:ään on lisätty suuri määrä uusia piirteitä, joilla mahdollistetaan oliomallinen tietojenkäsittely SQL:llä. Uudet ominaisuudet vastaavat paljolti olio-ohjelmointikielten tapaa kuvata oliot eikä ainakaan perusasiat ole siinä mielessä ajatuksina uusia. Haasteen voisi kuvitella koskevan enemmän tietokantaohjelmistojen toimittajia. 11

Lähteet: Gallaher 1992 Leonard, J.: Object SQL: Language Extensions for Object Data Management, National Institute of Standards and Technology, England, 1992. Luettu: 22.01.2003. http://sunsite.doc.ic.ac.uk/public/pub/packages/dbperl/refinfo/sql3/sql3overview.txt Ki-Joon Han: SQL3 Standardization, Kok-Kuk University, Korea. Luettu: 22.01.2003. http://db.konkuk.ac.kr/present/sql3.pdf Lausen, Georg Vossen Gottfried: Models and Languages of Object Oriented Databases. Addison-Wesley, Harlow, England, 1998. Object Services and Consulting Inc.: Sql3 Object Model. Luettu: 22.01.2003. www.objs.com/x3h7/sql3.htm Reye, Jim: SQL 99 What s new? Australia. Luettu 17.02.3003. http://sky.fit.qut.edu.au/~reye/sql99.ppt Schek, H.-J., Informationssysteme Kernfach luennon kalvomateriaali, Eidgenössische Technische Hochschule, Zürich, 2001. Luettu: 22.01.2003. http://www.dbs.ethz.ch/~isk/ws_01/folien/ordbms.pdf