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 (use defined data type). Käyttäjän määrittelemä tietotyyppi sisältää tietotyypin attribuuttien ja metodien määrittelyn, jotka vastaavat ajatuksena olion määrittelyä. 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ä. Sille on annettava nimi ja siitä voi luoda tietotyypin. Rivityyppi voi olla myös viittaustyyppi, jonka arvona on osoitin (pointer) toiseen tietotyyppiin. Yhdistelmätyyppi tarjoaa vastineen ohjelmointikielten taulukkorakenteille. Yhdistelmätyyppi voi olla SET, LIST tai ARRAY. SET on tietojoukko, johon voi soveltaa joukko-operaatioita. LIST sisältää järjestetyn listan ja ARRAYtietotyyppi taulukkorakenteen. Yhdistelmätyyppiin viitataan SQL:ssä kuin se olisi oma taulu. 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 tukee moniperintää sallimalla alityypille useamman kuin yhden ylityypin ja ylityypille useamman kuin yhden alityypin. 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 rutiinien toteuttamiseksi.
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... 5 3.1 Rivityyppi...6 3.2 Nimetty rivityyppi...7 3.3 Viittaustyyppi...7 3.4 Erottelutyyppi...8 3.5 Parametrisoitu tyyppi...8 3.6 Kokoelmatyyppi...8 3.7 Suuret oliot...9 4 Kontrollirakenteet... 9 4.1 Yhdistetyt lauseet...10 4.2 Valinta- ja toistorakenteet...10 4.3 SQL komentojen suoritus...10 5 Yhteenveto... 10
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, s. 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 yhdistelmätyyppi, tyyppikonstruktorit, erilaiset rutiinit, olioidentiteetti, tiedon kapselointi, yleistys ja erikoistaminen tyyppihierarkiassa, perintä ja moniperintä. 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, s. 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 [<OID määrittely>] [<alityyppi määrittely>] [<attribuutit>] [NOT FINAL] [<rutiinit>] (Gallaher, s. 2, Schek, s. 7) 1
Tyypille määritellään nimi, attribuutit ja metodit. OID-, 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 määrittely voi olla esimerkiksi: nimi VARCHAR(30). Attribuutin tyypiksi voidaan määritellä myös toinen tietotyyppi esim. osoite (osoitetyyppi), jolloin osoite on aikaisemmin määritelty tietotyyppi. (Schek, s. 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., s. 7, 10.) Jokaisella talletetulla attribuutilla on vähintään observer (tarkkaaja) ja mutator (muuttaja) toiminnot, joilla voidaan alustaa, lukea ja päivittää attribuutin arvoja. Esimerkiksi edellä määritellylle attribuutille osoite määritellään automaattisesti observer: FUNKTION osoite(osoitetyyppi) RETURNS VARCHAR(30) ja mutator: FUNKTION osoite(osoitetyyppi, VARCHAR(30) RETURNS osoitetyyppi. (Schek, s. 9, 12.) Tyyppiin liittyvät rutiinit ovat operaatioita ja metodeja. 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, s. 10.) Operaatiolla käsitetään EQUALS tai LESS THAN lauseet. EQUALS-määrellä voi määritellä, milloin kaksi olion esiintymää ovat samat. LESS THAN määrettä käytetään järjestämään olion esiintymät tiettyyn järjestykseen, jos tätä operaatiota ei määrittele, olion esiintymiä ei voi järjestää. (Gallaher, s. 3.) 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., s. 3.) Tietokantataulu perustuu tyyppeihin ja ne luodaan CREATE-komentolla: CREATE TABLE henkilokunta OF henkilotyyppi ja olioiden esiintymät talletetaan tauluun riveinä. (Schek, s. 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, s. 4.) OID-määrittelyllä (ks. 2.1 Käyttäjän määrittelemä tietotyyppi) määritellään generoidaanko oliolle tunniste ja voidaanko olioon viitata isäntäohjelmointikielessä suoraan tällä tunnisteella vai onko tunniste vain tietokannan sisäiseen käyttöön (Gallaher, s. 2). 2
SQL:ssä ei ole mahdollisuutta tallettaa tietotyypin esiintymät 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., s. 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, s. 3.) 2.4 Rutiinit 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, s. 5.) 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, s. 17.) Rutiineja ovat metodit eli funktiot ja proseduurit, jotka voidaan määritellä UDT:n sisäisiksi, ulkopuolisiksi tai jopa SQL:n ulkopuolisiksi. Ne eroavat kutsutavaltaan ja parametrin välitykseltään (Ki-Joon Han, SQL99 Foundation Overview 6/7). 3
Rutiinilla on aina nimi ja toimintalohko. Funktiolle voi välittää syöttöparametrin 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.) Funktion tai metodin kutsu on SELECT-lause, kun proseduuria kutsutaan CALL-komennolla (Lausen Vossen, s. 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, s. 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, s. 6.) Tietotyypillä voi olla useampi alityyppi ja useampi ylityyppi. Tämä tarkoittaa samalla, että SQL tukee moniperintää. Lisäksi mahdollista määritellä alityyppiperhe, jolla voi olla vain yksi ylityyppi. Tietotyyppi ei voi olla itsenä ylityyppi. (Gallaher, s. 6.) SQL tyyppihierarkia vaatii, että jokainen alityypin esiintymä on myös sen ylityypin esiintymä; alityyppi koostuu kaikista sen ylityypeistä. (Schek, s. 19.) Jokaiseen esiintymään liitetään käsite most spesific type eli määrätyin tyyppi. Esiintymällä on aina joku määrätyin tyyppi. Sen ei kuitenkaan tarvitse olla tyyppihierarkian alin alityyppi. Esimerkiksi henkilö-tyypillä voi olla alityypit opiskelija ja työntekijä. Opiskelija on voitu jakaa vielä alityyppeihin perusopiskelija ja jatko-opiskelija. Tietyn esiintymän määrätyin tyyppi voi kuitenkin olla opiskelijatyyppi eikä sen tarvitse olla perus- tai jatko-opiskelijatyyppi. (Object Services and Consulting Inc., s. 9.) Edellisen esimerkkiin lisäten esimerkkinä moniperinnästä voi olla opiskelija-työntekijätyyppi, joka on sekä opiskelija että työntekijän alityyppi ja mallintaa tilannetta, jossa opiskelija on samalla myös työntekijä. (Gallaher, s. 7.) 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, 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., s. 9). 4
2.6 Kuormitus Rutiinin kuormituksella (overloading) tarkoitetaan mahdollisuutta nimetä useampi rutiini samannimiseksi. Moniperinnän seurauksena alityyppi on saattanut periä ylityypeiltään samannimisiä rutiineita tai rutiineja voi tarkoituksella nimetä samannimisiksi. (Object Services and Consulting Inc., s. 5.) Ajon aikana valitaan rutiineista se, jonka parametrien tyypitys sopii parhaiten kutsuvan rutiinin parametrien tyypitykseen, ellei rutiinissa ole suoraan määritelty, 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ää takaamaan mm. tietokannan eheyden. (Object Services and Consulting Inc., s. 5.) Liipaisimeen toiminnaksi voi määrittää minkä tahansa SQL-komennon tai komentojoukon, jossa voi olla myös valintarakenteita (ks. 4 Kontrollirakenteet) ja vapaaehtoisesti ehdon, joka käynnistää liipaisimen toiminnan. Liipaisimen voi määritellä tapahtumaan ennen tai jälkeen ehdon toteutumisen. (Ki-Joon Han, SQL99 Foundation Overview 2/7.) 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, s. 5). Seuraavassa esimerkki tyyppimäärittelystä: 5
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 FUNCTION työskennellyt (p työntekijä_t) RETUNRS INTEGER <koodi, joka laskee työskentelyajan pituuden>, PUBLIC FUNCTION työskennellyt (p työntekijä_t, p pvm) RETURNS työntekijä_t <koodi, jolla päivitetään työskentelyaikaa> PUBLIC FUNCTION palkka (p, työntekijä_t) RETURNS DECIMAL <koodi, jolla lasketaan palkka> (Object Services and Consulting Inc., s. 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., s. 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))); Attribuutteihin viitataan käyttäen ns. pistenotaatiota (dot notation) esim. tyyppi.attribuutti tai tyyppi.rivityyppi.attribuutti, jne. (Schek, s. 11). 6
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); 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., s. 7.) Esimerkissä mainittu asiakas_t viittaustyyppi voi viitata mihin tahansa riviin, jossa on tyyppi asiakas_t (Object Serveces and Consulting Inc., s. 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., s. 8.) Taulumäärittelyssä SCOPE-määre on pakollinen (Schek, s. 13). Viittauksissa voi käyttää myös polkuilmausta (path expression) -> (Object Services and Consulting Inc., s. 8). SELECT t.tiliasiakas->nimi FROM tili t WHERE t.tiliasiakas->osoite..kaupunki = Nokia AND t.saldo > 1000000; 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., s. 8.) 7
3.4 Erottelutyyppi Erottelutyypillä (distinct type) voidaan määritellä kaksi muuten yhtenevää tietotyyppiä erillisiksi tietotyypeiksi (Schek, s. 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 > s.saldo; Yritys verrata tyypien euro ja kruunu ilmentymiä tuottaa nyt virheilmoituksen, vaikka saldojen esitysmuodot ovat samat (Schek, s. 15). Erottelutyyppi on aina lopullinen tyyppi (FINAL) (ks. 2.5 Perintä) (Ki-Joon Han, Subtyping and Inheritance 1/2). 3.5 Parametrisoitu tyyppi TEMPLATE-määrellä voidaan määritellä ns. parametrityyppi (parametrized type) ja sen käyttö tarkoitus on generoida jokaiselle parametrin arvolle uusi tietotyyppi. Parametrisoitu tyyppi on viittaus tietotyyppi perheeseen eli parametrilistaan, jonka alkioiden arvot ovat tyypin esiintymiä. Parametrisoitu tyyppi määritellään kuten UDT. (Gallaher, s. 10.) 3.6 Kokoelmatyyppi Kokoelmatyyppien avulla voidaan taulukon sarakkeille antaa yksittäisten arvojen sijaan moniarvoisia tietorakenteita: joukkoja ja listoja. Kokoelmatyyppejä ovat SET(<tyyppi>), LIST(<typpi>) tai ARRAY<tyyppi>). (Schek, s. 9.) LIST-määreellä määritellään järjestetty jono. SET-määreellä joukko, johon voi soveltaa matemaattisia joukkooperaatioita kuten leikkaus, yhdiste ja komplementti. ARRAY-määrellä rajoitetun kokoinen taulukkorakenne ylä- ja alarajoineen. (Gallaher, s. 11.) Kokoelman tyyppi voi olla perustyyppi, UDT, rivityyppi tai toinen kokoelmatyyppi, esimerkiksi SET (INTEGER), SET(LIST(INTEGER)), SET(movie), SET(LIST(movie)), jossa movie on aikaisemmin määritelty UDT. 8
Kokoelmatyypissä ei sen sijaan voi esiintyä viittaustyyppiä eikä nimettyä rivityyppiä, jossa on viittaustyyppikenttä. (Object Services and Consulting Inc., s. 10.) Kokoelmatyypit eivät ole tietokantatauluja, vaikka kyselyjä varten niistä kuitenkin muodostetaan loogisesti sellaisia UNNEST-komennolla. Esimerkiksi työntekijä-tauluun on määritelty sarake toimenkuva LIST(VARCHAR(20)). Toimenkuva-sarakkeeseen ei voi viitata suoraan, vaan siihen viitataan kuin se olisi oma taulunsa (Schek, s. 26): SELECT t.nimi FROM tyontekija t WHERE tietokannat IN (SELECT * FROM UNNEST (t.toimenkuva); 3.7 Suuret oliot SQL3:ssa on tuki suurille olioille. LOB (Large Object), BLOB (Binary Large Object) ja CLOB (Character Large Object) määreitä tarvitaan erityisesti multimedia tietokannoissa, joihin talletetaan videoleikkeita, kuvia, ääntä ja suuria tekstidokumentteja. (Lausen Vossen, s. 145.) Suurille tietotyypeille on omia sisäänrakennettuja funktioita (Ki-Joon Han, LOB Funktions). 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., s.12.) 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.) 9
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, s. 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., s 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, s. 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.:,s. 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. 10
Lähteet: Gallaher, Leonard, J.: Object SQL: Language Extensions for Object Data Management, National Institute of Standards and Technology, England, 1992. http://sunsite.doc.ic.ac.uk/public/pub/packages/dbperl/reinfo/sql3/sql3overview.txt Ki-Joon Han: SQL3 Standardization, Kok-Kuk University, Korea. 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. www.objs.com/x3h7/sql3.html Schek, H.-J., Informationssysteme Kernfach luennon kalvomateriaali, Eidgenössische Technische Hochschule, Zürich, 2001. http://www-dbs.inf.ethz.ch/~isk/ws_01/folien/ordbms.pdf