Presentasjon lastes. Vennligst vent

Presentasjon lastes. Vennligst vent

Datamodellering og databaser Else Lervik, oktober 2012 Forelesning 11, uke 44 Å programmere databasetjeneren – JavaDB.

Liknende presentasjoner


Presentasjon om: "Datamodellering og databaser Else Lervik, oktober 2012 Forelesning 11, uke 44 Å programmere databasetjeneren – JavaDB."— Utskrift av presentasjonen:

1 Datamodellering og databaser Else Lervik, oktober 2012 Forelesning 11, uke 44 Å programmere databasetjeneren – JavaDB Programkoden ligger i databasen: hva, hvorfor og hvordanside 2-5 Hallo til verden (eksempel)side 6 CallSpec’sside 7 CREATE PROCEDUREside 8-9 CREATE FUNCTIONside Å kalle prosedyrer og funksjonerside 12 Unntakshåndtering i JDBC-programmering (repetisjon)side Databaseprogrammering hos tjenerenside 15 Triggereside Ut- og inn/ut-parametre i prosedyrer, kall fra Java-programside 20 På fagets hjemmeside finner du URL’er som er benyttet ved utarbeidelse av denne forelesningen.

2 Datamodellering og databaser Else Lervik, oktober 2012 Forelesning 11, side 2 Programkoden ligger i databasen Vi bruker JavaDB som eksempel, men liknende muligheter fins også i andre dbms. Ofte proprietært språk eller C. Kan bruke Java og JDBC i JavaDB og Oracle. Databasen består av: tabeller med data views prosedyrer funksjoner triggere klientapplikasjon1 klientapplikasjon2 klientapplikasjon3 tjener- programmet mot databasen

3 Datamodellering og databaser Else Lervik, oktober 2012 Forelesning 11, side 3 Ulike typer programmer Lagrede prosedyrer og funksjoner –kalles eksplisitt –prosedyrer svarer til Java-metoder uten returtype (void) –funksjoner svarer til Java-metoder med returtype –ikke objektorientert bare klassemetoder behovet for ut- og inn/ut-argumenter kan oppstå Triggere –kan være prosedyre eller funksjon –kalles automatisk (”trigges”) når en hendelse inntreffer before statement before row (insert, update, delete) after row (insert, update, delete) after statement

4 Datamodellering og databaser Else Lervik, oktober 2012 Forelesning 11, side 4 Hvorfor lagre programkode i databasen? Økt ytelse –kort vei (ikke over nettverket) til databasetabellene Produktivitet –kompliserte prosedyrer, som for eksempel kontroll av fødselsnr eller KID-nr ligger lagret én plass

5 Datamodellering og databaser Else Lervik, oktober 2012 Forelesning 11, side 5 Hvordan lagre Java-kode i databasen? Databasen må på forhånd inneholde et ”skjema”, dvs tabeller Alt på denne siden som er i kursiv er eksempler og må tilpasses din situasjon Klassene som skal brukes må være offentlige med offentlige klassemetoder (public static...) Kompiler klassene Legg klassene i en jar-fil –jar cf TjenerEks.jar *.class Start opp databasen du vil legge koden i, f.eks. som en forbindelse i NetBeans Kjør følgende fra kommandolinjen, f.eks. i NetBeans –Installer jar-filen i databasen CALL SQLJ.INSTALL_JAR('D:/data/db/db11/tjenerprog/TjenerEks.jar', 'APP.test2', 0); Observer at det i databasekatalogen nå ligger en fil med navn (eksempel) jar/APP/test2.jar.G –Sett opp classpath for Derby slik at systemet finner java-klassene i den nevnte jar-filen CALL SYSCS_UTIL.SYSCS_SET_DATABASE_PROPERTY ('derby.database.classpath', 'APP.test2'); –Ofte (spesielt under utvikling) må jar-filen reinstalleres pga endringer, da brukes CALL SQLJ.REPLACE_JAR('D:/data/db12/tjenerprog/TjenerEks.jar', 'APP.test2'); –Jar-filen kan fjernes fra databasen slik: CALL SQLJ.REMOVE_JAR('test2', 0);

6 Datamodellering og databaser Else Lervik, oktober 2012 Forelesning 11, side 6 Hallo til verden fra databasesystemets indre Lag filen Hallo.java på vanlig måte: public class Hallo { public static String hallo() { return "Hallo til verden fra det indre av databasen"; } Kompiler filen og lag jar-fil Last opp klassen, se forrige side –CALL SQLJ.INSTALL_JAR(.... Publiserer Java-metoden med følgende setning –CREATE PROCEDURE hallo() LANGUAGE JAVA EXTERNAL NAME 'Hallo.hallo' PARAMETER STYLE JAVA; Så kan vi prøve prosedyren: –CALL hallo(); Prøv ut med parameter (hallo2()) (se programkode) –CALL hallo2(’Bjarne’); Prøv ut som funksjon (hallo3()) (se programkode) –VALUES hallo3(’Anne’); –SELECT hallo3(person.fornavn) FROM PERSON; Hallo.java, se eksempelsamlingen

7 Datamodellering og databaser Else Lervik, oktober 2012 Forelesning 11, side 7 CallSpec Java-metoder (kun public static metoder, klassemetoder) publiseres via CallSpec’s: –void-metoder: CREATE PROCEDURE –ikke-void-metoder: CREATE FUNCTION CallSpec-en er bindeleddet mellom SQL og Java Applikasjoner bruker navnet som er definert i CallSpec’en Ved kall slår kjøresystemet opp i datakatalogen og finner CallSpec’en Java-metoden utføres Kan laste opp nye utgaver av Java- klassene uten at CallSpec-scriptet behøver å kjøres på nytt

8 Datamodellering og databaser Else Lervik, oktober 2012 Forelesning 11, side 8 Syntaks CREATE PROCEDURE CREATE PROCEDURE procedure-Name ( [ ProcedureParameter [, ProcedureParameter] ] *) [ ProcedureElement ] * ProcedureParameter: [ { IN | OUT | INOUT } ] [ parameter-Name ] DataType ProcedureElement: { | [ DYNAMIC ] RESULT SETS INTEGER | LANGUAGE { JAVA } | EXTERNAL NAME string | PARAMETER STYLE JAVA | { NO SQL | MODIFIES SQL DATA | CONTAINS SQL | READS SQL DATA } } Alle datatyper i hht databasesyntaks (ikke Javasyntaks) dersom ingenting oppgis, gjelder IN fullstendig navn på Java-metoden dersom ingenting oppgis, gjelder MODIFIES SQL DATA obliga- torisk

9 Datamodellering og databaser Else Lervik, oktober 2012 Forelesning 11, side 9 Prosedyreeksempler CREATE PROCEDURE SALES.TOTAL_REVENUE( IN S_MONTH INTEGER, IN S_YEAR INTEGER, OUT TOTAL DECIMAL(10,2)) PARAMETER STYLE JAVA READS SQL DATA LANGUAGE JAVA EXTERNAL NAME 'com.acme.sales.calculateRevenueByMonth‘; CREATE PROCEDURE SEND_MAIL( TO_ADDRESS VARCHAR(320), SUBJECT VARCHAR(320), BODY VARCHAR(32000)) LANGUAGE JAVA PARAMETER STYLE JAVA NO SQL EXTERNAL NAME 'testing.MailTest.sendSMTP';

10 Datamodellering og databaser Else Lervik, oktober 2012 Forelesning 11, side 10 Syntaks CREATE FUNCTION CREATE FUNCTION function-name ( [ FunctionParameter [, FunctionParameter] ] * ) RETURNS DataType [ FunctionElement ] * FunctionParameter : [ parameter-Name ] DataType FunctionElement : { | LANGUAGE { JAVA } | EXTERNAL NAME string | PARAMETER STYLE JAVA | { NO SQL | CONTAINS SQL | READS SQL DATA } | { RETURNS NULL ON NULL INPUT | CALLED ON NULL INPUT } } fullstendig navn på Java-metoden dersom ingenting oppgis, gjelder READS SQL DATA obliga- torisk dersom ingenting oppgis, gjelder CALLED ON NULL INPUT funksjonen må selv teste på input-verdier som er null

11 Datamodellering og databaser Else Lervik, oktober 2012 Forelesning 11, side 11 Funksjonseksempler CREATE FUNCTION TO_DEGREES(RADIANS DOUBLE) RETURNS DOUBLE PARAMETER STYLE JAVA NO SQL LANGUAGE JAVA EXTERNAL NAME 'java.lang.Math.toDegrees' ; CREATE FUNCTION GETSYSTEMPROPERTY(NAME VARCHAR(128)) RETURNS VARCHAR(128) LANGUAGE JAVA EXTERNAL NAME 'java.lang.System.getProperty' PARAMETER STYLE JAVA NO SQL;

12 Datamodellering og databaser Else Lervik, oktober 2012 Forelesning 11, side 12 Litt mer syntaks Å kalle en prosedyre –CALL procedure-Name ( [ expression [, expression]* ] ) –Eksempel CALL hallo2(‘Ingrid’); Å kalle en funksjon –VALUES expression –Eksempel VALUES CURRENT_DATE; –Egendefinerte funksjoner kan også inngå i SELECT-setninger på samme måte som f.eks. AVG() og SUM() Å slette prosedyrer og funksjoner –DROP PROCEDURE procedure-name –DROP FUNCTION function-name

13 Før vi går videre med tjenerprogrammeringen, må vi repetere litt fra i vår – behov for unntakshåndtering i JDBC-programmering Forelesning 11, side 13

14 try-catch-finally-setningen, eksempel Syntaks –try { setninger } catch (parameter) { // mer spesifikke unntak foran mer generelle setninger } catch (parameter) { setninger …. } finally { // utføres alltid, også ved return (kun et unntak: System.exit()) (kan sløyfes) setninger } Programmering av unntakshåndtering i databasesammenheng –Skisser kode med fullstendig unntakshåndtering: DatabaseKontaktMedExc.java –Vis tilsv. kode der unntakshåndteringen er flyttet ut i en klasse DatabaseKontaktMedExc2.java Opprydder.java, programliste 24.3, side Forelesning 11, side 14

15 Datamodellering og databaser Else Lervik, oktober 2012 Forelesning 11, side 15 Databaseprogrammering hos tjeneren Ikke-nøstet forbindelse: –Prosedyren/funksjonen setter opp sin egen databaseforbindelse Nøstet forbindelse: –Behandler kun nøstet forbindelse idag –Også denne bør ”lukkes” for å rydde opp i buffere, etc. –Den bruker samme forbindelse som den kallende prosessen –Ofte naturlig (og nødvendig) å bruke samme transaksjonsrom som der prosedyren/funksjonen kalles fra –Connection forbindelse = DriverManager.getConnection("jdbc:default:connection:"); –Commit og rollback normalt ikke tillatt –autocommit er satt til false –Kan ikke endre data i tabellen som foreldresetningen bruker select..., funksjon() from tabell; her kan ikke funksjon() endre tabell. –Kan ikke slette tabellen som foreldresetningen bruker Vis Opprydder.java Vis eksempelFagStudent.sql Vis KarakterSnitt.java Lag og kjør funksjon Vis og kjør TestJava.java Se eksempelsamlingen.

16 Datamodellering og databaser Else Lervik, oktober 2012 Forelesning 11, side 16 Eksempler på triggere ansatt_s stilling lonnskode ekstern_s rolle student_s studiekull opptaksaar person_s pers_id {PK} etternavn fornavn tlf Trigger som skal forhindre at ansatt også er registrert som student og/eller ekstern. Gjennomgå og kjør person_s.sql PersonKontroll.java. Se eksempelsamlingen.

17 Datamodellering og databaser Else Lervik, oktober 2012 Forelesning 11, side 17 Triggere En databasetrigger er en prosedyre som knyttes direkte til en tabell i databasen Triggeren aktiviseres ved INSERT, UPDATE eller DELETE Triggertyper –BEFORE setning – kun én gang, før setningen utføres –BEFORE rad – før hver rad som settes inn, endres eller slettes –AFTER rad – etter hver rad som settes inn, endres eller slettes –AFTER setning – kun én gang, etter at setningen er utført Kan i koden referere til feltene som påvirkes – både de nye og de gamle For insert-setninger inneholder old-raden NULL-verdier For delete-setninger inneholder new-raden NULL-verdier

18 Datamodellering og databaser Else Lervik, oktober 2012 Forelesning 11, side 18 Syntaks CREATE TRIGGER CREATE TRIGGER TriggerName { AFTER | NO CASCADE BEFORE } { INSERT | DELETE | UPDATE [ OF column-Name [, column-Name]* ] } ON table-Name [ ReferencingClause ] [ FOR EACH { ROW | STATEMENT } ] [ MODE DB2SQL ] Triggered-SQL-statement ReferencingClause REFERENCING { { OLD | NEW } [ AS ] correlation-Name [ { OLD | NEW } [ AS ] correlation-Name ] | { OLD_TABLE | NEW_TABLE } [ AS ] Identifier [ { OLD_TABLE | NEW_TABLE } [AS] Identifier ] } mapper til et ResultSet med en rad (kan bare brukes av triggere knyttet til rader) mapper til et ResultSet med relevant størrelse (kan bare brukes av triggere knyttet til setninger) “transition variables” “transition tables”

19 Datamodellering og databaser Else Lervik, oktober 2012 Forelesning 11, side 19 Triggere, eksempler CREATE TRIGGER t1 NO CASCADE BEFORE UPDATE ON x FOR EACH ROW MODE DB2SQL values app.notify ('Jerry', 'Table x is about to be updated'); CREATE TRIGGER FLIGHTSDELETE AFTER DELETE ON FLIGHTS REFERENCING OLD_TABLE AS DELETEDFLIGHTS FOR EACH STATEMENT DELETE FROM FLIGHTAVAILABILITY WHERE FLIGHT_ID IN (SELECT FLIGHT_ID FROM DELETEDFLIGHTS); CREATE TRIGGER FLIGHTSDELETE3 AFTER DELETE ON FLIGHTS REFERENCING OLD AS OLD FOR EACH ROW DELETE FROM FLIGHTAVAILABILITY WHERE FLIGHT_ID = OLD.FLIGHT_ID;

20 Datamodellering og databaser Else Lervik, oktober 2012 Forelesning 11, side 20 Ut- og inn/ut-parametre i prosedyrer Lagrede prosedyrer (og funksjoner) kan ha tre typer parametre –inn-parametre – kjent fra Java –ut-parametre – ukjent i Java –inn/ut-parametre – ukjent i Java De to siste typene er en følge av at vi ikke programmerer objektorientert. I oo-programmer holder objektet dataene, i et ikke-oo- miljø må vi sende dem ut og inn til prosedyrene. Bruker Java-tabeller med lengde 1 for å få til ut- og inn/ut-parametre JDBC-interface CallableStatement –brukes til å kalle lagrede prosedyrer –inn-argumenter gis verdi via set-metoder arvet fra PreparedStatement –ut-argumenter må registreres med datatype før kallet –verdiene til ut-argumentene hentes ut via egne get-metoder Vis og kjør ParameterTester.java.


Laste ned ppt "Datamodellering og databaser Else Lervik, oktober 2012 Forelesning 11, uke 44 Å programmere databasetjeneren – JavaDB."

Liknende presentasjoner


Annonser fra Google