Helsingin yliopisto, TKTL Tietokantojen perusteet, k 2000 Tietokantaohjelmointi 23.2.2000. Harri Laine 1. SQL:n käyttö ohjelmissa



Samankaltaiset tiedostot
EXEC SQL BEGIN DECLARE SECTION

SQL - Tietokannan ylläpito. SQL - Tietokannan ylläpito. SQL - Tietokannan ylläpito. SQL - Tietokannan ylläpito. SQL - Tietokannan ylläpito

RDBMS - Yhteyskäytännöt

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

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

Java ja tietokannan käsittely (JDBC)

6 WWW-tietokantasovellukset Relaatiotietokannan suunnittelusta 134

Tehtävä 1. Tietojen lisääminen, poistaminen, päivittäminen ja tulostaminen

käännös käännösvaiheessa tarkasettaan linkitys

Tietokannat II -kurssin harjoitustyö

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

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

Listarakenne (ArrayList-luokka)

Sovellusarkkitehtuurit

Ohjelmoinnin jatkokurssi, kurssikoe

Ohjelmassa henkilön etunimi ja sukunimi luetaan kahteen muuttujaan seuraavasti:

Ohjelmistojen mallintamisen ja tietokantojen perusteiden yhteys

8. Näppäimistöltä lukeminen 8.1

Sovellusarkkitehtuurit

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

Olion elinikä. Olion luominen. Olion tuhoutuminen. Olion tuhoutuminen. Kissa rontti = null; rontti = new Kissa();

Sisältö. Johdanto. Tiedostojen lukeminen. Tiedostojen kirjoittaminen. 6.2

Java-kielen perusteet

8. Näppäimistöltä lukeminen 8.1

Rajapinta (interface)

Sisällys. 12. Näppäimistöltä lukeminen. Yleistä. Yleistä

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

Java-kielen perusteet

Ohjelmoinnin perusteet Y Python

Vertailulauseet. Ehtolausekkeet. Vertailulauseet. Vertailulauseet. if-lauseke. if-lauseke. Javan perusteet 2004

Sisältö. Johdanto. Tiedostojen lukeminen. Tiedostojen kirjoittaminen. 6.2

1 Tehtävän kuvaus ja analysointi

12. Näppäimistöltä lukeminen 12.1

Microsoft Visual Studio 2005

Sisältö Johdanto. Tiedostojen lukeminen. Tiedostojen kirjoittaminen. 26.2

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

Sisällys. 14. Poikkeukset. Johdanto. Johdanto

Mikä yhteyssuhde on?

20. Javan omat luokat 20.1

Sisällys. 20. Javan omat luokat. Java API. Pakkaukset. java\lang

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

Pedacode Pikaopas. Tietokantaa hyödyntävän sovelluksen luominen

16. Javan omat luokat 16.1

1. Omat operaatiot 1.1

7. Näytölle tulostaminen 7.1

4. Luokan testaus ja käyttö olion kautta 4.1

Ohjelmoinnin perusteet Y Python

Opintojakso TT00AA11 Ohjelmoinnin jatko (Java): 3 op. Poikkeukset ja tietovirrat: Virhetilanteiden ja syötevirtojen käsittely

Sisällys. 14. Poikkeukset. Johdanto. Johdanto

14. Poikkeukset 14.1

17. Javan omat luokat 17.1

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

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

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

14. Poikkeukset 14.1

Ohjelmointi 2 / 2008 Välikoe / Pöytätestaa seuraava ohjelma.

Rinnakkaisohjelmointi kurssi. Opintopiiri työskentelyn raportti

7. Oliot ja viitteet 7.1

Yhteenvetofunktiot Näkymät Tietokannan ylläpito Tietokantatapahtumat... 88

Ohjelmointi 2 / 2010 Välikoe / 26.3

Java-kielen perusteita

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

Metodien tekeminen Javalla

Sisällys. 7. Oliot ja viitteet. Olion luominen. Olio Java-kielessä

5. HelloWorld-ohjelma 5.1

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

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

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

Oliosuunnitteluesimerkki: Yrityksen palkanlaskentajärjestelmä

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

A) on käytännöllinen ohjelmointitekniikka. = laajennetaan aikaisemmin tehtyjä luokkia (uudelleenkäytettävyys)

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

812341A Olio-ohjelmointi Peruskäsitteet jatkoa

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

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

Java-kielen perusteita

Ohjelmointikielet ja -paradigmat 5op. Markus Norrena

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

Informaatioteknologian laitos Olio-ohjelmoinnin perusteet / Salo

Makrojen mystinen maailma lyhyt oppimäärä

Ohjelmoinnin perusteet, kurssikoe

Interaktiivisten järjestelmien arkkitehtuuriratkaisu, jolla käyttöliittymä erotetaan sovelluslogiikasta.

Kompositio. Mikä komposition on? Kompositio vs. yhteyssuhde Kompositio Javalla Konstruktorit set-ja get-metodit tostring-metodi Pääohjelma

Tehtävä 1. Tehtävä 2. Arvosteluperusteet Koherentti selitys Koherentti esimerkki

Luokka Murtoluku uudelleen. Kirjoitetaan luokka Murtoluku uudelleen niin, että murtolukujen sieventäminen on mahdollista.

Rinnakkaisohjelmointi, Syksy 2006

Ohjelmointi 1 / 2009 syksy Tentti / 18.12

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

Tietojen syöttäminen ohjelmalle. Tietojen syöttäminen ohjelmalle Scanner-luokan avulla

CSE-A1200 Tietokannat

Java-kielen perusteet

Olio-ohjelmointi Javalla

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

CS-A1150 Tietokannat

Luokan sisällä on lista

SELECT-lauseen perusmuoto

HOJ Haja-aiheita. Ville Leppänen. HOJ, c Ville Leppänen, IT, Turun yliopisto, 2012 p.1/10

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

Ohjelmoinnin perusteet Y Python

13. Loogiset operaatiot 13.1

Transkriptio:

SQL:n käyttö ohjelmissa Tietokannan käyttö ohjelmasta Miksi vuorovaikutteinen käyttö ei riitä? kielen hallinta: maallikot? yhdistetään yleiskielen ja tietokantakielen edut, mm.» monimutkaisempi laskenta» tuloksen muotoilu, näytön hallinta SQL: kohteena joukot (taulut) Pascal, Java (ym.): tietue, tietoalkio tms. kerrallaan Tietokannan ohjelmakäytön vaihtoehdot: Sulautettu SQL (embedded SQL) Ohjelmointirajapinnan (API) kautta tapahtuva käyttö Erityinen tietokantaohjelmointikieli Informaatiojärjestelmät Harri Laine 1 Informaatiojärjestelmät Harri Laine 2 Sulautettu SQL Sulautettu SQL SQL-lauseet kirjoitetaan ohjelmoitikielen lauseiden joukoon erityisesti merkittyinä siten, että esikääntäjä ( SQL pre-compiler) osaa tunnistaa ne ja muuntaa ne kirjastooperaatioiden kutsuiksi Esikääntäjän tulostiedosto käännetään sitten normaalikääntäjällä 2 vaiheinen käännös esikääntäjiä muutamille kielille Eristetyt SQLlauseet ohjelmointikielen lauseiden lomassa (esim C+SQL) käännetty ohjelma normaali kääntäjä esikääntäjä Aliohjelmakirjasto Normaali ohjelmointikieli+ kirjastofunktioiden parametreiksi upotetut SQL-lauseet Informaatiojärjestelmät Harri Laine 3 Informaatiojärjestelmät Harri Laine 4 Sulautettu SQL - näyttää tältä function keskipalkka(dept:integer):real; var integer n; integer psumma; #include SQLCA.INC EXEC SQL BEGIN DECLARE SECTION var palkka: integer; os: integer; EXEC SQL END DECLARE SECTION Informaatiojärjestelmät Harri Laine 5 begin EXEC SQL DECLARE pal CURSOR FOR SELECT salary from employee where department= :os; n:=0; psumma:=0; os:= dept; EXEC SQL open pal; EXEC SQL fetch pal into :palkka; while sqlcode = 0 do begin psumma := psumma + palkka; n := n + 1; EXEC SQL fetch pal into :palkka; end; EXEC SQL close pal; if n > 0 then keskipalkka := psumma/n else keskipalkka := 0; end;. Informaatiojärjestelmät Harri Laine 6 Harri Laine 1

Sulautettu SQL -käsitteitä Sulautettu SQL -käsitteitä Kursori Kyselyn tulosjoukon läpikäyntiin käytettävä rakenne määritellään (declare) avataan (open) = kysely suoritetaan sen hetkisillä muuttuja-arvoilla haetaan rivi (fetch) = edetään tulosrivijoukossa + siirretään vuorossaolevan rivin data ohjelmamuuttujiin suljetaan (close) Jokaisen tietokantaoperaation jälkeen on tutkittava onnistuiko operaatio sqlstate ja vanhemman standardin mukaisesti sqlcode muuttujat palauttavat virhekoodin (sqlcode=0, jos kaikki OK, erilaisia virhekoodeja - arvot järjestelmäkohtaisia) Informaatiojärjestelmät Harri Laine 7 Informaatiojärjestelmät Harri Laine 8 Käyttö ohjelmointirajapinnan kautta Ohjelmointirajapinnan (API) kautta tapahtuva käyttö perustuu rajapinnan toteuttavan kirjaston käyttöön Toimittajakohtaiset kirjastot Native API esim OracleCLI = Oracle Call Level Interface Toimittajariippumattomat kirjastot esim ODBC (Microsoft Open Database Connection), JDBC Java liittymäkirjasto Käyttö ohjelmointirajapinnan kautta Toimittajariippumaton kirjasto saattaa kuitenkin vaatia tkhj-kohtaisen ajurin toimiakseen tietyn tkhj:n kanssa ODBC on yleisimmin käytetty liittymäkirjasto Kaikilla merkittävillä toimittajilla on tarjolla tkhjkohtaiset ODBC-ajurit. JDBC:n perusideat samoja kuin ODBC:n Osa ODBC:n detaljeista piilotettu tietokannankäsittelyluokkien sisään, joten käyttö on hieman yksinkertaisempaa. Informaatiojärjestelmät Harri Laine 9 Informaatiojärjestelmät Harri Laine 10 Aika hyvä esitys löytyy kirjasta: Hamilton g., Cattell R, Fisher M.: JDBC Database Access with Java - A tutorial and Annodated Reference, Addison-Wesley, 1997 Kirjan esimerkit löytyvät pakattuna osoitteesta http://www.javasoft.com/products//book.html ja purettuna Informaaatiojärjestelmät/k99 -kurssin kotisivun kautta Java tietokantakytkentä (JDBC) perustuu muutamaan keskeiseen luokkaan: DriverManager tämän luokan palvelujen avulla otetaan käyttöön välttämätön tkhj-kohtainen ajuri (erillinen toimittajalta saatava kirjasto) ja muodostetaan yhteys tietokantaan. Esim: DriverManager.registerdriver( new oracle..driver.oracledriver()); ottaa käyttöön oracle thin-ajurin Oracle-kantaa varten Informaatiojärjestelmät Harri Laine 11 Informaatiojärjestelmät Harri Laine 12 Harri Laine 2

Connection tietokantayhteys - tietokantaistunto yhteys ohjelman ja tietokannan välillä peruspalvelut tietokantatapahtumien käsittelyyn ja tietokantaoperaatioiden muodostukseen kaikki käsittely perustuu yhteyden olemassaoloon ja tapahtuu sen kautta yhteys tulisi lopettaa close operaatiolla kun sitä ei enää tarvita - vapauttaa resursseja DriverManager luo yhteyden Connection con = DriverManager.getConnection( :oracle:thin:@kontti.helsinki.fi:1521:tktl, info, expert ); Luo yhteyden oracle thin ajuria käyttäen portin 1521 kautta koneessa kontti.helsinki.fi olevaan ttstnimiseen tietokantaan käyttäen käyttäjätunnusta info ja salasanaa expert. Informaatiojärjestelmät Harri Laine 13 Informaatiojärjestelmät Harri Laine 14 Statement Mekamismi operaatioiden välittämiseen tietokannanhallintajärjestelmälle ja vastausten palauttamiseen takaisin ohjelmalle palveluja mm. executequery executeupdate Tietokantayhteys luo Statement olion ResultSet Kyselyn vastaukset ja niiden käsittely Statement.executeQuery luo ResultSet olion Operaatiolle annetaan kysely merkkijonoparametrina Statement stmt= con.createstatement(); ResultSet rs= stmt.executequery( select nimi, osoite, palkka from henkilo ); Informaatiojärjestelmät Harri Laine 15 Informaatiojärjestelmät Harri Laine 16 Vastauksen käsittely ResultSet:n metodeilla Totuusarvofunktio next() aktivoi vastauksen seuraavan rivin. Funktio saa arvokseen true, jos tällainen rivi on olemassa. Ensimmäisellä kutsukerralla aktivoituu ensimmäinen rivi. Huom. next -funktiolla vastausta voi käydä läpi vain yhteen suuntaan. Muita läpikäyntitapoja ei ole (näin versiossa 1.0) Tiedon saamiseksi aktivoidulta vastausriviltä ohjelman käyttöön on tarjolla tietotyyppikohtaiset hakufunktiot gettyyppi esim. getstring, getboolean, getint, getdate,. Näille funktioille annetaan parametrina joko sarakkeen nimi tai sarakkeen järjestysnumero esim: String a= rs.getstring( osoite ); // sarake osoite Int p= rs.getint(3); // kolmas sarake Informaatiojärjestelmät Harri Laine 17 Informaatiojärjestelmät Harri Laine 18 Harri Laine 3

Hakufunktiot kykenevät tekemään joitakin tietotyyppikonversioita, esim. merkkijonosta kokonaisluvuksi (jos kyseessä on kokonaisluku) tai päinvastoin. - Ellei konversio onnistu, aiheutetaan SQLException poikkeus - Sama poikkeus aiheutetaan myös muissa virhetilanteissa Tyhjäarvon testaamista varten on totuusarvoinen funktio wasnull. Tämä on parametroitu kuten getfunktiot. Statement stmt= con.createstatement(); ResultSet rs= stmt.executequery( select nimi, osoite, palkka from henkilo + order by nimi ); while (rs.next()) { System.out.println(rs.getString(1) +, + rs.getstring(2)+, +rs.getstring(3)); tulostaa muotoa : Lahtinen Kalle, Katu 6, 12000 Mäki Manu, Kuja5, 20000 Informaatiojärjestelmät Harri Laine 19 Informaatiojärjestelmät Harri Laine 20 Tietokannan sisältöä tai rakennetta muuttavat sql-operaatiot, jotka eivät tuota vastausta suoritetaan Statement.executeUpdateoperaatiolla. esim. stmt.executeupdate( update henkilo + set palkka= palkka + 1000000 + where nimi= Laine Harri ); Informaatiojärjestelmät Harri Laine 21 Parametroidut operaatiot: Edellä on käsitelty yksinkertaisia tapauksia, joissa operaatio annetaan sellaisenaan suoritusfunktion parametrina. Usein kuitenkin samaa operaatiorunkoa käytetään uudelleen, mutta siten, että parametriarvot muuttuvat - esim. käyttäjältä kysytään henkilön nimi ja sitten kannasta haetaan tiedot tämän perusteella Tähän tarkoitukseen on tarjolla parametroitu operaatio PreparedStatement (Statement luokan aliluokka) Informaatiojärjestelmät Harri Laine 22 PreparedStatement pst = con.preparestatement( select nimi,osoite,palkka + from henkilo + where nimi like? ); parametri osoitetaan kysymysmerkillä Parametrin arvon asetukseen on käytössä tietotyyppikohtaiset asetusmetodit settyyppi (getfunktioita vastaten) Asetusmetodilla on kaksi parametria: SQL-operaation parametrin (kysymysmerkin) järjestysnumero ja tilalle tuleva arvo esim. pst.setstring(1, Möttö% ); Informaatiojärjestelmät Harri Laine 23 Myös ns. dynaamisen SQL:n käyttö on mahdollista. Tällöin ohjelmoija ei esimerkiksi tiedä minkä tyyppisiä ja kuinka monta saraketta kyselystä tulee vastaukseksi. Asian selvittämiseksi voidaan vastausjoukolta kysyä ns. metatietoa ja käyttää sitä sitten apuna vastauksen purkamisessa. ResultSetMetadata Informaatiojärjestelmät Harri Laine 24 Harri Laine 4

JDBC: registerdriver DriverManager external driver getconnection Connection createstatement preparestatement setxxxx Statement PreparedStatement executequery next ResultSet getyyyy Informaatiojärjestelmät Harri Laine 25 // Esimerkkiohjelma - Informaatiojärjestelmät // Solid tietokannan käyttö // HY/TKTL:n Linux ympäristössä tarvitaan CLASSPATH:iin // "/opt/solid/lib/soliddriver.zip", ajurin löytämiseksi // Harri Laine 16.2.1999 import java.sql.*; import java.io.*; public class Esim1 { public static void main(string args[]) throws Exception { String url = ":solid://db.cs.helsinki.fi:1414"; // Tämä url identifioi esimerkkitietokannan, joka toimii koneessa // db.cs.helsinki.fi Connection con; String query = "select KOODI, KURSSI.NIMI AS KNI, OPINTOVIIKOT, "+ "OPETTAJA.NIMI AS OPNI " + "from KURSSI, OPETTAJA " + "where KURSSI.LUENNOIJA= OPETTAJA.OPETUNNUS " + "order by OPETTAJA.NIMI, KURSSI.NIMI"; // Kysely kohdistuu laskuharjoituksissa käytettyyn kantaan Statement stmt; Informaatiojärjestelmät Harri Laine 26 try { DriverManager.registerDriver( (Driver) Class.forName("solid..SolidDriver").newInstance()); catch(java.lang.classnotfoundexception e) { // Ilmoitetaan siitä, ettei yhteyttä saada aikaan. System.err.print("ClassNotFoundException: "); System.err.println(e.getMessage()); try { // Luodaan yhteys kurssin käyttäjätunnuksella con = DriverManager.getConnection(url, "info", "expert"); // Luodaan tietokantaoperaation suoritusympäristö stmt = con.createstatement(); // Muuttujaa ope käytetään pitämään kirjaa edellisestä // opettajasta. Tällä kontrolloidaan opettajan nimen // tulostusta. String ope =" "; // Tulostetaan otsake System.out.println("OPETUSTEHTÄVÄT:"); System.out.println(); // Suoritetaan kysely ResultSet rs = stmt.executequery(query); Informaatiojärjestelmät Harri Laine 27 // Käydään läpi vastausrivit while (rs.next()) { // Eristetään opettajan nimi, huom. alias-nimen käyttö String opn = rs.getstring("opni"); // Jos opettaja vaihtuu tulostetaan tyhjä rivi ja // opettajan nimi, muuten vain kurssin tiedot if (ope.equals(opn)) { System.out.println(" " + rs.getstring("kni")+ " (" + rs.getint("koodi")+")"); else { System.out.println(); ope= opn; System.out.println(ope); System.out.println(" " + rs.getstring("kni")+" ("+rs.getint("koodi")+")"); Informaatiojärjestelmät Harri Laine 28 // Suljetaan 'kursori' - vapautetan vastausjoukon käsittelyyn // kiinnitetyt resurssit. Tälle vastausjoukolle ei enää voi // tehdä mitään, vaikka sitä ei suljettaisikaan. stmt.close(); // Suljetaan tietokantayhteys. Yhteys suljetaan vasta siinä // vaiheessa kun ohjelmassa ei enää käsitellä kantaa. con.close(); catch(sqlexception ex) { // Imoitetaan virheestä System.err.print("SQLException: "); System.err.println(ex.getMessage()); Informaatiojärjestelmät Harri Laine 29 Harri Laine 5