Notater til Avancerede Databaser. Vidar Jon Bauge 2007

Størrelse: px
Starte visningen fra side:

Download "Notater til Avancerede Databaser. Vidar Jon Bauge 2007"

Transkript

1 Notater til Avancerede Databaser Vidar Jon Bauge 2007 Datamatikeruddannelsen forår 2007 Side 1 af 65

2 Indholdsfortegnelse Datamodellering med ER-diagrammer...5 Entiteter...6 Attributter...6 Entitetstyper og Entitets sæt...6 Nøgler...7 Domæner, eller værdisæt...7 Begrebsmæssig databasedesign...7 Relationer...7 Relations typer og relations sæt...7 En relations grad...7 Rollenavne og rekursive relationer...7 Relationer som attributter...8 Begrænsninger for relationer...8 Kardinalitet i binære relationer...8 Deltagelse og ekistensafhægighed...8 Strukturelle begrænsninger...8 Attributter til relationer...9 Constraints & høne/æg problemet...10 Integritet...10 Primære nøgler og fremmednøgler...10 Constraints...10 Oprettelse af constraints...10 Typer af Constraints - integritet og navngivning...11 Navngivning...12 Sletning og ændring af Constraints...12 Få vist constraints i Oracle...13 Høne & æg problemet...13 Opret tabeller i Oracle...14 Normalisering...15 Afhængighed...15 Anomalier...15 Normalformer Normalform Normalform Normalform...16 Afhængighedsdiagram...16 Normalisering af tabeller...17 Data visning, opdatering og sletning (DML)...19 INSERT...19 Operatorer der konverterer dato/tid...19 Afrunding...19 NULL værdier...19 Indsættelse ved hjælp af variabler...19 UPDATE...20 DELETE...20 Datamatikeruddannelsen forår 2007 Side 2 af 65

3 SELECT...20 Funktioner:...21 Funktioner og Grupperinger...22 Funktioner på enkle rækker...22 Funktioner på karakterer...22 Funktioner på tal...22 Funktioner på dato...23 Funktioner der konverterer data...23 Indlejring...23 Formater...23 Funktioner på grupper og aggregeringer...25 Joins...26 Hvorfor man bruger joins...26 Det kartesiske produkt...26 Forskellige former for joins...26 Equijoin...27 NonEquijoin...27 Outer join...27 Self join...28 Sub-queries...29 Single row subqueries...29 Oprette tabeller ved hjælp af subqueries...30 INSERT ved hjælp af subqueries...30 Insert til flere tabeller...30 UPDATE ved hjælp af subqueries...32 DELETE ved hjælp af subqueries...32 Multiple row subqueries...32 JDBC - forbindelse fra et java program til Oracle SQL...33 Stored procedures i Java...35 Pakken java.sql...35 Prepared Statements (Precompiled Statements)...35 CallableStatement...36 Sequences...37 PL/SQL syntaks...38 Reserverede ord og variabelnavne...38 PL/SQL's blokstruktur...38 Data typer...39 PL/SQL kontrol strukturer og Embedded SQL...42 Selection Structure...42 IF..THEN strukturer...42 CASE strukturer...44 Looping strukturer...45 Basic loop...45 WHILE loop...45 FOR loop...45 SQL kommandoer i PL/SQL blokke...46 SELECT kommandoer...46 INSERT kommandoer...46 UPDATE kommandoer...46 DELETE kommandoer...47 Datamatikeruddannelsen forår 2007 Side 3 af 65

4 PL/SQL Cursors og Exceptions...48 Cursors...48 Eksplicit og Implicit Cursor...48 Operationer på en eksplicit cursor...48 Attributter til eksplicit cursor...49 For løkker i cursors...50 Cursor der anvender FOR løkker med subqueries...50 Låsning, opdatering og sletning af rækker i cursors...51 Cursor med parametre...51 Ref cursor type...51 Exceptions...52 Typer af Exceptions...52 Fange fejl kode og meddelelse...54 Raise_application_error procedure...54 PL/SQL Composite data typer...55 Records...55 Nested record...55 Tables...56 Varrays...58 PL/SQL blokke...59 Procedurer...59 Funktioner...60 Packages samling af objekter og procedurer...61 Package header...61 Package body...62 Triggers...63 INSTEAD OF trigger...64 Triggers og sequences...64 Data dictionnary views...65 Datamatikeruddannelsen forår 2007 Side 4 af 65

5 Datamodellering med ER-diagrammer Begrebsmæssig modellering er en vigtig fase i databasedesign. Modellerne præsenteres i ERdiagrammer, der viser en begrebsmæssig model på højt niveau. ER diagrammet viser datamodellen i form af entiteter, relationer og attributer. 1. Kravspecifikation og analyse. Indsamling og specificering af kravene til databasen. Dette kan f.eks ske gennem interviews af databasens brugere. Output: Krav til dataene, en oversigt over applikationens funktionelle krav, der beskriver hvilke transaktioner der skal anvendes på databasen i form af hentning og ændring af data 2. Begrebsmæssig skema Denne fase kaldes begrebsmæssig design, og resulterer i et begrebsmæssige skema. Dette giver en detaljeret beskrivelse af brugerens krav og detaljerede beskrivelser af Entiteter, Relationer og Begrænsninger. Det begrebsmæssige skema indeholder ingen informationer om databasens implementering. Dette gør den egnet til overordnede præsentetationer for ikke ituddannede personer. Dette skema kan senere anvendes som en reference for at kontrollere om implementeringen overholder kravene. 3. Logisk design mapning af datamodellen. Denne fase indebærere mapning af modellen til en database i en konkret DBMS. Output: Et databaseskema i DBMS'ens implementering af datamodellen. 4. Fysisk design. Her specificeres relationerne fysisk i databasen, interne lagringsstrukturer, indekseringer, stier og organisering af filer i databasen defineres. Datamatikeruddannelsen forår 2007 Side 5 af 65

6 Entiteter Det grundlæggende objekt der præsenteres i ER diagrammer, er entiteter og deres attributter. En entitet repræsenterer en ting i den virkelige verden, der har en uafhængig eksistens, enten i form af fysisk eller begrebsmæssig eksistens. En entitet med fysisk eksistens kan være en speciel person, bil, bygning, vare etc. En entitet med begrebsmæssig eksistens kan f.eks. være et kursus, et job, et firma etc. Alle entiteter har attributter, der beskriver dem. Attributter for en person kan være navn, adresse etc. Attributter Simpel eller atomar Attributter der indeholder én oplysning, og som derfor ikke kan deles op. Sammenlagt eller Composite En attribut der indeholder flere oplysninger, og som derfor kan deles op. Et eksempel på dette er attributten 'Postadresse' med indholdet 4100 Store Lilleby, der kan deles op i attributtene 'Postnummer' med indholdet 4100 og 'Postdistrikt' med indholdet Store Lilleby. Single og Multi valued De fleste attributter kan kun have en værdi i en speciel entitet. Sådanne attributter er single value. Nogle attributter kan imidlertid have flere værdier i den samme entitet, f.eks en tofarvet bil, vil have flere værdier i attributten 'Farve'. En multi value attribut kan have begrænsninger for hvor mange, eller få, værdier de må have. En bils farve kan måske have 1-3 værdier, der indikerer at bilen har mindst en, men maksimalt 3 farver. Stored og afledt (Derived) I nogle tilfælde er attributter relateret, F.eks 'Fødelsdato' og 'Alder'. Alderen kan beregnes ud fra fødselsdatoen, hvorfor alderen er en afledt attribut. Kompleks Entitetstyper og Entitets sæt En database består af en gruppe entiteter der har lignende egenskaber. En database over medarbejdere ønsker at gemme de samme oplysninger om hver enkelt medarbejder. Entiteterne for de ansatte har de samme attributter, men indeholder forskellige værdier. Alle entiteterne i en database på et givent tidspunkt, kaldes et entitetsæt. Entiteter repræsenteres i ER diagrammet som en firkant med navnet i. Attributtene tegnes son ovaler der er forbundet til entiteten med en linje. Multi value attributter tegnes med en dobbel linje i ovalen. Composite attributter tegnes som en attribut, hvor de foskellige værdier vises Entitet med attributter som ovaler der er forbundet til attributten. Datamatikeruddannelsen forår 2007 Side 6 af 65

7 Nøgler Nøgler er attributter der indeholder en unik værdi for hver enkel entitet, og derfor kan anvendes til at identificere en bestemt entitet. En nøgle kan bestå af en eller flere attributter. En nøgle der består af flere attributter, kaldes en composite key eller sammensat nøgle. Den nøgle man vælger til identifikation af entiterne kaldes primary key, eller primærnøglen. De andre nøgler kaldes candidate keys, eller kanditatnøgler. Domæner, eller værdisæt Alle simple attributter i en entitet kan associeres med et værdisæt, eller domæne. Et eksempel kan være attributten 'Alder', der kan være heltal fra i en database for medarbejdere. Værdisæt defineres typisk ud fra databasens grundlæggende data typer. Der findes datatyper, der repræsenterer heltal, kommatal, dato, booleans etc. Begrebsmæssig databasedesign 1. Analyser og identificer entiteter i problemområdet. 2. Analyser om entiterne og deres relationer afspejler problemområdet. Relationer En relation mellem entiteter, definerer et sæt associationer, eller et relationsæt mellem entiteter af disse entitetstyper. Relationerne i et relationsæt, repræsenterer en mængde instancer af den samme relation, og får derfor en fælles betegnelse. De entiteter der indgår i relationen deltager, eller participates, i instansen af relationen. Relations typer og relations sæt Alle relationer af samme type refereres med relationens navn, dvs en relation Afdeling-Ansat, kan få navnet hyrer. Et relationssæt, betegner alle forekomster af en relation på et bestemt tidspunkt. En relations grad. Graden til en relation, betegner hvor mange entiteter der deltager i relationen. En binær relation omfatter 2 entiteter, altså en relation af anden grad. En relation der omfatter tre entiteter, er ternary. Rollenavne og rekursive relationer Alle entiteter der deltager i en relation, spiller en speciel rolle i denne. Rollenavnet, betegner den rolle entiteten har i relationen. I relationen Personale -ansat i- Afdeling, kan entiteten Personale have rollen Ansat og Afdeling have rollen Arbejdsgiver. Rollenavne er ikke påkrævet i relationer hvor de deltagende entiteter er klart adskilt, så man tydelig kan se deres roller. I nogle relationer er dette imidlertid ikke alltid tydeligt, specielt i rekursive relationer, hvor en relation kun omfatter en entitet. Relationer som attributter. I nogle tilfælde er det praktisk at betragte relationer som attributter. Når en relation skal implementeres i databasens relationer, vil den typisk blive oprettet som en attribut i den entitet Datamatikeruddannelsen forår 2007 Side 7 af 65

8 relationen går til. Det vil sige at hvis man har en relation Personale -ansat i- Afdeling, vil man oprette en attribut, eller kolonne Afdeling i relationen Personale, der peger på primær nøglen i relationen Afdeling. Begrænsninger for relationer. Kardinalitet i binære relationer. Relationer har som regel begrænsninger, der udtrykker hvor mange mulige kombinationer af entiteter der må deltage i det tilsvarende relationsæt. Disse begrænsningerne er bestemt ud fra hvordan mini-verden ser ud. Man kan f.eks have en regel der siger at en medarbejder kun kan være ansat i èn afdeling. Man skelner mellem to typer af begrænsninger: Kardinalitet og deltagelse. Kardinalitet i binære relationer. Kardinaliteten i en binær relation, definerer det maksimale antal af instanser af en relation en entitet kan deltage i. F.eks at en medarbejder kn kan være ansat i èn afdeling. Kardinalitet vises ud for den rombe der repræsenterer kardinaliteten, med symbolene 1, N og M. Deltagelse og ekistensafhægighed. Deltagelse udtrykker at eksistensen af en entitet er afhængig af at den er relateret til en anden entitet. Denne begrænsning udtrykker det mindste antal instanser af relationen en entitet kan deltage i, Derfor kaldes deltagelse også for minimum cardinality constraint. Der er to typer af deltagelse: Total deltagelse (Total participation) Hver entitet i entitetsættet skal have en relation af den pågældende type. Dette kan f.eks gælde relationen Personale ansat-i Afdeling hvilket vil sige at en ansat skal være ansat i en afdeling, og en instans af entiteten Personale kan ikke eksistere hvis den ikke deltager i en relation med en instans af entiteten Afdeling. Delvis deltagelse (Partial participation) Nogle af, eller en del af entitetsættet detager i en relation af den pågældende type.. En ansat skal være ansat i en afdeling, men alle ansatte er ikke leder af en afdeling. Dette vil sige at hvis man har en relation Personale leder Afdeling, taler man om en delvis deltagelse. Kun en del af entitetsættet deltager i denne relation. Strukturelle begrænsninger Kardinalitet i en binær relation. Kardinalitet og afhængighed udgør de strukturelle begrænsninger der findes for relationer. Datamatikeruddannelsen forår 2007 Side 8 af 65

9 Attributter til relationer. Relationer kan have attributter tilsvarende attributter til entiteter. Hvis man f.eks skal registrere hvor mange timer en medarbejder arbejder på et bestemt projekt, kan man sætte attributten arbejdstimer på relatione mellem Personale og Projekt. Attributter til relationer vil blive implementeret på følgende måde: 1:1 relation Til en af de deltagende entiteter. Eksempel: Attribut til en relation. 1 1 Medarbejder leder Afdeling start_dato I dette tilfældet kan attributten start_dato implementeres både i Medarbejder, hvor den begrebsmæssig hører hjemme, eller i Afdeling, siden der bare optræder en entitet i hver ende af relationen. 1:N relation Attributten kan kun overføres til entiteten på relationens N-side. Eksempel: N 1 Medarbejder arbejder-for Afdeling start_dato I dette tilfælde kan attributten kun implementeres i entiteten Medarbejder. M:N relation Her kan placering af attributten bestemmes ud fra kombinationen af deltagende entiteter i relationen. Eksempel: Datamatikeruddannelsen forår 2007 Side 9 af 65

10 Shah side 72-76, s Integritet Constraints & høne/æg problemet Der er 2 grundlæggende regler for integritet, der skal sikre konsistente data: 1. Entitets Integritet Ingen kolonner i en primærnøgle må indeholde felter med værdien NULL. En primærnøgle sikrer entydig identifikation af en bestemt række eller entitet. Hvis en eller flere rækker har NULL værdier i kolonner der er en del af primærnøglen, mangler der informationer til denne identifikation. 2. Referentiel Integritet Værdien i en fremmednøgle kan være NULL. Hvis et felt der er en fremmednøgle indeholder en værdi, skal den samme værdi kunne findes i primærnøglen til den tabel fremmednøglen henviser til. Primære nøgler og fremmednøgler Primærnøgle og fremmednøgle er typer constraints, der sikrer henholdsvis entitets integritet og referentiel integritet. Constraints Oprettelse af constraints Constraints kan oprettes på 2 niveauer i en tabel: 1. Kolonne niveau Referer til en enkel kolonne, og erklæres ved oprettelsen af denne. Alle constraints, undtaget Foreign Key og Composite Primary Key kan oprettes på kolonne niveau. 2. Tabel niveau <Kolonne Navn> datatype [CONSTRAINT constraint navn] Constraint Type; Referer til en eller flere kolonner, og erklæres ikke ved oprettelsen av kolonnerne. Anvendes normalt efter at alle kolonner er oprettet. Alle constraints undtaget Not Null, kan oprettes på tabel niveau. [CONSTRAINT constraint navn] Constraint Type(Kolonne Navne...); Datamatikeruddannelsen forår 2007 Side 10 af 65

11 Typer af Constraints - integritet og navngivning PRIMARY KEY Constraint Sørger for at tabellen overholder entitets integritet. Definerer tabellens primærnøgle, og sætter automatisk en NOT NULL og UNIQUE constraint på primærnøglens kolonner. Hvis en PK består af flere kolonner, skal den defineres på tabel niveau. Kolonne niveau: DeptId NUMBER(2) CONSTRAINT dept_deptid_pk PRIMARY KEY Tabel niveau: CONSTRAINT dept_deptid_pk PRIMARY KEY(DeptId); FOREIGN KEY Constraint Sørger for at tabellen overholder referentiel integritet. Definerer hvilke kolonner der indgår i fremmednøglen, og hvilken tabel der henvises til. I Oracle implementeres fremmednøglen som pointere. For at oprette en fremmednøgle, må tabellen der henvises allerede være oprettet, med den definerede kolonne. Desuden må værdien i en fremmednøgle kunne genfindes i den tabel der henvises til. Ved oprettelse af en frememdnøgle, kan man tilføje en ON DELETE CASCADE clause, der sikrer at en kan slette en fremmednøgle, ved at de tilsvarende rækker i den henviste tabel også slettes. CONSTRAINT student_facultyid_fk FOREIGN KEY (FacultyId) REFENCES Faculty(FacultuId); NOT NULL Constraint Denne constraint sikrer at værdien NULL ikke kan anvendes i en kolonne. En primærnøgle får automatisk denne constraint, der typisk anvendes på en fremmednøgle eller andre kolonner hvor NULL ikke må forekomme. Kolonne niveau: Name VARCHAR2(15) CONSTRAINT Faculty_name_nn NOT NULL; UNIQUE Constraint Denne constraint forlanger at alle værdier i en tabel/kolonne er unik Kolonne niveau: DeptName VARCHAR2(12) CONSTRAINT dept_dname_uk UNIQUE; Tabel niveau: CONSTRAINT dept_dname_uk UNIQUE(DeptName); Datamatikeruddannelsen forår 2007 Side 11 af 65

12 CHECK Constraint Definere værdier der skal indeholdes i en tabel/kolonne. Der kan sættes flere CHECK constraints på en kolonne. Kolonne niveau: DeptId NUMBER(2) CONSTRAINT dept_deptid_cc CHECK((DeptId >= 10) and (DeptId <= 99)); Tabel niveau: CONSTRAINT dept_deptid_cc CHECK((DeptId >= 10) and (DeptId <= 99)); NOT NULL CHECK Constraint En NOT NULL constraint kan erklæres som en CHECK constraint, og kan på denne måden erklæres både på tabel og kolonne niveau. Name VARCHAR2(15) CONSTRAINT Faculty_name_ck CHECK(Name IS NOT NULL); DEFAULT VALUE Constraint (Ikke en constraint!) Dette er for så vidt ikke en constraint. Dette er et direktiv der sætter en default værdi når der oprettes en ny række, med NULL i de felter hvor dette direktiv er anvendt. State CHAR(2) DEFAULT 'NY'; Navngivning Navnekonvention for constraints er som følger: <Tabel navn>_<kolonne navn>_<constraint forkortelse> F.eks Employee_EmployeName_nn Forkortelsene er vist i tabellen til højre. Hvis en constraint ikke navngives når den erklæres, vil Oracle give den et navn efter SYS_Cn formatet, hvor n er et unikt nummer, f.eks: SYS_C Altså ikke brugervenlige navne. Constraint PRIMARY KEY pk FOREIGN KEY NOT NULL UNIQUE CHECK Forkortelse fk nn uk cc eller cc Forkortelse til constraint navne konventionen. Sletning og ændring af Constraints Ved sletning og ændring af constraints, skal man sørge for at entitets- og referentiel integritet overholdes. Ellers vil DBMS afvise ændringen/sletningen. Dette kan opnås ved at anvende clauser som ON UPDATE CASCADE eller ON DELETE NO ACTION ved oprettelse av fremmednøgler. Datamatikeruddannelsen forår 2007 Side 12 af 65

13 Få vist constraints i Oracle SELECT CONSTRAINT_NAME, CONSTRAINT_TYPE FROM USER_CONSTRAINTS WHERE TABLE_NAME = 'Student'; Constraints som ikke er erklæret med et navn, vil blive vist med sit SYS_Cn navn. Dette gælder til NOT NULL constraint, der ofte erklæres ved oprettelse af en kolonne som vist nedenfor. Høne & æg problemet Høne & æg problemet går simpelthen ud på hvad man kan eller skal oprette først. Man kan ikke oprette en fremmednøgle til en tabel der ikke eksisterer. Derfor vælger man ofte at oprette samtlige tabeller først, med primærnøgler og andre constraints. Derefter oprettes alle fremmednøgler i alle tabeller. Datamatikeruddannelsen forår 2007 Side 13 af 65

14 Opret tabeller i Oracle CREATE TABLE FACULTY ( Facultyid NUMBER(3), Name VARCHAR2(15) CONSTRAINT FACULTY_Name_nn NOT NULL, RoomId NUMBER(2), Phone CHAR(3) CONSTRAINT FACULTY_Phone_uk UNIQUE, DeptId NUMBER(3), CONSTRAINT FACULTY_Facultyid_pk PRIMARY KEY (Facultyid) ); --Foreign keys in FACULTY ALTER TABLE FACULTY ADD CONSTRAINT FACULTY_RoomId_fk FOREIGN KEY (RoomId) REFERENCES LOCATION(RoomId) initially deferred deferrable; ALTER TABLE FACULTY ADD CONSTRAINT FACULTY_DeptId_fk FOREIGN KEY (DeptId) REFERENCES DEPARTMENT(DeptId); Datamatikeruddannelsen forår 2007 Side 14 af 65

15 Normalisering Normalisering af en database, har til formål at sikre ens tabeller, eller relationer, i mod dårligt, eller fejlagtigt design. En dårlig designet tabel kan f.eks. indeholde redundans, hvilket vil sige at de samme data optræder mange steder i en tabel, eller i databasen. Dermed skal de samme data opdateres på mange steder, hvilket øger muligheden for fejl. Afhængighed Her er det tale om afhængighed til kolonnerne i primærnøglen. Hvilket vil sige at man er afhængig af kolonnerne i primærnøglen for at entydigt identificere en bestemt række. Der findes 3 typer afhængighed: 1. Total eller fuld afhængighed Nogle af de kolonner der ikke indgår i primærnøglen, er afhængige af alle kolonnerne i primærnøglen. Dvs. at man behøver alle kolonner i primærnøglen til at identificere en række. 2. Partiel eller delvis afhængighed Nogle af de kolonner der ikke indgår i primærnøglen, er afhængige af nogle kolonner i primærnøgle. Dvs. at man ved hjælp af nogle kolonnerne i primærnøglen kan identificere en række. 3. Transitiv afhængighed Nogle af de kolonner der ikke indgår i primærnøglen, er afhængige af andre kolonner der ikke indgår i primærnøglen. Dvs at man ved hjælp af kolonner der ikke indgår i primærnøglen kan identificere en række. Anomalier Update Anomali Problemer i databasen der kan opstå ved opdateringer af rækker (data). F.eks hvis man ved ændringer i en varoplysning skal ændre den samme oplysning for hver faktura der ligger i databasen med denne bestemte vare. Insertion Anomali Problemer i databasen der kan opstå ved indsættelse af nye rækker (data). Hvis man, f.eks lægger in en ny vare, bliver nødt til at oprette en faktura der fakturerer en sådan vare. Delete Anomali Problemer i databasen der kan opstå når man sletter rækker (data). Hvis man f.eks ved sletning af en faktura kommer til at fjerne en bestemt vare fra databasen. Datamatikeruddannelsen forår 2007 Side 15 af 65

16 Normalformer 1. Normalform En tabel er på 1. normalform når: 1. Der er defineret en primærnøgle. Denne kan bestå af en eller flere kolonner. 2. Alle kolonner der ikke indgår i primærnøglen, er funktionelt afhængige af kolonnerne i primærnøglen. 3. Tabellen indeholder ingen kolonner der indeholder mere end én værdi. I nedenstående eksempel har 'Varebetegnelse' og 'Antal' mere end en værdi. FakturaNr KundeN r KundeNavn VareNr Varebetegnelse Pris Antal KlikService Aps Runde knapper 0, Metal knapper 0, BukseSmeden A/S Bukseben Lynlåse Nål & Tråd Inc Synåle 0, Normalform En tabel er på 2. normalform når: 1. Den er på 1. normalform 2. Der er ingen partielle afhængigheder. 3. Normalform En tabel er på 3. normalform når: 3. Den er på 2. normalform 4. Der er ingen transitive afhængigheder. Afhængighedsdiagram Strikkepinde 1, Afhængighedsdiagrammet viser tabellers indbyrdes afhængigheder. Primærnøglen er udhævet med fed skrift. Afhængigheder vises med pile. Datamatikeruddannelsen forår 2007 Side 16 af 65

17 Normalisering af tabeller. Tabeller på 1. normalform 2. normalform: Fjernet Partielle afhængigheder Tabeller på 2. normalform Datamatikeruddannelsen forår 2007 Side 17 af 65

18 3. Normalform: Fjernet transitive afhængigheder. Tabeller på 3. normalform Datamatikeruddannelsen forår 2007 Side 18 af 65

19 INSERT Syntaks: Data visning, opdatering og sletning (DML) INSERT INTO <Tabel Navn> [(Kolonne Navne...)] VALUES (Værdi1,Værdi2...); [WHERE Betingelse AND OR NOT BETWEEN...AND Betingelse]; F.eks. INSERT INTO COURSE (courseid, title, credits, prereq) VALUES ('EN100', 'Basic English', 0, 'GR4'); Operatorer der konverterer dato/tid Afrunding TO_DATE F.eks TO_DATE('06/05/2007','MM/DD/YYYY)' TO_CHAR F.eks TO_CHAR(HireDate, 'DD-MM-YYYY HH:MM:SS P.M.') NUMBER F.eks. 56,23656 kan formatteres med NUMBER(6,2) vil give 56,24 NULL værdier 1. Kan indsættes implicit: INSERT INTO COURSE (courseid, title) VALUES ('EN100', 'Basic English') De kolonner der er udeladt her, vil få NULL værdier 2. Kan indsættes eksplicit: INSERT INTO COURSE (courseid, title, credits, prereq) VALUES ('EN100', 'Basic English', 0, NULL); Indsættelse ved hjælp af variabler INSERT INTO COURSE (courseid, title, credits, prereq) VALUES ('&courseid, '&title', 0, 'GR4'); &tegnet foran variablene vil give en prompt, hvor man kan skrive ind værdier for de aktuelle felter. SET DEFINE ON og SET DEFINE! gør at! bliver anvendt i stedet for &, så man kan anvende & til data der skal sættes ind i databasen. Med ACCEPT kommandoen kan man definere egne prompts til at skrive ind data: Syntax: ACCEPT <Variabelnavn> PROMPT 'Melding..'; ACCEPT courseid PROMPT 'Skriv kursusnummer >:'; ACCEPT title PROMPT 'Skriv kursets navn >:'; INSERT INTO COURSE (courseid, title, credits, prereq) VALUES ('&courseid, '&title', 0, 'GR4'); Datamatikeruddannelsen forår 2007 Side 19 af 65

20 UPDATE Syntax UPDATE TabelNavn SET Kolonne1=NyVærdi1, Kolonne2=NyVærdi2... [WHERE Betingelse AND OR NOT BETWEEN...AND Betingelse]; Hvis WHERE clausen udelades, opdateres samtlige rækker i tabellen. UPDATE COURSE SET title = 'Basic English' WHERE courseid = 'EN100'; DELETE Syntax Hvis man prøvet at slætte en række, hvis primærnøgle findes i en anden tabels primærnøgle, bliver sletningen afbrudt med fejlmeddelelsen Integrity constraint violated child record found DELETE [FROM] TabelNavn [WHERE Betingelse AND OR NOT BETWEEN...AND Betingelse]; F.eks DELETE FROM COURSE WHERE courseid = 'EN100'; Operand Funktion = Lig med <> eller!= Ikke lig med > Større end >= Større eller lig med < Mindre end >= Mindre eller lig med Sammenligningsoperatorer SELECT Syntax SELECT Kolonnenavn1, Kolonnenavn2... (eller *) FROM TabelNavn [WHERE Betingelse AND OR NOT BETWEEN...AND Betingelse] [ORDER BY KolonneNavn [ASC DESC]]; [GROUP BY KolonneNavn [ASC DESC]]; [HAVING Udtryk (f.eks COUNT(*) = 12)]; Substitutions variabler kan anvendes i stedet for et kolonnenavn som argument til SELECT. Så vil brugeren blive spurgt om hvilken kolonne der skal hentes data fra GROUP BY kan ikke anvendes sammen med SELECT med en enkel række funktion. HAVING clause anvendes til at indskrænke resultatet af en gruppe funktion. SELECT courseid, title, &columnname FROM COURSE; DEFINE columnname = prereq (CHAR) UNDEFINE columnname Datamatikeruddannelsen forår 2007 Side 20 af 65

21 Funktioner: DISTINCT Viser kun en enkel forekomst, hvis der er flere der er ens. COLUMN ALIAS Viser kolonnen med et egendefinerett navn. SELECT courseid AS 'Course No.' COLUMN Gør det muligt at formattere indholdet i en kolonne, f.eks afrunde et tal SELECT courseid AS 'Course No.' FORMAT A8 Giver plads til 8 karakterer i visningen CONCATENATION Kæder sammen indholdet fra to kolonner, så de vises som en kolonne SELECT Lname Fname FROM Employee; Aritmetiske operationer SELECT Lname, Fname, Salary + Bonus FROM Employee; Viser de totale indtægter for hver eneste ansatte. Wild Cards % (Procent) Repræsenterer ingen eller flere karakterer SELECT courseid, coursename FROM COURSE WHERE coursename LIKE 'A%' Viser alle kurser der starter på A _ (Underscore) Repræsenterer én, hvilken som helst karakter. CASE CASE strukturen kan anvendes i alle SQL statements. Syntax: CASE WHEN Betingelse1 Udtryk1 WHEN Betingelse2 Udtryk2... ELSE Betingelse3 END F.eks UPDATE Ansat SET Salary = CASE WHEN Ansienitet > 20 THEN Løn * 1,25 WHEN Ansienitet > 10 THEN Løn * 1,10 ELSE Løn * 1,05 END Datamatikeruddannelsen forår 2007 Side 21 af 65

22 Funktioner og Grupperinger Der findes 2 typer funktioner 1. Funktioner på enkle rækker Arbejder på enkle rækker, og returnerer et resultat pr række 2. Funktioner på grupper og aggregeringer Arbejder på data i en gruppe af rækker, og resulterer i er enkelt resultat. Funktioner på enkle rækker Funktioner på karakterer Funktion UPPER (Kolonne udtryk) LOWER (Kolonne udtryk) INITCAP (Kolonne udtryk) CONCAT (Kolonne Udtryk, Kolonne Udtryk) SUBSTR(Kolonne udtryk, x, y) Anvendelse Konverter til store bogstaver. Konverter til små bogstaver. Sætter de ønskede karakterer til små eller store, f.eks 1 bogstav i hvert ord Sætter sammen 1. værdi med 2. værdi Trækker en streng ud fra kolonne. Begynder ved x og laver en substreng hvis længde er y SUBSTR(Kolonne udtryk, z) Deler en streng i 2 fra karakter z. INSTR (Kolonne udtryk, c) LTRIM (Kolonne udtryk, c) RTRIM (Kolonne udtryk, c) TRIM (c FROM Kolonne udtryk) TRIM (Kolonne) LENGTH (Kolonne udtryk) LPAD (Kolonne udtryk, n, 'str') RPAD (Kolonne udtryk, n, 'str') REPLACE (Kolonne udtryk, c, r) Funktioner på tal Funktion ROUND (Kolonne udtryk[n]) TRUNC (Kolonne udtryk[n]) Returnerer positionen til den ønskede karakter Fjerner karakterer i begyndelsen af strengen. Fjerner karakterer i slutningen af strengen. Fjerner karakterer i både begyndelse og slutningen af strengen Fjerner SPACES fra strengen. Returnerer længden Fylder ud i begyndelsen af strengen. Fylder ud i slutningen af strengen. Erstatter substring c med r, hvis den findes Anvendelse Afrunder til n decimaler efter kommaet POWER (n, p) Ophæver p i n'te - p(n p ) ABS(n) MOD(x, y) Forkorter kolonnen eller udtrykket til n decimaler Returnerer absolut værdien til n Returnerer det tilbageværende heltal af x/y SIGN (værdi) Returnerer 1 hvis positiv, -1 hvis negativ eller 0 hvis 0 FLOOR (værdi) Returnerer det højeste heltal der er større end eller lig med Datamatikeruddannelsen forår 2007 Side 22 af 65

23 CEIL (værdi) værdi Returnerer det højeste heltal der er mindre end eller lig med værdi Funktioner på dato Aritmetik på datoer: Operation Date + number Date - number Date + number/24 Date1 - Date2 Resultat Lægger number dage til datoen Trækker number dage fra datoen Lægger number timer til datoen Returnerer antal dage mellem Date1 og Date2 Funktion MONTHS_BETWEEN (date1, date2) ADD_MONTHS (date, m) NEXT_DAY (date, 'day') LAST_DAY (date) ROUND (date [, 'format'] TRUNC (date [, 'format'] EXTRACT(YEAR MONTH DAY FROM date) NEXT_TIME (date, existing timezone, new timezone) Anvendelse Returnerer antal måneder mellem 2 datoer Lægger m måneder til datoen date Returnerer den næste ugedag day fra datoen date Returnerer den sidste dag i måneden Afrunder til den nærmeste day, month eller year Forkorter datoen date til den nærmeste day, month eller year Returnerer day, month eller year fra datoen date Returnerer datoen i angivne tidzone, som EST eller PST Funktioner der konverterer data Funktion TO_CHAR (number date [, format]) TO_NUMBER (char [, format]) TO_DATE (char [, format]) Anvendelse Konverterer et tal eller en dato til varchar2, baseret på det angivne format Konverterer et sæt karakterer med en gyldig kommasekvens til et number, baseret på det angivne format Konverterer et sæt karakterer til en date, baseret på det angivne format. Default format er DD-MM-YYYY Indlejring Funktioner der arbejder på enkle rækker kan indlejres i hinanden. I indlejrede funktioner, bliver den inderste udført først: SELECT NEXT_DAY (ADD_MONTHS(TRUNC(TO_DATE('12/12/98', 'MM/DD/YYYY'), 'MONTH'), 3), 'WEDNESDAY') + 7 AS 'Days Date' FROM Column; Datamatikeruddannelsen forår 2007 Side 23 af 65

24 Formater Talformater Format Anvendelse 9 Antal 9-tal definerer længden (9999) 0 Vis antal pladser i begyndelsen som 0-tal (0999) $ Viser et flydende $ tegn ($999). Viser et flydende komma på den angivne plads (999.99), Viser et komma på den angivne plads (999,99) PR Dato formater Format YYYY Viser negative tal i parenteser (999PR) Anvendelse Fire cifret årstal Y, YY eller YYY Sidste, sidste 3 eller sidste 2 tal fra årstallet YEAR Q MM MON MONTH Month RR RM WW eller W DDD, DD eller D DAY DY DDTH DDSP DDSPTH Årstallet i detaljer Kvartalet To cifret angivelse af måneden Første tre bogstaver i måneden Månedens navn i 9 karakterer, fyldt op med SPACE's Samme som MONTH, men i InitCap format Året i 2 tal dette århundrede, forrige århundrede Måned med romerske tal Ugenummer i året eller måneden Dagen i året, måneden eller ugen Dagens navn i 9 karakterer, fyldt op med SPACE's Dagens navn forkortet til 3 karakterer Skriftlig nummer, f.eks seventh Nummeret skrevet Skriftlig nummer, f.eks seventh, skrevet HH, HH12 eller HH24 Time på dagen, eller time 0-12 eller time 0-24 MI Minut (0-59) SS Sekund (0-59) SSSS Sekund fra midnat ( ) of fm Streng med gåseøjne vises i resultatet Fyld metode der anvendes med andre formater for at skjule SPACE's Datamatikeruddannelsen forår 2007 Side 24 af 65

25 Funktioner på grupper og aggregeringer Dette er en gruppe af funktioner der udfører en operation på flere rækker, og returnerer ét resultat. Gruppe funktion SUM (Kolonne) AVG (Kolonne) MAX (Kolonne udtryk) MIN (Kolonne udtryk) COUNT (* Kolonne udtryk) Anvendelse Returnerer summen af alle værdier i en kolonne, og ignorerer NULL værdier Returnerer gennemsnittet af alle værdier i en kolonne, og ignorerer NULL værdier Returnerer højeste værdi af alle værdier i en kolonne, og ignorerer NULL værdier Returnerer laveste værdi af alle værdier i en kolonne, og ignorerer NULL værdier Returnerer antal rækker. Inkluderer NULL værdier hvis kolonnen eller eller udtrykket anvendes som argument. Datamatikeruddannelsen forår 2007 Side 25 af 65

26 Hvorfor man bruger joins Joins JOINs er forespørgsler der omfatter mere end én tabel. Dette vil sige at resultatet af en JOIN, indeholder rækker, eller dele af rækker, fra flere tabeller. Eftersom man under normalisering deler tabeller op, er der ofte behov for at samle data fra flere tabeller for at få samlet de data man har behov for. Ved at samle data fra tabellerne Faktura, Kunde og Vare, kan man f.eks hente ud de oplysninger der indgår i en faktura. Primærnøgler og fremmednøgler anvendes naturligvis til at hente de rækker der er fælles for den enkelte faktura. Det kartesiske produkt Et kartesiske produkt, er resultatet af en forespørgsel på flere kolonner, hvor forespørgselen ikke har en WHERE clause. Altså det totale antal rækker i en eller flere tabeller. En forespørgsel på flere tabeller udføres ved hjælp af en JOIN. Det kartesiske produkt har i sig selv sjælden praktisk nytte. Forskellige former for joins JOINs anvendes hvis man ønsker at samle data fra to eller flere kolonner i et søgeresultat. Man angiver hvilke kolonner og tabeller man vil søge i. I tillæg skal der opsættes kriterier for hvilke data der skal medtages i søgeresultatet. Dette sker som regel ved at anvende primærnøgler og fremmednøgler. Der findes flere forskellige typer JOINs, alt eftersom hvordan data i de forskellige tabeller skal relateres i forhold til hinanden i søgeresultatet. Der findes fire forskellige typer joins: 1. Equijoin 2. Non Equijoin 3. Outer Join 4. Self Join De beskrives nærmere på de følgende sider. Datamatikeruddannelsen forår 2007 Side 26 af 65

27 Equijoin Equijoin er en join, der medtager data der er fælles for de involverede tabeller. Der anvendes altså lighed ved sammenligning. Syntax: SELECT Kolonnenavn1, Kolonnenavn2... FROM Tabel1, Tabel2 [WHERE Join Betingelse1 AND JoinBetingelse2...] SELECT e.employeeid, e.lname e.fname, de.deptname, d.dependentid FROM Employee e, Department de, Dependent d WHERE e. EmployeeId = d.employeeid AND e.deptid = de.deptid; En egquijoin, består af en SELECT kommando, hvor man angiver hvilke kolonner der skal indgå i JOIN udtrykket. I viste eksempel er der angiver hvilke tabel de skal hentes fra, ved hjælp af det variabel navn hver tabel er tildelt i udtrykket. Det næste er en FROM kommando, hvor de deltagende tabeller angives, med et table alias. Til sidst en WHERE clause, med betingelser. Der vil alltid være en betingelse mindre end det antal tabeller der indgår i en equijoin. Eksempelet til venstre, omfatter 3 tabeller og har 2 betingelser for JOIN. Betingelserne anvender = som operator for sammenlignen. NonEquijoin En nonequijoin, er det samme som en equijoin, bortset fra at man anvender andre operatorer en lighed i JOIN betingelserne. Dette indebærere at resultatet af en nonequijoin ikke omfatter de data der er fælles for de anvendte tabeller. Outer join Syntax: SELECT Kolonnenavn1, Kolonnenavn2... SELECT distinct e.employeeid, e.lname ', ' FROM Tabel1, Tabel2 e.fname, d.relation [WHERE Join Betingelser... ] FROM Employee e, Department de, Dependent d WHERE e.salary BETWEEN AND AND DEPENDENTID > 1; En outer join vælger de værdier der ikke optræder i begge kolonner fra de joinede tabeller. I en almindelig join, vælges kun de værdier der findes i kolonnerne i begge tabellerne. Hvis man vil have valgt værdier der kun optræder i den ene af tabellerne, kan man anvende en outer join. Man angiver at det er tale om en outer join, ved at tilføje en (+) ved den tabel der ikke indeholder de data man søger efter. (+) kan anvendes på den ene tabellen i udtrykket, men ikke begge. Den tabellen der ikke indeholder de data man søger på, kaldes deficient table. Syntax: SELECT Kolonnenavn1, Kolonnenavn2... FROM Tabel1, Tabel2 [WHERE Join Betingelse1(+) =Join Betingelse2 ] SELECT e.employeeid, e.lname ', ' e.fname, d.relation FROM Employee e, Dependent d WHERE e. EmployeeId(+) = d.employeeid; eller Datamatikeruddannelsen forår 2007 Side 27 af 65

28 SELECT e.employeeid, e.lname ', ' e.fname, d.relation FROM Employee e, Dependent d LEFT OUTER JOIN Dependent d ON e.employeeid = d.employeeid; Self join Self join, er en join der kun omfatter én enkel tabel. Dette er hvad man i ER-diagrammet beskriver som en rekursiv relation, og anvendes på tabeller der har en fremmednøgle der peger på sin egen primærnøgle eller af sine andre kolonner. I en self-join læses tabellen 2 gange, og man kan derfor sammenligne direkte indholdet i 2 (eller flere) kolonner for at se om de matcher. I nedenstående eksempel, anvendes en self-join for at se hvem der er leder for de forskellige ansatte. SELECT e.lname ', ' e.fname AS Employee, s.lname ', ' s.fname AS Supervisor FROM employee e, employee s WHERE e.supervisor = s.employeeid; Datamatikeruddannelsen forår 2007 Side 28 af 65

29 Sub-queries Sub-queries er også kendt som indlejrede forespørgsler. En subquery er vanligvis en SELECT forespørgsel i en af clausene til en anden SELECT forespørgsel. På denne måden kan man lave kraftige forespørgeler på en enkel måde ved at anvende subqueries. En subquery er specielt nyttig, hvis man anvender resultatet af én forespørgsel som argument i en anden forespørgsel. En subquery kan anvendes i en WHERE, HAVING eller FROM clause i en anden SELECT forespørgsel. Der er 2 typer subqueries: 1. Single row subqueries Returnerer én række med data. Også kendt som scalar subquery. 2. Multiple row subqueries Returnerer flere rækker. Single row subqueries Syntax: SELECT kolonner SELECT EmployeeId, Lname FROM tabel FROM Employee WHERE kolonne operator WHERE EmployeeId = (SELECT kolonner (SELECT EmployeeId FROM tabel FROM Dependent WHERE betingelse); WHERE relation = 'Daughter'); Følgende regler skal overholdes når man laver en subquery: Skal placeres inde i komma - () I de fleste tilfælde returneres én kolonne fra én række. Hvis ingen rækker returneres, returneres NULL. Hvis flere rækker returneres, genereres der en fejl. ORDER BY kan ikke anvendes i en subquery. Man anvender relationelle operatorer i det ydre udtryk. Tilladte operatorer er: =, <> eller!=, >, >=, < og >= I et query med subqueries, bliver den inderste query udført først. Denne returnerer en værdi, der anvendes som argument til den yderste query. Hvis man anvender forskellige tabeller i den ydre og indre query, vil forespørgselen opføre sig som en JOIN. Man kan indlejre mange forespørgsler i hinanden. Den inderste vil altid blive udført først, hvorefter de udføres indefra og ud. Datamatikeruddannelsen forår 2007 Side 29 af 65

30 Oprette tabeller ved hjælp af subqueries Syntax: CREATE TABLE tabel AS SELECT query; CREATE TABLE NewTable AS SELECT EmployeeId, Lname, Fname FROM Employee WHERE DeptId = 10; Når en tabel operettes på denne måden, bliver bare NOT NULL constraints overført. Hvis man har behov for andre constraints, må man selv lægge dem til tabellen ved hjælp af ALTER TABLE. I ovenstående eksempel, oprettes en tabel med 3 kolonner, EmployeeId, Lname og Fname. Endvidere tilføjes der rækker fra Employee tabellen hvis de imødegår udtrykket i WHERE clausen. I dette tilfælde inkluderes ansatte der tilhører afdelingen med DeptId 12. INSERT ved hjælp af subqueries Syntax: INSERT INTO tabel [(kolonnenavn1, kolonnenavn2...)] SELECT kolonnenavne FROM tabelnavn WHERE betingelse; INSERT INTO NewTable SELECT EmployeeId, Lname, Fname FROM Employee WHERE DeptId = 20; INSERT ved hjælp af subqueries anvender ikke VALUES clausen, da subquery erstatter disse. Man kan indsætte data i en tabel ved hjælp af en subquery. I dette tilfældet, fyldes tabellen TempEmployee med Ansat nummer, for- og efternavn på ansatte i afdeling 12 ved hjælp af en subquery. Operationer med subqueries, opret tabel, INSERT, DELETE Operatorer i forbindelse med multiple ROW Insert til flere tabeller Normalt anvendes INSERT til at indsætte data i én tabel. I nogle tilfælde, f.eks ved overføring eller arkivering af store mængder data, kan det være nyttigt at indsætte data i flere tabeller samtidigt. Der er to typer INSERT kommandoer der gør dette: 1. INSERT ALL, med eller uden betingelser Indsætter de samme data ind i de angivne kolonner. Hvis der anvendes er WHERE clause, skal betingelserne i denne mødes for at der skal kunne blive indsat nye rækker i tabellerne. Syntaks: Uden betingelser: INSERT ALL INTO Employee_dept VALUES(EmployeeId, Lname, Fname, DeptId) INTO Dependent VALUES(EmployeeId, Lname, Fname, SsecurityNo) SELECT EmployeeId, Lname, Fname, DeptId, SsecurityNo FROM Employee WHERE EmployeeId > 100 OR DeptId = 75; Uden betingelser, bemærk WHEN clausene for hver INTO...VALUES sekvens Datamatikeruddannelsen forår 2007 Side 30 af 65

31 INSERT ALL WHEN EmpoyeeId > 100 THEN INTO Employee_dept VALUES(EmployeeId, Lname, Fname, DeptId) WHEN DeptId = 75 THEN INTO Dependent VALUES(EmployeeId, Lname, Fname, SsecurityNo) SELECT EmpoyeeId, Lname, Fname, DeptId, SsecurityNo FROM Employee WHERE EmployeeId > 100 OR DeptId = 75; 2. INSERT FIRST Denne kommando har samme syntaks som INSERT ALL med betinger. I stedet for operatoren ALL anvendes operatoren FIRST. Dette indebærer at rækker bliver indsat i den første tabel hvis WHEN clause opfylder betingelserne. Uden betingelser, bemærk WHEN clausene for hver INTO...VALUES sekvens INSERT FIRST WHEN EmpoyeeId > 100 THEN INTO Employee_dept VALUES(EmployeeId, Lname, Fname, DeptId) WHEN DeptId = 75 THEN INTO Dependent VALUES(EmployeeId, Lname, Fname, SsecurityNo) SELECT EmpoyeeId, Lname, Fname, DeptId, SsecurityNo FROM Employee WHERE EmployeeId > 100 OR DeptId = 75; Datamatikeruddannelsen forår 2007 Side 31 af 65

32 UPDATE ved hjælp af subqueries Subqueries kan være nyttige, hvis man har behov for at opdatere rækker i mange tabeller samtidigt. Man kan vælge at sætte en WHERE clause til sidst i sætningen, der filtrer Syntaks: UPDATE tabelnavn SET kolonnenavn=værdi eller udtryk WHERE kolonnenavn operator (SELECT subquery) [WHERE betingelse]; UPDATE Employee SET salary = salary * 1.10 WHERE DeptId = (SELECT DeptId FROM Department WHERE UPPER(DeptName) = 'COMPUTER SCIENCE'); DELETE ved hjælp af subqueries Syntaks: DELETE FROM tabelnavn WHERE kolonnenavn operator (SELECT subquery); DELETE FROM Employee WHERE DeptId = (SELECT DeptId FROM Department WHERE UPPER(DeptName) = 'COMPUTER SCIENCE'); Multiple row subqueries En multiple row subquery kan ikke anvende de samme operatorer som single row subqueries (=, <>, >, >=, <, <=). Multiple row subqueries har sine egne operatorer, IN, ALL eller ANY/SOME. ALL og ANY skal begynde med en af 3 operatorer IN IN operatoren returnerer TRUE en af værdierne kan findes i listen af rækker der blev returneret af en multiple row subquery er lig med argumentet i WHERE clausen ALL ALL operatoren returnerer TRUE alle værdierne kan findes i listen af rækker der blev returneret af en multiple row subquery er lig med argumentet i WHERE clausen. Ved hjælp af den foregående operator, sammenlignes der om værdien er mindre end, lig med eller større end værdierne i den returnerede liste. ANY Operator Anvendelse operatoren returnerer TRUE en af værdierne kan findes i listen af rækker der blev returneret af en multiple row subquery er lig med argumentet i WHERE clausen. Ved hjælp af den foregående operator, sammenlignes der om værdien er mindre end, lig med (samme som IN) eller større end værdierne i den returnerede liste. IN ALL <ALL =ALL >ALL ANY eller SOME <ANY =ANY >ANY Lig med en af værdierne i en liste Sammenlign den givne værdi med alle værdier i en subquery Sammenlign den givne værdi med nogle værdier i en subquery Argumenter til multiple row subqueries Datamatikeruddannelsen forår 2007 Side 32 af 65

33 JDBC - forbindelse fra et java program til Oracle SQL JDBC-ODBC anvender ODBC. Denne skal derfor være installeret på klienten. ODBC bliver installeret som default under standard installation af Oracle. Udover dette, skal databasens klient selvfølgelig være installeret på klienten. Alle kald til databasen går over netværket, derfor skal tilkoblingen til databasen som minimum indeholde en URL til databasen. JDBC driveren er specifik for den enkelte database. Derfor bliver forespørgsler til databasen oversat til den anvendte databases API. Kommunikationen mellem et Java program og databasen, foregår i 7 faser. 1. Indlæs JDBC driver Driveren er den klasse der er specifik for den enkelte database, og som kender databasens dataformater. Syntaksen til at læse driveren ses i nedenstående eksempel. private static String DRIVER = "oracle.jdbc.oracledriver"; Class.forName(DRIVER); // Loads the diver. May throw ClassNotFoundException. Man anvender Class.ForName af 2 grunde. Klassen skal indlæses, men der skal ikke oprettes en instans af den og man skal referere til en driver der ikke er kendt når klassen kompileres. Class.ForName tager et fuldt klassenavn som argument. Altså et klassenavn der inkluderer dens pakkenavne. Biblioteket med klassen skal selvfølgelig befinde sig i CLASSPATH. De fleste database leverandører leverer biblioteker i en.jar fil. Exceptions: ClassNotFoundException ved brug af Class.ForName 2. Beskriv URL Når man opretter en forbindelse til databasen, skal man selvfølgelig angive hvor denne befinder sig. Man skal angive dens Uniform Ressource Locator, eller URL. private static String DATABASE_URL = "jdbc:oracle:thin:@localhost:1521:oracleid"; Denne angives i en streng med følgende oplysninger: Protokol: URL's der henvender sig til databaser angiver denne med jdbc:protokol Serverens værtsnavn, port og databasens navn. 3. Opret forbindelse Forbindelse oprettes ved hjælp af drivermanagerens getconnection() metode. Denne metoden anvender databasens URL, et brugernavn og et password. Derfor skal disse sendes med som parametre. private static String USERNAME = "vidarjb"; private static String PASSWORD = "secret"; Connection connection = DriverManager.getConnection(DATABASE_URL, USERNAME, PASSWORD); Connection objektet har mange andre nyttige metoder, de kan anvendes senere, som preparestatement(), preparecall(), commit(), close() Exceptions: SQLException fra metoden DriverManager.getConnection(). Datamatikeruddannelsen forår 2007 Side 33 af 65

34 4. Opret forespørgsel Et Statement objekt anvendes til at sende forespørgsler og kommandoer til databasen. Dette oprettes ved hjælp af Connection objektet som vist nedenunder. statement = connection.createstatement( ); 5. Udfør forespørgsel/opdatering/sletning Statement objektet har en metode, der udfører forespørgselen. Denne anvendes sammen med en SQL kommando, der er specificeret i en streng. query = "select * from dept"; ResultSet resultset = statement.executequery( query ); Resultatet kan med fordel hentes ud i et ResultSet, der indeholder mange metoder til at arbejde på dataene. 6. Anvende resultatet I nedenstående programeksempel, anvendes DataSettets next() metode til at gennemløbe DataSettet, og hente ud hver række. ResultSetMetaData anvendes til at hente informationer om de rækker der findes i DataSettet, og bruges til at gennemløbe hver række. På denne måden, får man adgang til hvert enkelt felt i de returnererede rækker. Bemærk også anvendelsen af ResultSetMetaData's metode getcolumncount(), der returnerer antal kolonner. Første kolonne i et ResultSet har indeks 1. ResultSet resultset = statement.executequery( query ); final ResultSetMetaData rsmeta = resultset.getmetadata(); //rs.beforefirst(); while ( resultset.next() ) { final Vector row = new Vector(); for (int i = 1; i <= rsmeta.getcolumncount(); i++) { row.addelement( resultset.getobject(i) ); } rowdata.addelement( row ); } I dette eksempelet, hentes data ud i en Vector(). 7. Nedlæg forbindelsen Når man er færdig med alle transaktioner, afbrydes forbindelse til til databasen ved hjælp af Connections close() metode. connection.close(); Dette skal først gøres efter at alle transaktioner er udført, da der er et stort overhead forbundet med at åbne en forbindelse. Datamatikeruddannelsen forår 2007 Side 34 af 65

35 Stored procedures i Java Pakken java.sql Klassen CallableStatement er en grænsefladen til stored procedures, og giver en fælles grænseflade til alle databaser. Klassen er en underklasse til klassen PreparedStatment der igen er en underklasse til Statement klassen. CallableStatement anvendes til at kalde PL/SQL blokke Inden dette kan gøres, skal IN parametre skal sættes med én metode, og OUT parametre skal sættes med en anden metode Connection connection = null; CallableStatement storedprocedure = null; CallableStatement storedprocedure2 = null; CallableStatement storedfunction = null; Prepared Statements (Precompiled Statements) Denne klassen gør det muligt at anvende den samme SQL-sætning mange gange men med forskellige parametre. PreparedStatment tager en SQL sætning som parameter når det initialiseres. Klassen PreparedStatement er en underklasse til Statement Erklæring Man opretter en SQL sætning med pladser til parametre. Disse får værdier inden sætningen anvendes. SQL-sætningen compileres og opbevares i databasen. Derfor giver prepared statement er en forbedring af performance. final String insertstr = "insert into DEPT (deptid, deptname, location) values (?,?,?) "; //? er pladser til at sætte ind variabler final PreparedStatement insertstatement = connection.preparestatement( insertstr ); // SQL sætningen med pladsholdere er sendt til DBMS, hvor de er kompileret Bemærk anvendelsen af spørgsmålstegn. De markerer der steder der skal sættes ind variabler. Når JAVA-sætningen udføres compileres SQL-sætningen og kan nu udføres hurtigere en et almindelig SQL-sætning Binding af variabler Dette sker ved anvendelse af setxyz metoder, hvor XYZ repræsenterer en datatype f.eks. setint, eller setstring. preparedstatement.setxyz( n, val) insertstatement.setstring(1, deptnumber); Hvor n er positionen på parametren og val er værdien Anvendelse insertstatement.setstring (2, deptname); insertstatement.setstring (3, deptlocation); Kørsel sker ved at kalde PreparedStatment.executeSQK-kommando. Denne metoden returnerer antal rækker der er blevet påvirket af SQL-kommandoen. preparedstatement.executeupdate(); int number = insertstatement.executeupdate(); Datamatikeruddannelsen forår 2007 Side 35 af 65

36 CallableStatement Klassen CallableStatement findes i biblioteket java.sql, og indeholder grænsefladen til stored procedures. Den er en underklasse til klassen PreparedStatment, der igen er underklasse til Statement klassen. CallableStatement anvendes til at kalde PL/SQL blokke, som PreparedStatment har CallableStatement metoder til at sætte IN og OUT parametre. Erklæring Erklæring sker som ved PreparedStatment. Man opretter en string med en SQL kommando. Der indsættes? hvor der skal indsættes variabler i SQL sætningen. CallableStatement CSnavn = null; CSnavn = connection.preparecall(sql-string); Binding af variabler CallableStatement storedprocedure2 = null; final String procedure2str = "{call search_emp(?,?,?)}"; storedprocedure2 = connection.preparecall(procedure2str); IN parametre sættes ved hjælp af setzyx metoder. Til OUT parametre anvendes metoden registeroutparameter(). CallableStatementnavn.setXYZ( n, val) Hvor n er positionen på parametren og val er værdien preparedstatement(n, SQL data type); Hvor n er positionen på parametren og SQL data type er datatypen Anvendelse storedprocedure2.setint(1, 111); storedprocedure2.registeroutparameter(2, java.sql.types.varchar); storedprocedure2.registeroutparameter(3, java.sql.types.varchar); Efter at variabler er defineret, køres proceduren fra java ved at kalde CallableStatement.execute() metoden. De returnererede værdier kan nu læses fra attributter til CallableStatement ved hjælp af en CallableStatement.get(variabelPlacering) metode storedprocedure2.execute(); String departmentname = storedprocedure2.getstring(2); String departmentlocation = storedprocedure2.getstring(3); storedprocedure2.execute(); String departmentname = storedprocedure2.getstring(2); String departmentlocation = storedprocedure2.getstring(3); Datamatikeruddannelsen forår 2007 Side 36 af 65

37 Sequences En sequence er et Oracle objekt der anvendes til at lave numeriske sekvenser. Dette kan f.eks. anvendes sammen med en surrogate key, der anvender integers. Ved hjælp af en sequencer, kan man få genereret unikke værdier til en primærnøgle. Syntaks: CREATE SEQUENCE sequence_navn [INCREMENT BY n] [START WITH s] [MAXVALUE max NOMAXVALUE] [MINVALUE min NOMINVALUE] [CYCLE NOCYCLE] [CACHE c NOCACHE] [ORDER NOORDER]; ALTER SEQUENCE sequence_navn [INCREMENT BY n] [START WITH s] [MAXVALUE max NOMAXVALUE] [MINVALUE min NOMINVALUE] [CYCLE NOCYCLE] [CACHE c NOCACHE] [ORDER NOORDER]; DROP SEQUENCE sequence_navn; CREATE SEQUENCE Emplyoee_emplyoeeId_seq INCREMENT BY 5 START WITH 435 NOORDER; ALTER SEQUENCE Emplyoee_emplyoeeId_seq INCREMENT BY 8 START WITH 635 NOORDER; Valg: INCREMENT BY n START WITH s MAXVALUE max NOMAXVALUE MINVALUE min NOMINVALUE CYCLE NOCYCLE CACHE c NOCACHE Anvendelse Værdien der skal lægges til for hver gang der genereres en værdi Start værdien Højeste lovlige værdi. Laveste lovlige værdi Når højste værdi er nået, nulstilles sekvensen og starter på laveste værdi. Oracle genererer de næste værdi på forhånd, og cacher dem i RAM. 'c' angiver hvor mange værdier der skal caches. ORDER NOORDER Værdierne genereres i kronologisk orden. Værdierne til en sekvens, lagres i to pseudokolonner. Disse kolonnerne bliver oprettet ved første gangs anvendelse af sekvensen, og heder CURRVAL og NEXTVAL. Disse kan anvendes til at læse sekvensens aktuelle og næste værdi. Disse kan læses fra Oracles dummy tabel ved en SELECT statement på tabellen dual. SELECT Emplyoee_emplyoeeId_seq.CURRVAL SELECT Emplyoee_emplyoeeId_seq.NEXTVAL FROM dual; FROM dual; Ved hjælp af SELECT, kan man få Oracle til at vise alle definerede sekvenser, der er oprettet. SELECT sequence_name, last_number, max_value, min_value, increment_by FROM user_sequences; Datamatikeruddannelsen forår 2007 Side 37 af 65

38 PL/SQL syntaks SQL er et nonproceduralt programmeringssprog. PL/SQL er SQL med procedurale udvidelser. Dette gør det muligt at skrive programmer, eller procedurer i PL/SQL. PL/SQL kompileres som et konventionelt programmeringssprog, og har egenskaber som indkapsling af data og fejlhåndtering. Reserverede ord og variabelnavne Reserverede ord, er ord der indgår i kommandostruktuten i PL/SQL, som DECLARE, BEGIN etc. Variabelnavne dækker i denne sammenhæng over de navne man tildeler variabler, konstanter, procedurer, funktioner, cursors, tabeller, records og exceptions. Navne kan være på maks 30 tegn, og kan indeholde små og store bogstaver (A-Z), tal, &, # og _. PL/SQL's blokstruktur PL/SQL er struktureret i blokke. 1. Anonyme blokke Kan anvendes overalt. Sendes til DBMS for udførelse under run-time. 2. Navngivne blokke, der kan kaldes og kan tage argumenter. Et subprogram er en blok der kan tage argumenter En procedure er en blok der kan udføre en operation. En funktion er en blok der returnerer en værdi. En trigger er en blok der startes ved udførelse af en DML kommando. En package er en samling af PL/SQL blokke En PL/SQL blok består af 3 dele: 1. Deklaration 2. Eksekverbar del 3. Exception håndtering [DECLARE Erklæring af konstanter, variabler, cursors og udtryk;] BEGIN Eksekverbare PL/SQL og SQL kommandoer; [EXCEPTIONS Fejlhåndtering] END; / DECLARE og EXCEPTION er valgfrie, men BEGIN og END skal indeholdes i en PL/SQL blok. Kommentarer Enkel linje startes med Kommentar her Blokke over flere linjer med /* Kommantar her */ Datamatikeruddannelsen forår 2007 Side 38 af 65

39 Data typer PL/SQL har 4 data typer. 1. Scalar Character, kan være CHAR(n) for fast længde, VARCHAR2 variabel længde mellem 1 og 32767, Andre: LONG, RAW Number Fixed points numbers: NUMBER, FLOAT, DECIMAL, NUMBERIC Floating points numbers: FLOAT, REAL, DOUBLE PRECISION Boolean TRUE, FALSE og NULL Date En dato gemmes i standard 7 bytes format, og brugeren kan anvende TO_DATE funktionen til at oprette en dato. 2. Composite Records, tables og varrays 3. Reference Objekter 4. LOB Large Objects, der anvendes til store mængder data, op til 4Gb BLOB pointer til et stort dataobjekt i databasen. CLOB pointer til en store blokke af single-byte karakterer med samme størrelse. NCLOB - pointer til en store blokke af multi-byte karakterer med samme størrelse. BFILE pointer til en fil i operativsystemets filsystem. Anchored declarations Variabeltypen til en anden variabel eller kolonne i databasen, kan anvendes ved erklæring af nye variabler. Syntaksen er: Variabelnavn typeattribut%type[tildeling af værdi] Type fra variabel: variabel1 NUMBER(3); variabel2 variabel1%type := 2; Type fra kolonne i databasen: variabel3 employee.salary%type; Hvis den variabel der anvendes i en anchored declaration har en NOT NULL clause, bliver denne nedarvet til den nye variabel. Typer kan nedarves til andre variabler, hvor man anvender typen i en anchored variabel til at erlære en ny. Datamatikeruddannelsen forår 2007 Side 39 af 65

40 Tildeling af værdi til variabler Operatoren := anvendes når en variabel skal tildeles en værdi variabelnavn := variabel udtryk; Xnum := 5; Ynum := :Xnum * 2; Ynum := :Xnum * 2; BIND variabler BIND variabler kaldes også HOST variabler. Disse erklæres i SQL*Plus, og kan tilgås fra en PL/SQL blok. Anonyme blokke tager ingen variabler, men kan tilgå en BIND variabel ved at sætte et kolon(:) foran navnet. VARIABLE variabelnavn Type VARIABLE Xnum NUMBER, tilgås med :Xnum inde i en PL/SQL blok. Substitutionsvariabler i PL/SQL blokke Man kan anvende substitutionsvariabler i en PL/SQL blok til input af data. Udskriv til skærm fra PL/SQL blokke Der er ingen kommandoer i PL/SQL der gør dette. Oracle har imidlertid en pakke, DBMS_OUTPUT, der gør dette. Proceduen PUT_LINE anvendes til at vise data på skærmen. For at anvende DBMS_OUTPUT, skal miljøvariabelen SERVEROUTPUT være sat til ON. SET SERVEROUTPUT ON ON buffersize DBMS_OUTPUT.PUT_LINE('Tekst der skal vises'); Maksimalt tilladt buffersize for SERVEROUTPUT er 1Mb. Eksempler på ovenstående: VARIABLE Xnum NUMBER --Set miljøvariabelen SERVEROUTPUT med bufferstørrelse 1024 bytes SET SERVEROUTPUT ON 1024 DECLARE Ynum NUMBER; BEGIN --Benyt en substitionsvariabel fra tastaturet :Xnum := &indtastetnum; Ynum := :Xnum * 2; --Vis output på skærmen ved hjælp af funktionen dbms_output DBMS_OUTPUT.PUT_LINE('Double of ' to_char(:xnum) ' is ' to_char(ynum)); END; / Output fra SQL*Plus: Angiv værdien for indtastetnum: 12 gammel 5: :Xnum := &indtastetnum; ny 5: :Xnum := 12; Double of 12 is 24 PL/SQL-procedure er udført. Aritmetiske operationer Der er tilgængelig 5 aritmetiske operationer i PL/SQL de er vist i nedenstående tabel. Rækkefølgen viser også hvilken priotitet de har under eksekvering Datamatikeruddannelsen forår 2007 Side 40 af 65

41 Hvis et udtryk har flere operationer med samme prioritet, udføres de fra venstre til højre. Operationer inde i parenteser udføres før operationer udenfor parenteserne. Operator Anvendelse Prioritet ** Eksponent 1 * Multiplikation 2 / Division 3 + Addering 4 - Subtraktion 5 Datamatikeruddannelsen forår 2007 Side 41 af 65

42 PL/SQL kontrol strukturer og Embedded SQL I et proceduralt programmeringssprog som PL/SQL, er der tre grundlæggende kontrol strukturer. 1. Sekventielle strukturer En række kommandoer udføres i den rækkefølge de er ordnet i. Ingen kommandoer forbigås eller gentages. 2. Selection strukturer IF strukturer. Baseret på om et udtryk et TRUE eller FALSE, udføres den ene eller andre serie af kommandoer. 3. Looping strukturer En serie af kommandoer udføres flere gange, indtil betingelserne i et udtryk bliver opnået. Selection Structure IF..THEN strukturer IF..THEN..END IF Traditionel IF..THEN struktur IF betingelse THEN kommandoer...; END IF; IF..THEN..ELSE..END IF Samme som ovenstående, men med en ELSE betingelse DECLARE age NUMBER := '&Age'; BEGIN IF age < 17 THEN DBMS_OUTPUT.PUT_LINE('Child'); END IF; END; IF betingelse THEN kommandoer...; ELSE kommandoer...; END IF; DECLARE age NUMBER := '&Age'; BEGIN IF age < 17 THEN DBMS_OUTPUT.PUT_LINE('Child'); ELSE DBMS_OUTPUT.PUT_LINE('Adult'); END IF; END; Datamatikeruddannelsen forår 2007 Side 42 af 65

43 IF..THEN..ELSIF..END IF I denne type IF sætning, er der rum for mange betingelser i form af ELSIF sætninger IF betingelse1 THEN kommandoer1...; ELSEIF betingelse2 THEN kommandoer2...; ELSEIF betingelse3 THEN kommandoer3...; END IF; DECLARE age NUMBER := '&Age'; BEGIN IF age < 17 THEN DBMS_OUTPUT.PUT_LINE('Child'); ELSEIF age >= 18 AND AGE < 66 THEN DBMS_OUTPUT.PUT_LINE('Adult'); ELSEIF age >= 67 THEN DBMS_OUTPUT.PUT_LINE('Senior'); END IF; END; IF..THEN udtryk kan indlejres i hinanden. I disse tilfælde, vil betingelsen i de inderste IF THEN udtryk blive afprøvet hvis det yderste er TRUE. Datamatikeruddannelsen forår 2007 Side 43 af 65

44 CASE strukturer CASE udtrykket er et alternativ til IF..THEN..ELSIF. En række WHEN betingelser er opstillet, og hvis en af betingelserne returnerer TRUE, udføres kommandoerne der tilhører denne WHEN betingelse. CASE WHEN betingelse1 THEN kommandoer1...; WHEN betingelse2 THEN kommandoer2...;... END CASE; CASE og searched CASE DECLARE age NUMBER := '&Age'; BEGIN CASE WHEN age < 17 THEN DBMS_OUTPUT.PUT_LINE('Child'); WHEN age >= 18 AND AGE < 66 THEN DBMS_OUTPUT.PUT_LINE('Adult'); WHEN age >= 67 THEN DBMS_OUTPUT.PUT_LINE('Senior'); END CASE; END; I nedenstående eksempel, vises det samme program med CASE og searched CASE. En CASE struktur anvender variabler i sine udtryk, hvor en searched CASE anvender udtryk uden variabler. CASE DECLARE tal NUMBER := &tals; modulus number; BEGIN modulus := MOD(tal, 2); CASE modulus WHEN 0 THEN DBMS_OUTPUT.PUT_LINE(TO_CHAR(modulus) ' er et lige tal' ); ELSE DBMS_OUTPUT.PUT_LINE(TO_CHAR(modulus) ' er et ulige tal' ); END CASE; END; Search CASE DECLARE tal NUMBER := &tal; modulus number; BEGIN CASE WHEN MOD(tal, 2) = 0 THEN DBMS_OUTPUT.PUT_LINE(TO_CHAR(modulus) ' er et lige tal' ); ELSE DBMS_OUTPUT.PUT_LINE(TO_CHAR(modulus) ' er et ulige tal' ); END CASE; END; Datamatikeruddannelsen forår 2007 Side 44 af 65

45 Looping strukturer Der findes 3 LOOP strukturer i PS/SQL: 1. Basic loop 2. WHILE loop 3. FOR loop Basic loop Kommando sekvensen inde i løkken udføres til den støder på EXIT kommandoen, hvis denne har en betingelse, afsluttes løkken når betingelsen er opfyldt. Loopens kommandoer bliver udført mindst en gang før betingelserne kontrolleres. LOOP kommandoer der skal gentages... EXIT [WHEN betingelse]; END LOOP; LOOP counter := counter + 1; maks := maks + counter; gennemsn := maks / counter; DBMS_OUTPUT.PUT_LINE('Maks: ' TO_CHAR(maks)); EXIT WHEN counter >= countto; END LOOP; WHILE loop En WHILE loop fungerer på samme måde som en BASIC loop. En række kommandoer gentages til en betingelse er opfyldt. Den vigtigste forskel er at her kontrolleres betingelsen inden kommandoerne udføres, og hvis den ikke opfyldes udføres kommando sekvensen ikke. WHILE betingelse LOOP kommandoer der skal gentages... END LOOP; WHILE counter <= countto LOOP counter := counter + 1; maks := maks + counter; gennemsn := maks / counter; DBMS_OUTPUT.PUT_LINE('Maks: ' TO_CHAR(maks)); END LOOP; FOR loop Gentaget kommando sekvensen det antal gange der er angivet i FOR i sætningen ved hjælp af laveste og højeste værdi. Ved hjælp af operatoren REVERSE, kan man få løkken til at tælle ned i stedet for op. FOR tæller IN [REVERSE] fra..til LOOP kommandoer der skal gentages... END LOOP; FOR counter IN 1..countTo LOOP maks := maks + counter; gennemsn := maks / counter; DBMS_OUTPUT.PUT_LINE('Maks: ' TO_CHAR(maks)); END LOOP; Datamatikeruddannelsen forår 2007 Side 45 af 65

46 SQL kommandoer i PL/SQL blokke SELECT kommandoer SELECT kommandoen i PL/SQL er dem samme som anvendes i DBMS, bortset fra INTO der anvendes til at specificere hvilke variabler der skal tildeles værdiene der returneres. I nedenstående eksempel, vil der returneres fejl hvis søgeresultatet er tomt eller består af flere rækker. SELECT kolonnenavn1, kolonnenavn2... INTO variabel1, variabel2... FROM tabel WHERE betingelse DECLARE lname Employee.Lname%TYPE; fname Employee.Fname%TYPE; salary Employee.Salary%TYPE; BEGIN SELECT Lname, Fname, Salary INTO lname, fname, salary FROM Employee WHERE EmployeeId = &employeeid; DBMS_OUTPUT.PUT_LINE('Name: ' fname ' ' lname ' Salary: ' TO_CHAR(salary) ); END; INSERT kommandoer Her kan man benytte f.eks. predefinerede sekvenser eller SYSDATE for at indsætte dags dato. INSERT INTO tabel (kolonne1, kolonne2,...) VALUES (værdi1, værdi2,...); BEGIN INSERT INTO ROOM (room_type, roomdesc) VALUES ('&room', '&Description'); COMMIT; END; UPDATE kommandoer UPDATE tabel SET kolonne = værdi WHERE betingelse; BEGIN UPDATE student SET majorid = &major WHERE studentid = &studid; COMMIT; END; Datamatikeruddannelsen forår 2007 Side 46 af 65

47 DELETE kommandoer DELETE FROM ROOM WHERE room_type = '&type'; COMMIT; BEGIN DELETE FROM ROOM WHERE room_type = '&type'; COMMIT; END; Datamatikeruddannelsen forår 2007 Side 47 af 65

48 Cursors Eksplicit og Implicit Cursor PL/SQL Cursors og Exceptions Når en SQL kommando bliver afviklet i en PL/SQL blok, sætter Oracle af et arbejdsområde i RAM til denne. Dette arbejdsområde, kaldes en cursor. I denne lagres også resultatet af SQL kommandoen. En cursorer der oprettes automatisk af Oracle ved afvikling af en SQL kommando kaldes for en implicit cursor. Man kan selv oprette sine egne cursorer. Disse kaldes en eksplicit cursor. Implicit Cursor Oprettes automatisk ved afvikling af en SQL kommando. Adgangen til en implicit cursor er begrænset Operationer på en eksplicit cursor Der kan udføres 4 operationer på en eksplicit cursor: 1. Den kan erklæres (DECLARE) En cursor erklæres med en SQL kommando DECLARE CURSOR cursornavn IS SELECT kolonne1, kolonne2... FROM tabel WHERE udtryk [ORDER BY kolonne]; Eksplicit cursor Oprettes manuelt af brugeren. Erklæres som en SELECT kommando i en PL/SQL blok, der returnerer en eller flere rækker. Fuld kontrol over oprettelse, hentning og lukning DECLARE CURSOR Emp_name_cur IS SELECT EmployeeId, Lname, Fname FROM EMPLOYEE WHERE EmployeeId = 433; BEGIN...END; Eftersom en cursor er erklæret med en SELECT kommando, bliver den lænket til mindst en tabel. I en cursor kan man desuden oprette en tilhørende composite variabel record der oprettes med cursornavn%rowtype. Denne er en række som den er erklæret i SELECT kommandoen. 2. Den kan åbnes (OPEN) Når en cursor åbnes, udføres dens SELECT kommando, og resultatet overføres til cursorens resultatsæt. Cursoren peger på den 1. rækken i resultatsættet. OPEN cursornavn [(variabel)]; IF Emp_name_cur%ISOPEN = FALSE THEN OPEN Emp_name_cur; END IF; Bemærk IF..THEN sætningen, hvor det kontrolleres om cursoren allerede er åben. Datamatikeruddannelsen forår 2007 Side 48 af 65

49 3. Man kan hente rækker fra den (FECTH) Rækker hentes ved hjælp af kommandoen FETCH. Efter at cursoren er åbnet, og SELECT kommandoen er afviklet, peger cursoren på den første rækken i resultatsættet. FETCH kommandoen henter den rækken cursoren peger på, og flytter cursorens peger videre til den næste række i resultatsættet. FETCH cursornavn INTO variabel, variabel... recordnavn FETCH Emp_name_cur INTO emid, empln, empfn, empdpt; eller FETCH Emp_name_cur INTO employee_rec; Hvis man vælger at anvende FETCH til at lægge data i en PL/SQL record, skal denne erklæres i DECLARE sektionen ved hjælp af typen cursor%rowtype. F.eks employee_rec Emp_name_cur%ROWTYPE 4. Man kan lukke den (CLOSE) Når den PL/SQL blokken cursoren er erklæret i, afsluttes, lukkes cursoren normalt automatisk. Det er imidlertid en god ide at sørge for at lukke en cursor når man er færdig med den. CLOSE cursornavn; CLOSE Emp_name_cur; Attributter til eksplicit cursor Disse variabler kan anvendes til at få oplysninger om en cursors status. Attribut %ISOPEN %FOUND %NOTFOUND Anvendelse Returnerer TRUE hvis cursoren er åben. Returnerer TRUE hvis sidste FETCH operation returnerede en eller flere rækker. Ellers returneres FALSE. Returnerer TRUE hvis sidste FETCH operation ikke returnerede nogle rækker. Ellers returneres FALSE. %ROWCOUNT Returnerer antal rækker der er returneret, og inkrementeres hver gang en FETCH operation returnerer en række. Datamatikeruddannelsen forår 2007 Side 49 af 65

50 For løkker i cursors For løkker er den enkleste måde at anvende med en cursor. Cursoren åbnes automatisk når løkken påbegyndes. For hver iteration, udføres der automatisk en FETCH operation, der læser ind den næste række. Når der ikke er flere rækker, afsluttes løkken, og cursoren lukkes. FOR recordnavn IN cursornavn LOOP kommandoer... END LOOP; Anvendelse af FOR løkke FOR employeerec IN Emp_name_cur LOOP DBMS_OUTPUT.PUT_LINE('Id: ' TO_CHAR(employeeRec.EmployeeId) ' Name: ' employeerec.fname ', ' employeerec.lname ' Department: ' employeerec.deptid); END LOOP; Bemærk fravær af FETCH kommando og kontrol om løkken skal afsluttes. Dette sker automayisk i denne FOR løkke. Den enkelte række printes ud for hver iteration. Anvendelse af BASIC løkke LOOP FETCH Emp_name_cur INTO emid, empln, empfn, empdpt; EXIT WHEN Emp_name_cur%NOTFOUND; DBMS_OUTPUT.PUT_LINE('Id: ' TO_CHAR(emId) ' Name: ' empfn ', ' empln ' Department: ' empdpt); END LOOP; FETCH anvendes til at hente næste række i cursorens resultatsæt. I EXIT sætningen kontrolleres om noget blev hentet. Hvis ikke, afsluttes løkken. Så kan man printe ud resultatet. Cursor der anvender FOR løkker med subqueries I stedet for at deklarere en eksplicit cursor, kan man ved hjælp af en subquery i FOR løkken, anvende en uden at deklarere den først. Cursor der anvender implicit cursor med en subquery i FOR løkken DECLARE counter number := 0; BEGIN FOR employeerec IN (SELECT EmployeeId, Lname, Fname, DeptId FROM EMPLOYEE WHERE DeptId = &deptid) LOOP DBMS_OUTPUT.PUT_LINE('Id: ' TO_CHAR(employeeRec.EmployeeId) ' Name: ' employeerec.fname ', ' employeerec.lname ' Department: ' employeerec.deptid); counter := counter + 1; END LOOP; IF counter > 0 THEN DBMS_OUTPUT.PUT_LINE('Found: ' TO_CHAR(counter)); ELSE DBMS_OUTPUT.PUT_LINE('No employees in this department'); END IF; END; / Datamatikeruddannelsen forår 2007 Side 50 af 65

51 Låsning, opdatering og sletning af rækker i cursors Man kan låse de rækkerne der er læst ind i en cursor. OF clausen gør det muligt at specificere hvilke kolonner der skal opdateres. NOWAIT clausen gør det muligt at få oplyst om tabellen er låst, så man kan fortsætte med en anden opgave. CURSOR cursornavn IS SELECT kolonne1, kolonne2... FROM tabel WHERE betingelse FOR UPDATE [OF kolonne1, kolonne2...] [NOWAIT]; UPDATE og DELETE UPDATE og DELETE kan udføres på de rækker, der er læst ind i cursoren. WHERE CURRENT OF specificerer at opdatering/sletning kun sker på den række man arbejder på, dvs sidst hentet ved hjælp af FETCH. UPDATE TABLENAME SET kolonne = værdi WHERE CURRENT OF cursornavn; DELETE FROM tabelnavn WHERE CURRENT OF cursornavn; Cursor med parametre En cursor kan erklæres med parametre der gør det muligt at sende værdier til cursoren. Værdiene sendes til cursoren når den åbnes, og anvendes i SELECT kommandoen når denne udføres. CURSOR cursornavn (variabelnavn datatype) IS SELECT kolonne1, kolonne2... FROM EMPLOYEE WHERE DeptId = dpt;... OPEN cursornavn (variabelnavn); DECLARE... CURSOR Emp_name_cur (dpt EMPLOYEE.DeptId%TYPE) IS SELECT EmployeeId, Lname, Fname, DeptId FROM EMPLOYEE WHERE DeptId = dpt;... BEGIN IF Emp_name_cur%ISOPEN = FALSE THEN OPEN Emp_name_cur(dptId); END IF;... END; Ref cursor type En cursor variabel kan anvendes ved tildeling af værdi til en anden cursor variabel. For at dette skal være muligt, skal cursoren oprettes som en ref cursor. En cursor variabel kan både åbnes og man kan hente data ud af den ved hjælp af FETCH kommandoen. type cursor type IS REF CURSOR RETURN cursor data type; cursor navn cursor type; OPEN cursornavn/cursor navn FOR SELECT kommando FETCH cursornavn/cursor navn INTO variabel, variabel... recordnavn type employee_cursor_type IS REF CURSOR RETURN employee%rowtype; employee_cursor_var employee_cursor_type; OPEN employee_cursor_var SELECT EmployeeId, Lname, Fname, DeptId FROM EMPLOYEE FETCH employee_cursor_var INTO employee_rec Datamatikeruddannelsen forår 2007 Side 51 af 65

52 Exceptions Håndtering af exceptions i en PL/SQL blok, sker i en egen del af PL/SQL blokken. Når en exception opstår, flyttes kontrollen fra selve koden, til den delen af Exception blokken der håndterer den specifikke exception. DECLARE erklæringer af variabler, konstanter...exceptions BEGIN Kode der kan rejse exceptions EXCEPTION Håndtering af exceptions END; DECLARE Child EXCEPTION; Adult EXCEPTION; Senior EXCEPTION; age NUMBER := '&Age'; BEGIN IF age < 17 THEN RAISE Child; ELSIF age >= 18 AND AGE < 66 THEN RAISE Adult; ELSIF age >= 67 THEN RAISE Senior; END IF; EXCEPTION WHEN Child THEN DBMS_OUTPUT.PUT_LINE('Child'); WHEN Adult THEN DBMS_OUTPUT.PUT_LINE('Adult'); WHEN Senior THEN DBMS_OUTPUT.PUT_LINE('Senior'); END; En exception håndteres når navnet matcher den opståede exception. I ovenstående tilfælde, er der defineret 3 exceptions, Child, Adult og Senior. Disse rejses i programkoden. Når dette sker overføres kontrollen til exception sektionen i koden, nærmere bestemt til den WHEN clause der har fejlens navn som argument. Typer af Exceptions Pre defined server exceptions Dette er exceptions der er navngivet i PL/SQL, og rejses når der opstår fejl i PL/SQL eller DBMS. Der er ca 20 af disse exceptions, der hver har sin fejlkode. EXCEPTION WHEN NO_DATA_FOUND THEN DBMS_OUTPUT.PUT_LINE('No employee found'); END; Disse exceptions skal ikke erklæres, eller rejses specifikt i PL/SQL blokken, da de allerede er defineret. Datamatikeruddannelsen forår 2007 Side 52 af 65

53 Non pre defined server exceptions Dette er exceptions der har en fejlkode, men ikke har et navn. Sådanne exceptions kan enten fanges med WHEN OTHERS clausen eller ved egendefinerede exceptions. Non pre defined server exception EXCEPTION WHEN OTHERS THEN DBMS_OUTPUT.PUT_LINE('An error ocurred');... END; Egendefinerede exceptions DECLARE Child EXCEPTION;... BEGIN IF age < 17 THEN RAISE Child;... EXCEPTION WHEN Child THEN DBMS_OUTPUT.PUT_LINE('Child');... END; Egendefinerede exceptions skal både erklæres i DECLARE sektionen. De skal rejses eksplicit i selve PL/SQL sketionen Dette gøres ved RAISE kommandoen. Man skal selv egendefinerede exceptions i EXCEPTION sektionen. PRAGMA exception init PRAGMA er et compiler direktiv der forbinder et exception navn med en Oracle fejlkode. En PRAGMA exception bliver ikke håndteret i selve PL/SQL sektionen. Når en af disse exceptions opstår, overføres kontrollen til EXCEPTION sektionen. DECLARE exception navn EXCEPTION; PRAGMA EXCEPTION_INIT(exception navn, fejlkode);... WHEN exception navn THEN exception håndtering DECLARE dept_integrity_exception EXCEPTION; PRAGMA EXCEPTION_INIT(dept_integrity_exception, ); facid Faculty.facultyid%TYPE := &FacultyNo; BEGIN DELETE FROM Faculty WHERE facultyid = facid; COMMIT EXCEPTION WHEN dept_integrity_exception THEN DBMS_OUTPUT.PUT_LINE('Cant be deleted. Refernced records exist'); END; Datamatikeruddannelsen forår 2007 Side 53 af 65

54 Fange fejl kode og meddelelse Exceptions har 2 attributter der oplyser nærmere om den exception der er blevet rejst. Attribut SQLCODE SQLERRM Anvendelse Returnerer en negativ fejlkode. Nummeret kan anvendes i en variabel af typen NUMBER Returnerer fejlmeldingen der tilhører den rejste exception. Kan anvendes i en variabel af typen VARCHAR2 WHEN dept_integrity_exception THEN DBMS_OUTPUT.PUT_LINE('Cant be deleted. Refernced records exist'); DBMS_OUTPUT.PUT_LINE('Error: ' SQLCODE ' - ' SQLERRM); Raise_application_error procedure Proceduren raise_application_error, gør det muligt at definere excpetions, og anvende dem i et stored subprogram. RAISE_APPLICATION_ERROR(fejlkode, fejlmeddelelse) TRUE FALSE EXCEPTION WHEN NO_DATA_FOUND THEN RAISE_APPLICATION_ERROR(-2001, 'Employee does not exist' ; Fejlkoden skal være et heltal mellem og Fejlmeddelelsen en streng på maksimalt 512 bytes. TRUE FALSE er frivillig. FALSE er default, og betyder at denne exception erstatter andre exceptions. Datamatikeruddannelsen forår 2007 Side 54 af 65

55 PL/SQL Composite data typer Composite variabler i Oracle, er variabler der består af andre variabler. Dette kan være scalare eller composite variabler. Records En record kan sammenlignes med en række fra en tabel. Denne kan både bestå af scalare eller komposite variabler. Når den eklæres, kan man enten anvende datatyper direkte, eller datatyper til kolonner i tabeller ved hjælp af %TYPE attributten til en kolonne. En PL/SQL record kan være baseret på en cursor, en række i en tabel eller en bruger defineret record. Når man erklærer en record, kan man kopiere en række i en tabel ved at anvende %ROWTYPE attributten DECLARE TYPE recordtypeis RECORD (feltnavn variabeltype kolonnetype variabeltype ); Erklæring: recordnavn recordtype; Ved hjælp af %ROWTYPE recordnavn.tabel%rowtype DECLARE TYPE employee_record IS RECORD (EmpId NUMBER(3), EmpLN VARCHAR2(15), EmpFN VARCHAR2(15), EmpPos NUMBER(1), EmpDpt NUMBER(2) ); employee employee_record; record.feltnavn employee.empfn; Man tilgår et felt i en record ved hjælp af. notation, som i ovenstående eksempel. Denne notation TYPE employeesalary_record IS RECORD anvendes både ved læsning og skrivning til felterne. ( EmpSal NUMBER(6) ); Nested record Man kan anvende records som variabel i et felt i en anden record. Dette kan gøres som i det følgende eksempelet. Anvendelsen af nested records kan bidrage til at komplicerede datastrukturer bliver mere overskuelige. Sætte records til NULL Hvis man sætter en record til NULL, bliver alle dens felter også sat til NULL. employeerecord := NULL; TYPE employee_record IS RECORD (EmpId NUMBER(3), EmpIncome employeesalary_record ); eid es NUMBER(5); NUMBER(6); employee employee_record; income employeesalary_record; Nested record Datamatikeruddannelsen forår 2007 Side 55 af 65

56 Tables En PL/SQL tabel en en en-dimensional struktur, der består af 2 kolonner. En PK Værdi primærnøgle kolonne der ikke er tilgængelig, og en kolonne til data. Erklæring og oprettelse En PL/SQL tabel oprettes i 2 omgange. Først erklæres tabelle men en PL/SQL TYPE erklæring. I denne erklærer man både typenavnet til tabellen, og hvilke datatype den skal anvendes til. Der skal tilføjes en INDEX BY BINARY_INTEGER til Mr Mrs Ms typeerklæringen. Dette medfører at tabellem bliver indekseret, noget som gør adgangen til den hurtigere. TYPE Tabel_Type_Navn IS TABLE OF datatype INDEX BY binary_integer; TYPE positiontable_type IS TABLE OF POSITION.PosDesc%TYPE INDEX BY binary_integer; Derefter erklæres en tabel af den type man har oprettet i TYPE erklæringer. positiontable positiontable_type; I dette tilfældet består tabellen af den datatype der anvendes i POSITION tabellens description felt, hvilket er en VARCHAR2. Dette er en scalar variabel. Man kunne også have anvendt en composite variabel f.eks en record. Indsættelse af data. Tilgangen til de enkelte felter i en tabel sker ved hjælp af en indeks. Tallet der anvendes bliver afrundet til nærmeste heltal, hvis det drejer sig om et kommatal. Man kan også anvende et udtryk, hvor indeksen til det ønskede element udregnes, f.eks tabel(2*counter); I nedenstående eksempel fyldes tabellen ved hjælp af en FOR..løkke. Bemærk anvendelsen af en subquery til en cursor: FOR postionrec IN (SELECT PosDesc FROM POSITION) LOOP positiontable(counter) := postionrec.posdesc; counter := counter +1; END LOOP; Udskrift af de samme data: FOR counter IN 0..maks LOOP DBMS_OUTPUT.PUT_LINE('Position: ' to_char(positiontable(counter))); END LOOP; Bemærk anvendelsen af en counter til at inkrementere indeksnummeret til det element der får en ny værdi. Udover at anvende en løkke ved tildeling af værdier ti en tabel kan man anvende direkte tildeling, med syntaksen tabel(index) := værdi; positiontable(12) := 'Clerk'; eller man kan anvende en aggregatfunktion, hvilket indebærer at man tildeler en tabel værdierne i en anden tabel. Dette forudsætter naturligvis at tabellernes datatyper er kompatible. Dette medfører også at tabellen der tildeles data, taber alle data der var i tabellen inden tildelingen. Datamatikeruddannelsen forår 2007 Side 56 af 65

57 Funktioner i tabeller Tabeller har en række indebyggede metoder, der kan anvendes både til hentning og modificering af data i tabellen. Metode FIRST LAST COUNT PRIOR(n) NEXT(n) EXIST(n) TRIM TRIM(n) DELETE DELETE(n) DELETE(m,n) EXTEND EXTEND(n) EXTEND(n,m) Anvendelse Returnerer den første indeks i tabellen Returnerer den sidste indeks i tabellen Returnerer antal elementer i tabellen Returnere indeks nummeret før n Returnere indeks nummeret etter n Returnere TRUE hvis indeksnummer n findes i tabellen Fjerner tabellens sidste element Fjerner tabellens n sidste elementer Fjerner alle elementerne i tabellen Fjerner element nummer n fra tabellen Fjerner n elementer fra nummer m i tabellen Lægger et NULL element til tabellen Lægger n NULL elementer til tabellen Lægger n kopier af element nr m til tabellen Tabel bestående af records TYPE employee_record IS RECORD (EmpId NUMBER(3), EmpLN VARCHAR2(15), EmpFN VARCHAR2(15), ); --Typeerklæring af tabel af records TYPE employee_recordtable IS TABLE OF employee_record index by BINARY_INTEGER; --Erklæring: emprt employee_recordtable; Tabel bestående af tabeller --Typeerklæring af tabel af tabeller TYPE employee_recordtable_table IS TABLE OF employee_recordtable index by BINARY_INTEGER; --Erklæring: emprt_t employee_recordtable_table; Datamatikeruddannelsen forår 2007 Side 57 af 65

58 Varrays Varray er en forkortelse for Variable size Array, og er, som navnet indebærer, en array med variabler af samme type. Variablene kan være scalare eller composite variabler, også en varray. En varray er en en-dimensional, koblet, samling af objekter. Indeks i en varray starter på 1. Erklæring og oprettelse Som med tabel, oprettes en varray i to trin. Først oprettes en type varray, hvor man gir typen et navn, sætter antal elementer, og hvilken datatype der skal anvendes. TYPE varray_type_navn IS varray(n) OF datatype; TYPE courses_varray_type IS varray(32) OF COURSE.title%TYPE; Derefter oprettes en variabel af den erklærede type, og den nye varray initialiseres ved hjælp af := udtrykket. Inden initialiseringen, er varray NULL, og kan ikke anvendes. varray_navn varray_type := varray_type(); course_varray courses_varray_type := courses_varray_type(); Indsættelse af data. Når man skal indsætte elementer i en array, anvendes en indeks for at angive hvor i den nye værdi skal placeres. Inden der kan indsættes data, skal man kalde array'ens EXTEND metode. DECLARE -- Type erklæring TYPE courses_varray_type IS VARRAY(32) OF COURSE.title%TYPE; -- Erklæring course_varray courses_varray_type := courses_varray_type(); counter INTEGER := 0; maks INTEGER; BEGIN FOR coursedescrrec IN (SELECT title FROM COURSE) LOOP -- varray.extend metoden kaldes course_varray.extend; -- Data tilføjes det nye element course_varray(counter+1) := coursedescrrec.title; counter := counter +1; END LOOP; maks := counter; FOR counter IN 1..maks LOOP DBMS_OUTPUT.PUT_LINE(' Course No: ' to_char(counter) ' Title: ' course_varray(counter)); END LOOP; END; I tilæg til EXTEND, har varray en COUNT metode der returnerer antal elementer i array'en. Datamatikeruddannelsen forår 2007 Side 58 af 65

59 PL/SQL blokke Procedurer og funktioner er navngivne blokke, der kan kaldes udefra, f.eks fra en anden blok. Formålet med dette er at lave PL/SQL moduler, der kan kaldes og tage parametre. Navngivne PL/SQL blokke kompileres når de oprettes eller ændres. Procedurer En procedure er en PL/SQL blok der udfører en eller flere opgaver. Erklæring En procedure erklæres med flere sektioner. I den øverste sektion defineres de variabler der skal anvendes ved kald af proceduren. Disse kan være af 3 typer, IN, OUT og IN OUT. I IS sektionen defineres de variabler der skal anvendes i procedure. I BEGIN sektionen findes selve proceduren i PL/SQL kode I EXCEPTION sektionen er der håndteringer af exceptions. [CREATE [OR REPLACE] PROCEDURE procedurenavn [(parameter1 [,parameter2...])] IS [konstant/variabel erklæringer] [BEGIN sætninger [EXCEPTION exception] END [procedurenavn]; Ændre og slette procedure ALTER PROCEDURE employee_income_proc DROP PROCEDURE employee_income_proc Procedurevariabler IN OUT IN OUT Kald Variabler der sender værdier ind til proceduren. Variabler der returnerer værdier fra proceduren. Værdier der sender værdier ind til proceduren, og returnerer resultatet. CREATE OR replace PROCEDURE employee_income_proc (emid IN EMPLOYEE.employeeid%TYPE, empln OUT EMPLOYEE.Lname%TYPE, empfn OUT EMPLOYEE.Fname%TYPE, total_income OUT number) IS empid EMPLOYEE.employeeid%TYPE; EmpSal EMPLOYEE.Salary%TYPE; EmpCom EMPLOYEE.Commission%TYPE; BEGIN SELECT EmployeeId, Lname, Fname, Salary, commission INTO empid, empln, empfn, EmpSal, EmpCom FROM EMPLOYEE WHERE EmployeeId = emid; END; IF EmpCom > 0 THEN total_income := EmpSal + EmpCom; ELSE total_income := EmpSal; END IF; En procedure kaldes ved dens navn, og angivelse af parametre i en parentes. procedurenavn(parameter1, parameter2...); procedurenavn(emid => 433, parameter2...); employee_income_proc(emid, emln, emfn, emtotincome); Parametrene kan angives i den samme rækkefølge de er erklæret i, positions notation, eller navgivnings notation, hvor man anvender værdiens navn og tildelingsoperatoren =>. Datamatikeruddannelsen forår 2007 Side 59 af 65

60 Funktioner En funktion er en PL/SQL blok der udfører en operation, og returnerer en værdi. En FUNKTION skal derfor indeholde en RETURN statement, og return datatype skal medtages i erklæringen af en funktion. Man kan godt anvende OUT og IN OUT parametre i en FUNKTION, men det er ikke god programmeringsskik. Erklæring En funktion erkæres på samme måde som en procedure, men erklæringen skal indeholde en RETURN clause blandt erklæringen af parametre og i selve kroppen i form af en RETURN statement der returnerer den værdi funktionen nu skal returnere. [CREATE [OR REPLACE] FUNCTION funktionsnavn [(parameter1 [,parameter2...])] RETURN Datatype IS [konstant/variabel erklæringer] [BEGIN sætninger RETURN værdi [EXCEPTION exception RETURN værdi] END [funktionsnavn]; Ændre og slette procedure ALTER FUNCTION employee_income_proc DROP FUNCTION employee_income_proc Procedurevariabler IN OUT IN OUT Variabler der sender værdier ind til proceduren. Anvendes ikke i en funktion. Anvendes ikke i en funktion. CREATE OR REPLACE FUNCTION employee_income_function ( emid IN EMPLOYEE.employeeid%TYPE ) RETURN number IS empid EMPLOYEE.employeeid%TYPE; EmpSal EMPLOYEE.Salary%TYPE; EmpCom EMPLOYEE.Commission%TYPE; total_income number; BEGIN SELECT EmployeeId, Salary, Commission INTO empid, EmpSal, EmpCom FROM EMPLOYEE WHERE EmployeeId = emid; IF EmpCom > 0 THEN total_income := EmpSal + EmpCom; ELSE total_income := EmpSal; END IF; RETURN total_income; END employee_income_function; Kald Eftersom et kald af en funktion returnerer en værdi, kan et sådant kald anvende der hvor man kan anvende værdier eller variabler. Det betyder at et funktionskald kan indgå i en tildeling af værdi til en variabel, en SQL sætning eller i et udtryk hvor værdier sammenlignes. F.eks. en IF..THEN sætning. funktionsnavn((parameter1, parameter2...); Tildeling af værdi emtotincome := employee_income_function(emid); Sammenligning IF employee_income_function(emid) > 100 SQL sætning SELECT employee_income_function(emid) FROM DUAL Datamatikeruddannelsen forår 2007 Side 60 af 65

61 Packages samling af objekter og procedurer En pakke er en samling af PL/SQL objekter. Objekterne i en pakke er grupperet i BEGIN..END blokke, og kan bestå af Cursors Scalare og Composite variabler og konstanter Exception navne Typedeklarationer for records og tabeller Procedurer og funktioner Pakker er modulære af natur. Oracle har mange pre definerede pakker, som f.eks. DBMS_OUTPUT og SYSTEM. En pakke består af en header og en krop, der erklæres separat. De objekter der erlæres i headeren skal imidlertid kunne genfindes i kroppen, hvor de er defineret. Package header Denne indeholder ingen kode, kun en specifikation af de objekter der udgør pakkens indhold. Disse kaldes public objects. CREATE [OR REPLACE] PACKAGE pakkenavn IS [constant, variable og type erklæringer] [exception erklæringer] [cursor specifikationer] [funktion...] [procedure...] END [pakkenavn]; CREATE OR REPLACE PACKAGE EmpPackage IS PROCEDURE employee_income_procpp (emid IN EMPLOYEE.employeeid%TYPE, empln OUT EMPLOYEE.Lname%TYPE, empfn OUT EMPLOYEE.Fname%TYPE, total_income OUT number); FUNCTION employee_income_functionpp ( emid IN EMPLOYEE.employeeid%TYPE ) RETURN number; END EmpPackage; Kald Man kalder pakkens komponenter, f.eks procedurer og funktioner. Dette gøre ved hjælp af. notation, hvor man starter med pakkens navn og derefter modul. Parametre angives i parenteser. Funktion i package Procedure i package Systempakken DBMS_OUTPUT EmpPackage.employee_income_procPP(employeeid, empln, empfn, totinc); totinc := EmpPackage.employee_income_functionPP(empId); DBMS_OUTPUT.PUT_LINE( ' employeeid ' TO_CHAR(empId) ); Datamatikeruddannelsen forår 2007 Side 61 af 65

62 Package body Pakkens krop, indeholder PL/SQL koden til de objekterne der findes i pakkens header. Denne delen af pakken, kaldes pakkens private eller hidden module, eftersom den ikke er synlig udenfor pakken. CREATE [OR REPLACE] PACKAGE BODY pakkenavn IS [konstant, variabel og datatype erklæring] [excpetion specifikation] [cursor specifikation] [function specifikation] [procedure specifikation] END pakkenavn; CREATE OR REPLACE PACKAGE BODY EmpPackage IS PROCEDURE employee_income_procpp (emid IN EMPLOYEE.employeeid%TYPE, empln OUT EMPLOYEE.Lname%TYPE, empfn OUT EMPLOYEE.Fname%TYPE, total_income OUT number) IS empid EMPLOYEE.employeeid%TYPE; EmpSal EMPLOYEE.Salary%TYPE; EmpCom EMPLOYEE.Commission%TYPE; BEGIN SELECT EmployeeId, Lname, Fname, Salary, Commission INTO empid, empln, empfn, EmpSal, EmpCom FROM EMPLOYEE WHERE EmployeeId = emid; IF EmpCom > 0 THEN total_income := EmpSal + EmpCom; ELSE total_income := EmpSal; END IF; END; FUNCTION employee_income_functionpp ( emid IN EMPLOYEE.employeeid%TYPE ) RETURN number IS empid EMPLOYEE.employeeid%TYPE; EmpSal EMPLOYEE.Salary%TYPE; EmpCom EMPLOYEE.Commission%TYPE; total_income number; BEGIN SELECT EmployeeId, Salary, Commission INTO empid, EmpSal, EmpCom FROM EMPLOYEE WHERE EmployeeId = emid; IF EmpCom > 0 THEN total_income := EmpSal + EmpCom; ELSE total_income := EmpSal; END IF; RETURN total_income; END employee_income_functionpp; END EmpPackage; Datamatikeruddannelsen forår 2007 Side 62 af 65

63 Triggers En trigger er en PL/SQL blok der bliver kørt ved udførelsen af SQL sætninger. Triggers kan sættes til at blive kørt før eller efter en SQL kommando som INSERT, UPDATE eller DELETE. Eksekvering af en trigger kaldes også firing the trigger. Erklæring [CREATE [OR REPLACE] TRIGGER triggernavn BEFORE AFTER INSTEAD OF triggeringevent ON tabel view [FOR EACH ROW] [WHEN betingelse] DECLARE erklæringer BEGIN PL/SQL-sætninger [EXCEPTION exception] END; CREATE OR REPLACE TRIGGER stud_adu_trigger AFTER DELETE OR UPDATE ON STUDENT Kropp: Output fra SQL*Plus efter anvendelse af UPDATE med TRIGGER SQL> update STUDENT set last='joyce' where studentid='00700'; 1 row updated. SQL> commit; Commit complete. SQL> select * from TRANSACTIONLOG; TABLENAME TRANSTYPE USERNAME TRANSDAT STUDENT UPDATE VIDARJB SQL> Navnekonvention Navne til TRIGGERS følger en bestemt konvention: DECLARE transtype varchar2(16); BEGIN IF deleting THEN transtype := 'DELETE'; ELSIF updating THEN transtype := 'UPDATE'; END IF; INSERT INTO TRANSACTIONLOG VALUES ('STUDENT', transtype, user, sysdate); END; tabelnavn_type_trigger student_adu_trigger Type konstrueres efter SQL kommando og tidspunkt. En trigger efter en INSERT, vil derfor hedde AI. En trigger før en UPDATE vil hedde BU. I ovenstående eksempel drejer det sig om en trigger efter en DELETE eller UPDATE, hvorfor typen er AUU. Man taler om AFTER og BEFORE triggers eftersom om de bliver kørt før eller after SQL kommandoen. Begrensninger Man kan ikke anvende kommandoen til TRANSACTION CONTROL, som commit eller rollback, i en trigger. De kan ikke erklæres med LONG eller LONG RAW datatyperne. Datamatikeruddannelsen forår 2007 Side 63 af 65

64 INSTEAD OF trigger Dette er en speciel trigger, der kan anvendes hvis man ønsker at udføre en UPDATE eller DELETE på kolonner i et VIEW. Dette er normalt ikke tilladt. Ved at anvende en INSTEAD OF trigger kan man imidlertid omgå denne regel. Nedenstående eksempel arbejder på et VIEW employeedept INSTEAD OF Trigger: CREATE OR REPLACE TRIGGER empdept_update_iou INSTEAD OF DELETE ON employeedept FOR EACH ROW BEGIN DELETE FROM DEPT WHERE DeptId = :OLD.DeptId; END; View: CREATE OR REPLACE VIEW employeedept AS SELECT e.employeeid, e.lname, e.fname, d.deptid, d.deptname, d.location FROM EMPLOYEE e, DEPT d WHERE e.deptid = d.deptid; Bemærk at triggeren henter data fra pseudokolonne :OLD, der får værdien fra den slettede række. Derefter kan rækken slettes direkte fra DEPT tabellen, i stedet for employeedept. Triggers og sequences Triggers ved INSERT, kan med fordel anvendes sammen med sequences. Hvis et af tabellens felter automatisk skal fyldes med en værdi der bliver generet i en sequence, kan dette gøres med en trigger der udføres umiddelbart inden INSERT. Inden selve insætningen anvendes en sequence til at generere værdien der skal indsættes. Dette kan efterfølgende gøres ved hjælp af INSERT. Trigger CREATE OR REPLACE TRIGGER employee_bi_trigger BEFORE INSERT ON employee FOR EACH ROW DECLARE empid EMPLOYEE.employeeId%TYPE; BEGIN SELECT Emplyoee_emplyoeeId_seq.nextval INTO empid FROM DUAL; :NEW.employeeId := empid; :NEW.hiredate := sysdate; END; Output fra SQL*Plus: Sequence SQL> CREATE SEQUENCE Emplyoee_emplyoeeId_seq INCREMENT BY 5 START WITH 435 NOORDER; SQL> INSERT INTO EMPLOYEE (Lname, Fname, PositionId, Supervisor, Salary, Commission, DeptId, QualId) VALUES ('Everett', 'Rupert', 3, 543, 20200, 1000, 20, 3); 1 row created. SQL> SELECT EMPLOYEEID, LNAME, FNAME, HIREDATE FROM employee WHERE LNAME='Everett'; EMPLOYEEID LNAME FNAME HIREDATE Everett Rupert SQL> Datamatikeruddannelsen forår 2007 Side 64 af 65

65 Data dictionnary views Oracle vedligeholder et Data Dictionnary med informationer om PL/SQL blokke. Man kan lave forespørgeler i dette for at få informationer om sine PL/SQL objekter. SELECT Object_Name, Procedure_Name FROM USER_PROCEDURES; SELECT Trigger_Name, Trigger_Type, Triggering_Event, Table_Name, Trigger_Body FROM USER_TRIGGERS; SELECT Name, Type, Line, Text FROM USER_SOURCE; SELECT OBJECT_NAME, OBJECT_TYPE FROM USER_OBJECTS; SELECT NAME, TYPE, SEQUENCE, LINE, POSITION FROM USER_ERRORS; Datamatikeruddannelsen forår 2007 Side 65 af 65

Begrænsninger i SQL. Databaser, efterår 2002. Troels Andreasen

Begrænsninger i SQL. Databaser, efterår 2002. Troels Andreasen Databaser, efterår 2002 Begrænsninger i SQL Troels Andreasen Datalogiafdelingen, hus 42.1 Roskilde Universitetscenter Universitetsvej 1 Postboks 260 4000 Roskilde Telefon: 4674 2000 Fax: 4674 3072 www.dat.ruc.dk

Læs mere

De vigtigste SQL-sætninger. SQL kap Oprette database. DDL og DML

De vigtigste SQL-sætninger. SQL kap Oprette database. DDL og DML SQL kap 6-7 + 17-20 DDL og DML 1 De vigtigste SQL-sætninger Data Definition Language (DDL) create table: opretter en ny tabel create unique index: tilføjer et index til en tabel drop table : sletter en

Læs mere

En Kort Introduktion til Oracle

En Kort Introduktion til Oracle En Kort Introduktion til Oracle Henrik Bulskov 12. februar 2001 [email protected] 1 Start SQL*Plus... 1 1.1 TELNET... 1 1.2 WINDOWS SQL PLUS... 2 2 Kør et SQL-script... 3 3 Hjælp i SQL*Plus... 3 4 Editering

Læs mere

Introduktion til SQL queries

Introduktion til SQL queries Denne guide er oprindeligt udgivet på Eksperten.dk Introduktion til SQL queries Denne artikel beskriver nogle forskellige muligheder i SQL queries. Eksemplerne skulle gerne være standard SQL og virke i

Læs mere

DB undervisning 01-01

DB undervisning 01-01 Databaser... 2 Tabeller... 2 Redundans... 3 Første regel... 4 Anden regel... 4 Tredje regel... 5 Relationer... 5 Opskrift... 6 SQL sætninger til at oprette tabeller... 7 SQL sætninger til at indsætte data...

Læs mere

Databaseadgang fra Java

Databaseadgang fra Java Databaseadgang fra Java Grundlæggende Programmering med Projekt Peter Sestoft Fredag 2007-11-23 Relationsdatabasesystemer Der er mange databaseservere Microsoft Access del af Microsoft Office MySQL god,

Læs mere

Introduktion til Oracle, Datalogi, RUC Af: Jens Lauterbach ([email protected]) 2002

Introduktion til Oracle, Datalogi, RUC Af: Jens Lauterbach (jeans@ruc.dk) 2002 Introduktion til Oracle, Datalogi, RUC Af: Jens Lauterbach ([email protected]) 2002 På datalogi har vi en databaseserver, som de studerende på datalogi kan benytte til projekter og som også benyttes i forbindelse

Læs mere

Listen over reserverede ord er meget lang, men de væsentligste vil jeg beskrive her i denne artikel:

Listen over reserverede ord er meget lang, men de væsentligste vil jeg beskrive her i denne artikel: Denne guide er oprindeligt udgivet på Eksperten.dk SQL og ASP En artikel omkring simpel SQL og hvordan disse opbygges, udformes og udføres, sådan at man kan få et brugbart resultat i ASP. Dette ligefra

Læs mere

Views etc. Databaser

Views etc. Databaser Views etc. Databaser Views Med Views kan vi gemme nogle af de lange select sætninger. I vores eksempel fra tidligere er det f.eks. forbundet med en del besvær at finde telefon nr og bilmærker for en sælger

Læs mere

Skriftlig eksamen i kurset. Informationssystemer

Skriftlig eksamen i kurset. Informationssystemer 6. semester sundhedsteknologi Skriftlig eksamen i kurset Informationssystemer Der er 3 timer til at besvare opgaven. Alle hjælpemidler er tilladte. Skriv kort og præcist. Referer gerne til kursuslitteraturen.

Læs mere

En opsamling af artefakter for Hotel Databasen som REST-service Bygger på Hotel opgaven i 8 trin

En opsamling af artefakter for Hotel Databasen som REST-service Bygger på Hotel opgaven i 8 trin En opsamling af artefakter for Hotel Databasen som REST-service Bygger på Hotel opgaven i 8 trin Trin 1: Lav en Domain model Opgave beskrivelse - Scandic hotel kæde Lav en domain model af Hotel-kæden.

Læs mere

Eksempel på en database: studenter, kurser, eksamener

Eksempel på en database: studenter, kurser, eksamener Udvidet Programmering 1999 Forelæsning 20, fredag 12. november 1999 Relationsdatabaser: relationer, tupler, attributter Forespørgselssproget SQL Databasesystemet PostgreSQL Tilgang til relationsdatabaser

Læs mere

Side 1. Databaser og SQL. Dagens gang. Databasebegreber. Introduktion til SQL Kap 1-5

Side 1. Databaser og SQL. Dagens gang. Databasebegreber. Introduktion til SQL Kap 1-5 Databaser og SQL Introduktion til SQL Kap 1-5 1 Dagens gang Databaser Database begreber Mapning af klasser til relationel model Normalisering Opgaver til næste gang 2 Databasebegreber A database is a:

Læs mere

PHP 3 UGERS FORLØB PHP, MYSQL & SQL

PHP 3 UGERS FORLØB PHP, MYSQL & SQL PHP 3 UGERS FORLØB PHP, MYSQL & SQL Uge 1 & 2 Det basale: Det primære mål efter uge 1 og 2, er at få forståelse for hvordan AMP miljøet fungerer i praksis, og hvordan man bruger PHP kodesproget til at

Læs mere

Data lagring. 2. iteration (implement backend)

Data lagring. 2. iteration (implement backend) Data lagring 2. iteration (implement backend) Emner Grundlæggende database begreber. Data definitionskommandoer ER-diagrammer og cardinalitet/relationer mellem tabeller Redundant data og Normalisering

Læs mere

Eksamen, DSDS, efterår 2008

Eksamen, DSDS, efterår 2008 Eksamen, DSDS, efterår 2008 Introduktion til Scripting, Databaser og Systemarkitektur Jonas Holbech IT Universitetet i København 6. januar 2009 Alle hjælpemidler er tilladte, dog ikke computer og kommunikationsmidler.

Læs mere

1. Basal select med (stjerne)

1. Basal select med (stjerne) 1. Basal select med (stjerne) 1. List alle øltyper. a. select * from oltyper 2. List alle bryggerier a. select * from bryggeri 3. List alle Danmarks postnumre samt tilhørende by, landsdel og antal indbyggere

Læs mere

Eksamen, DSDS, efterår 2007

Eksamen, DSDS, efterår 2007 Eksamen, DSDS, efterår 2007 Introduktion til Scripting, Databaser og Systemarkitektur Jonas Holbech og Martin Elsman IT Universitetet i København 7. januar 2008 Alle hjælpemidler er tilladte, dog ikke

Læs mere

Øvelse 9. Klasser, objekter og sql-tabeller insert code here

Øvelse 9. Klasser, objekter og sql-tabeller insert code here Øvelse 9. Klasser, objekter og sql-tabeller Denne opgave handler om hvordan man opbevarer data fra databasekald på en struktureret måde. Den skal samtidig give jer erfaringer med objekter, der kommer til

Læs mere

Rigtig SQL Programmering

Rigtig SQL Programmering Rigtig SQL Programmering 1 SQL i Rigtige Programmer Indtil nu har vi brugt SQL direkte i kommandolinje promt/gui program, hvor vi kan lave forespørgsler til databasen I virkeligheden: Programmer kontakter

Læs mere

Introduktion til programmering

Introduktion til programmering Introduktion til programmering Databaser Uge 38 L. Ingemann: SQL databaser på nettet, kap 2-4. Kompendium L. Ingemann: SQL databaser på nettet, kap 6-20, Kompendium Sidste gang Databaser Relationelle databaser

Læs mere

Skriftlig opgave. Designtanker i database-nære systemer

Skriftlig opgave. Designtanker i database-nære systemer Skriftlig opgave til eksamen for faget»databaser«designtanker i database-nære systemer Martin Ancher Holm Juni 2010 1 Intro Denne skriftlige opgave indeholder kort de daglige tanker jeg har omkring design

Læs mere

Datamodeller. 1. Elementerne. Vi betragter E/R-diagrammet, som et diagram over entiteter og relationer Tegneregler: Entitet

Datamodeller. 1. Elementerne. Vi betragter E/R-diagrammet, som et diagram over entiteter og relationer Tegneregler: Entitet Datamodeller I forlængelse af noten om normalisering, følges der her op med redskabet E/R-diagrammer til opstilling af en datamodel, opfat således dette som en alternativ metode mere end endnu et redskab

Læs mere

Databasesystemer. Databaser, efterår Troels Andreasen. Efterår 2002

Databasesystemer. Databaser, efterår Troels Andreasen. Efterår 2002 Databaser, efterår 2002 Databasesystemer Troels Andreasen Datalogiafdelingen, hus 42.1 Roskilde Universitetscenter Universitetsvej 1 Postboks 260 4000 Roskilde Telefon: 4674 2000 Fax: 4674 3072 www.dat.ruc.dk

Læs mere

Anvisning i aflevering af bitemporale data

Anvisning i aflevering af bitemporale data UDKAST udgivet juni 2019 Anvisning i aflevering af bitemporale data Baggrund Aflevering af data fra it-systemer til et offentligt arkiv er baseret på aflevering af en arkiveringsversion i en relationel

Læs mere

Database. lv/

Database. lv/ Database 1 Database Design Begreber 1 Database: En fælles samling af logiske relaterede data (informationer) DBMS (database management system) Et SW system der gør det muligt at definer, oprette og vedligeholde

Læs mere

Bemærk! Et PHP script har kun brug for at forbinde én gang til databaseserveren. Det kan så sagtens udføre flere kommandoer vha. denne forbindelse.

Bemærk! Et PHP script har kun brug for at forbinde én gang til databaseserveren. Det kan så sagtens udføre flere kommandoer vha. denne forbindelse. Mysqli Webintegrator Når vi arbejder med server-side scripting ( i vort tilfælde PHP), har vi ofte behov for at kunne tilgå data, som vi opbevarer i en database. Det kan f.eks. dreje sig om nyhederne i

Læs mere

Databasesystemer. IT Universitetet i København 8. juni 2006

Databasesystemer. IT Universitetet i København 8. juni 2006 Databasesystemer IT Universitetet i København 8. juni 2006 Eksamenssættet består af 5 opgaver med 16 spørgsmål, fordelt på 7 sider (inklusiv denne side), samt et svarark, hvorpå visse spørgsmål skal besvares.

Læs mere

Database programmerings tips

Database programmerings tips Denne guide er oprindeligt udgivet på Eksperten.dk Database programmerings tips Denne artikel vil introducere nogle problem stillinger med flere samtidige brugere, som man skal tænke på, når man udvikler

Læs mere

Indholdsfortegnelse Databaser og PHP... 3 Opgave... 4 Opgave... 5 Opgave... 6 Sidste opgave er en lille gæstebog... 7 Kilder og nyttige links:...

Indholdsfortegnelse Databaser og PHP... 3 Opgave... 4 Opgave... 5 Opgave... 6 Sidste opgave er en lille gæstebog... 7 Kilder og nyttige links:... Indholdsfortegnelse Databaser og PHP... 3 Opgave... 4 Opgave... 5 Opgave... 6 Sidste opgave er en lille gæstebog... 7 Kilder og nyttige links:... 9 Nogle HTML tags... 9 Databaser og PHP Når vi snakker

Læs mere

Skriftlig eksamen i. Databaser. Vinter 2002/2003. Vejledende løsninger

Skriftlig eksamen i. Databaser. Vinter 2002/2003. Vejledende løsninger Skriftlig eksamen i Databaser Vinter 2002/2003 Vejledende løsninger Dette eksamenssæt består af 5 nummererede sider (incl. denne). Der er 5 opgaver, som ved bedømmelsen tillægges følgende vægte: Opgave

Læs mere

Anne Randorff Højen

Anne Randorff Højen Anne Randorff Højen [email protected] Forelæsning og opgaver: Introduktion til SQL pause Forlæsning og Opgaver: SQL 2. del pause Introduktion til PhPMyAdmin Opgaver SQL Der modelleres ud fra reelle relationer

Læs mere

Dokumentering af umbraco artikeleksport:

Dokumentering af umbraco artikeleksport: Dokumentering af umbraco artikeleksport: Lav en artikel side 2-3. Installationsguide side 3-5. Opsættelse af databasen og web.config side 5-8. Umbraco: templates side 8. Umbraco: borger.dk tab side 8.

Læs mere

Introduktion til SQL

Introduktion til SQL Introduktion til SQL Introduktion til SQL 1. udgave, 1. oplag 2013 Copyright 2013 Libris Media A/S Forfatter: Bobby Henningsen Forlagsredaktion: Peter Wiwe og Louise Peulicke Larsen Omslag: Louise Peulicke

Læs mere

Kursus/workshop: SQL

Kursus/workshop: SQL Kursus/workshop: SQL En workshop - med fokus på workshop. En workshop arrangeret af PROSA Palle Nygaard Hansen Frank Jensen Indledning Gennemgang af alle basale SQL-sætninger Forløb for alle 3 aftener:

Læs mere

Database kursus Forår 2013

Database kursus Forår 2013 Database kursus Forår 2013 Jacob Aae Mikkelsen Database design og programmering/databaser fra Organisationsorienteret softwareudvikling 1 Praktisk info Lærebog Database Systems: The Complete Book Skema

Læs mere

Python programmering. Per Tøfting. MacFest

Python programmering. Per Tøfting. MacFest Python programmering MacFest 2005 Per Tøfting http://pertoefting.dk/macfest/ Indhold Måder at afvikle Python program på Variabler Data typer Tal Sekvenser Strenge Tupler Lister Dictionaries Kontrolstrukturer

Læs mere

Søren Løbner (lobner) ddb Databaser 2007 10 10

Søren Løbner (lobner) ddb Databaser 2007 10 10 ddb Excercise Week 4 Fra relationships til relations Nu når vi har fået vores skemaer på plads, kan SQL udtrykkene til konstruktion af relationerne laves Det foregår ved at vi tager en 1 til 1 oversættelse

Læs mere

MsSQL: Basal performance tuning, part 1

MsSQL: Basal performance tuning, part 1 Denne guide er oprindeligt udgivet på Eksperten.dk MsSQL: Basal performance tuning, part 1 Hvordan man skriver "God SQL" for bedre performance. Skrevet den 03. Feb 2009 af trer I kategorien Databaser /

Læs mere

Kursusbeskrivelse. Forarbejde. Oprettelse af en Access-database

Kursusbeskrivelse. Forarbejde. Oprettelse af en Access-database Kursusbeskrivelse Oprettelse af en Access-database Som eksempel på en Access-database oprettes en simpelt system til administration af kurser. Access-databasen skal indeholde: et instruktørkartotek et

Læs mere

Introduktion til programmering

Introduktion til programmering Introduktion til programmering Databaser Uge 37 Computer Science, kap 9. Hugh Darwen: what a database really is, G. Riccardi: Princples of database systems, kap 2., kompendium. Plan Oprette jer på IMV

Læs mere

Database design for begyndere

Database design for begyndere Denne guide er oprindeligt udgivet på Eksperten.dk Database design for begyndere Denne artikel beskriver hvordan man kommer fra ide til database design. Den stopper inden normal former. Den forudsætter

Læs mere

Sproget Six. Til brug i rapportopgaven på kurset Oversættere. Vinter 2006. Abstract

Sproget Six. Til brug i rapportopgaven på kurset Oversættere. Vinter 2006. Abstract Sproget Six Til brug i rapportopgaven på kurset Oversættere Vinter 2006 Abstract Six er baseret på det sprog, der vises i figur 6.2 og 6.4 i Basics of Compiler Design. Den herværende tekst beskriver basissproget

Læs mere

MapBasic brugergruppe. Geografiske objekter. Peter Horsbøll Møller Senior Systems Engineer April 2013

MapBasic brugergruppe. Geografiske objekter. Peter Horsbøll Møller Senior Systems Engineer April 2013 MapBasic brugergruppe Geografiske objekter Slå mute fra hvis I vil sige eller spørge om noget Peter Horsbøll Møller Senior Systems Engineer April 2013 Program MapBasic IDE som udviklingsværktøj Geografiske

Læs mere

SQL Server 2016 Data Adgang

SQL Server 2016 Data Adgang SQL Server 2016 Data Adgang MSBIP, 5. OKTOBER, 2015 Agenda SQL Server 2016 CTP 2.3 Pragmatisk Data Adgangskontrol Row Level Security Dynamic Masking Kombination af begge Alternativet Hvem er jeg Selvstændig

Læs mere

PHP Snippets. De små korte. Skrevet af Daniel Pedersen

PHP Snippets. De små korte. Skrevet af Daniel Pedersen PHP Snippets De små korte Skrevet af Daniel Pedersen Indhold PHP Snippets De små korte er en samling af små og praktiske kode eksempler med kort forklaring, som med formål at kunne benyttes til opsalgsværk

Læs mere

Manglende konsistens i datamodellen og upræcise SQLsætninger er årsagen til, at mange IT-systemer fejler.

Manglende konsistens i datamodellen og upræcise SQLsætninger er årsagen til, at mange IT-systemer fejler. Manglende konsistens i datamodellen og upræcise SQLsætninger er årsagen til, at mange IT-systemer fejler. Af Seniorkonsulent Carsten Saastamoinen-Jakobsen Skal datamodellen blot være på 3NF (normalform)?

Læs mere

3. semester, 2. projekt: Database

3. semester, 2. projekt: Database 3. semester, 2. projekt: Database MulA - Gruppe 1 7. september 2015-20. september 2015 Vejledere - IRF / TUJE FAKTAARK PROJEKTTITEL Database URL http://moodings.com Mette Line Tarp Jørgensen Email [email protected]

Læs mere

Software Projekt NoSQL vs RMDB

Software Projekt NoSQL vs RMDB Software Projekt NoSQL vs RMDB Skrevet af Carsten Sørensen, Hans Jørgen Frandsen, Peter Haislund Department of Computer Science, University of Aarhus Aabogade 34, 8200 Arhus N, Denmark 201200089, 19960442,

Læs mere

Fra ER-Diagram til Relationel model i 7 step

Fra ER-Diagram til Relationel model i 7 step Fra ER-Diagram til Relationel model i 7 step STEP 1: For regular entity type E in ER schema, create a relation R that includes all the simple attributes, and component attributes of composite attributes.

Læs mere

Database for udviklere. Jan Lund Madsen PBS10107

Database for udviklere. Jan Lund Madsen PBS10107 Database for udviklere Jan Lund Madsen PBS10107 Indhold LINQ... 3 LINQ to SQL og Arkitektur... 3 O/R designere... 5 LINQ Den store introduktion med.net 3.5 er uden tvivl LINQ(udtales link): Language-INtegrated

Læs mere

Samspillet mellem databaser og kort styres af GeoCAD programmet GeoDB.

Samspillet mellem databaser og kort styres af GeoCAD programmet GeoDB. GeoCad modul GeoDB I GeoCAD er det muligt at koble relationsdatabase til GeoEDIT. Her igennem er det muligt at lagre forskellige oplysninger i databasen og koble disse oplysninger til objekter i kortet.

Læs mere

ER-modellen. Databaser, efterår 2002. Troels Andreasen. Efterår 2002

ER-modellen. Databaser, efterår 2002. Troels Andreasen. Efterår 2002 Databaser, efterår 2002 ER-modellen Troels Andreasen Datalogiafdelingen, hus 42.1 Roskilde Universitetscenter Universitetsvej 1 Postboks 260 4000 Roskilde Telefon: 4674 2000 Fax: 4674 3072 www.dat.ruc.dk

Læs mere

Skriftlig eksamen i Databaser, Vinter 2001/2002. Pa opfordring har jeg udarbejdet mulige lsninger pa eksamensopgaverne, men

Skriftlig eksamen i Databaser, Vinter 2001/2002. Pa opfordring har jeg udarbejdet mulige lsninger pa eksamensopgaverne, men Roskilde Universitetscenter Skriftlig eksamen i Databaser, Vinter 2001/2002 Opgaver med lsninger Pa opfordring har jeg udarbejdet mulige lsninger pa eksamensopgaverne, men har ikke haft tid til at polere

Læs mere

MySQL C API. Denne artikel beskriver hvordan man bruger MySQL C API. Der er beskrivelse af build med forskellige compilere.

MySQL C API. Denne artikel beskriver hvordan man bruger MySQL C API. Der er beskrivelse af build med forskellige compilere. Denne guide er oprindeligt udgivet på Eksperten.dk MySQL C API Denne artikel beskriver hvordan man bruger MySQL C API. Der er beskrivelse af build med forskellige compilere. Den forudsætter lidt kendskab

Læs mere

Funktions opdatering 4.5.01 ASPECT4 QueryManager (B=fejl, S=support/Info, T=Opgave, W=Releaseønske)

Funktions opdatering 4.5.01 ASPECT4 QueryManager (B=fejl, S=support/Info, T=Opgave, W=Releaseønske) ASPEC4 QueryManager (B=fejl, S=support/Info, =Opgave, =Releaseønske) 00001289 Dags dato som standardværdi Standardværdierne for datofelter i en rekvisition kan sættes til dynamiske datoer, således at rekvisitionsfeltet

Læs mere

Håndbog Til CPR services. Bilag 8 GCTP-standard m.m. CPR-kontoret

Håndbog Til CPR services. Bilag 8 GCTP-standard m.m. CPR-kontoret Håndbog Til CPR services Bilag 8 GCTP-standard m.m. CPR-kontoret Datavej 20, Postboks 269, 3460 Birkerød E-post: [email protected]. Telefax 45 82 51 10. Hjemmeside: www.cpr.dk Side 2 af 14 Indholdsfortegnelse

Læs mere

SQL for MySQL-begyndere

SQL for MySQL-begyndere Denne guide er oprindeligt udgivet på Eksperten.dk SQL for MySQL-begyndere I denne artikel vil jeg prøve at beskrive MySQL på begynderniveau. SQL står for Structured Query Language, og er et sprog til

Læs mere

Kapitel 4 Løkker i C#

Kapitel 4 Løkker i C# Kapitel 4 Løkker i C# Løkker en vigtig del af alle programmeringssprog, og C# er ikke andeles. En løkke er en måde at udføre en del af koden gentagne gange. Ideen er at du fortsætter med at udføre en opgave

Læs mere

Indholdsfortegnelse for kapitel 3

Indholdsfortegnelse for kapitel 3 Indholdsfortegnelse for kapitel 3 Kapitel 3 Design............................................................ 2 Database........................................................... 3 ER-diagram.................................................

Læs mere

Hent filoplysninger fra billeder og filer

Hent filoplysninger fra billeder og filer Hent filoplysninger fra billeder og filer I denne vejledning bliver det gennemgået, hvordan man via Power Forespørgsel kan hente filoplysninger fra en mappe ind i Excel. Der skal opbygges følgende elementer:

Læs mere

Indholdsfortegnelse Forord...8 Makroer samt aktivere Udvikler-fanen...10 Makrosikkerhed (Sikkerhedsindstillinger)...13

Indholdsfortegnelse Forord...8 Makroer samt aktivere Udvikler-fanen...10 Makrosikkerhed (Sikkerhedsindstillinger)...13 1 Indholdsfortegnelse Forord...8 Makroer samt aktivere Udvikler-fanen...10 Hvad er en makro... 10 Hvad kan du bruge en makro til... 10 Hvad en makro er (Visual Basic for Applications)... 11 Det hele sker

Læs mere

Database tips. Den forudsætter lidt kendskab til SQL men er for mindre erfarne. Denne guide er oprindeligt udgivet på Eksperten.dk

Database tips. Den forudsætter lidt kendskab til SQL men er for mindre erfarne. Denne guide er oprindeligt udgivet på Eksperten.dk Denne guide er oprindeligt udgivet på Eksperten.dk Database tips Denne artikel vil give nogle forskellige små praktiske råd om ting man skal tænke på når man arbejder med databaser og applikationer som

Læs mere

SWC eksamens-spørgsmål. Oversigt

SWC eksamens-spørgsmål. Oversigt SWC eksamens-spørgsmål Oversigt #1 Typer og variable #2 Aritmetik og logik #3 Klasser (definition, objekter) #4 Klasser (metoder) #5 Klasser (nedarvning, polymorfi) #6 Conditional statements #7 Repetition

Læs mere

DATABASE Projekt 1-3. semester

DATABASE Projekt 1-3. semester DATABASE Projekt 1-3. semester Gruppe 2- CLmul-a12e Projekt URL http://www.lucasperch.dk/projekter/database.pdf Gruppe 2 Lucas Perch-Nielsen [email protected] http://lucasperch.dk/skole.php Niclas

Læs mere

Databasesystemer, forår 2005 IT Universitetet i København. Forelæsning 4: Mere om E-R modellering. 24. februar 2005. Forelæser: Rasmus Pagh

Databasesystemer, forår 2005 IT Universitetet i København. Forelæsning 4: Mere om E-R modellering. 24. februar 2005. Forelæser: Rasmus Pagh Databasesystemer, forår 2005 IT Universitetet i København Forelæsning 4: Mere om E-R modellering 24. februar 2005 Forelæser: Rasmus Pagh Forelæsningen i dag Fortsættelse af E-R model: Attributtyper, identifiers,

Læs mere

Databasesystemer. IT Universitetet i København 8. juni 2006

Databasesystemer. IT Universitetet i København 8. juni 2006 Databasesystemer IT Universitetet i København 8. juni 2006 Eksamenssættet består af 5 opgaver med 16 spørgsmål, fordelt på 10 sider (inklusiv denne side), samt et svarark, hvorpå visse spørgsmål skal besvares.

Læs mere

Databasesystemer, forår 2005 IT Universitetet i København. Forelæsning 3: E-R modellering. 17. februar 2005. Forelæser: Rasmus Pagh

Databasesystemer, forår 2005 IT Universitetet i København. Forelæsning 3: E-R modellering. 17. februar 2005. Forelæser: Rasmus Pagh Databasesystemer, forår 2005 IT Universitetet i København Forelæsning 3: E-R modellering 17. februar 2005 Forelæser: Rasmus Pagh Forelæsningen i dag Datamodellering hvad, hvornår, hvorfor og hvordan? Business

Læs mere

Projekt Database, Gruppe 4A. Projekt 1, 3. Semester D A T A B A S E. Klasse MulA13 Gruppenummer: A4

Projekt Database, Gruppe 4A. Projekt 1, 3. Semester D A T A B A S E. Klasse MulA13 Gruppenummer: A4 Projekt Database, Gruppe 4A 0 Projekt 1, 3. Semester D A T A B A S E Klasse MulA13 Gruppenummer: A4 Projekt Database, Gruppe 4A 1 Fakta-ark Klasse MulA13, Gruppenummer: A4 Gruppemedlemmer: Amalie Ardahl

Læs mere

DATABASE - MIN MUSIKSAMLING

DATABASE - MIN MUSIKSAMLING DATABASE - MIN MUSIKSAMLING I dette forløb skulle vi lære om databaser, som bruger sproget SQL. SQL står for Structured Query Language. Det bruges til at vise og manipulere data, gemt i en database. I

Læs mere

Modul 2 Database projekt Multimediedesign 3. semester Gruppe 3 IRF/TUJE

Modul 2 Database projekt Multimediedesign 3. semester Gruppe 3 IRF/TUJE Modul 2 Database projekt Multimediedesign 3. semester Gruppe 3 IRF/TUJE Fact sheet Indholdsfortegnelse Fact Sheet Gantt kort Valgt af virksomhed Brainstorm Attribut tabel ER-diagram Skitse MySQLWorkbench

Læs mere