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