FÖ 10: Databaskursen 1. Vyer (Views) 2. Vyer och dataåtkomst 3. Olika typer av vyer 4. Fördelar med vyer 5. Syntax för att skapa vyer 6. Enkla och komplexa vyer 7. Vyer och constraints 8. PLSQL - introduktion i 9. Anonyma block 10. Clean code och läsbarhet 11. Variabeltyper och variabeldeklaration 12. Olika loopar: Basic, while och for loop 1 Pär Douhan, pdo@du.se
Vyer Vi börjar med vyer 2
Vyer - Views En vy är en logisk struktur som baseras på en tabell eller en annan vy. En vy innehåller ingen data. En vy kan ses som ett fönster, genom vilket vi kan söka eller förändra data. En vy är en skräddarsydd presentation av data i data- basen. En vy är en lagrad SQL-fråga. 3
Vyer och dataåtkomst t Vi kommer åt data via en vy precis som vi kommer åt data via en vanlig tabell. Vi ställer SQL-frågor på samma sätt mot en vy som mot en tabell. Vi kan göra: -select - join och nästlade frågor - Ibland även DML (insert, update, delete) Vi kan alltså betrakta en vy som en virtuell tabell. virtuell = skenbar 4
Olika typer av vyer Det finns fyra olika typer av vyer i Oracle: 1. Relational Views på kursen 2. Inline Views - vyer som definieras "on the fly" när de används i SQL- koden. 3. Materialized Views - Tar plats, resultatet cachas och prestandan ökar vid många rader. 4. ObjectViews - vyer mot objekttyper. 5
Varför vyer? Vyer används för att: 1. Öka prestandan 2. Öka säkerheten 3. Dölja komplexiteten (högre abstraktion) 4. Anpassa presentation av data En relationsvy: -Tar upp lite plats (Vydefinitionen inkl. SQL-frågan) -Vydefinitionen lagras i data dictionary (tablespace system) - Kan skapas utifrån en/flera bastabeller, eller andra vyer 6
Syntax Syntax för att skapa en vy create [or replace] view <view_name> as <query>; Exempel: create view kund_vy as select fnamn,enamn,mobilnr from kund; Exempel med kolumnalias: li create view kund_vy( förnamn,efternamn,mobilnummer) as select fnamn,enamn,mobilnr from kund; 7
Mer om vyer Ändra vydefinition or replace Skapar en ny vy och kastar den gamla Kasta bort vyer drop view kund_vy; Metadata Hittar vi i data dictionary vyn user_views. För att se vilka kolumner som finns i user_views: desc user_views; 8
Rättigheter t Vi behöver rättigheter för att skapa vyer Rättigheter för att göra select på de bastabeller eller vyer som vyn skall skapas från: grant select on table_name to user; grant select on view_name to user; Rättigheter att skapa själva vyobjektet: grant create view to user; 9
Relational l views Två olika typer av relationsvyer: 1. Enkla vyer 2. Komplexa vyer Den huvudsakliga skillnaden är relaterad till DML-operationer. 10
Simple view En enkel vy: Visar data från en tabell Innehåller inga funktioner Inga grupper av data Tillåter DML operationer 11
Complex view En komplex vy: Kan visa data från flera tabeller Kan innehålla funktioner Kan innehålla grupper av data Tillåter inte alltid DML operationer: Det beror på hur komplex den är! 12
Vyer och constraints t with check option Vyn som skapas har en begränsning som ser till att användare bara kan göra insert och update på rader som man kan se när man söker i vyn. create or replace view personalvy as select fnamn,enamn,mobilnr,lön lö from personal where avdnr = 12 Vi kan bara göra DML för de som jobbar with check option; på avdelning 12. with read only Ser till att det bara går att läsa data. DML-operationer är förbjudet! create or replace view personalvy as select fnamn,enamn,mobilnr,lön from personal with read only; 13
Validate? Validate = bekräfta valid = giltig invalid = ogiltig En vy kan vara valid eller invalid. När vi skapar en vy, så kommer DBMS att verifiera att SQL-frågan är giltig. Om vi sedan går in och ändrar i bastabellen kan detta medföra att SQL-frågan blir ogiltig, d.v.s. vi får en vy vars status är ogiltig (invalid). 14
Force Vi kan använda force-kommandot för att tvinga DBMS att acceptera vår vydefinition, oavsett om SQL-frågan är giltig eller inte. Detta tillåter oss att skapa en vy med status = invalid create force view invalid_vy as select * from tabell_som_inte_finns; Warning: View created with compilation errors. Varför används det här? 15
PLSQL PLSQL: en introduktion 16
Introduktion till Oracle PLSQL Vd Vad är PL/SQL? PL/SQL = "Oracle's Procedural Language extension to SQL". PL/SQL-språkets syntax, struktur och datatyper liknar ADA. PL/SQL körs i en VM (Virtual Machine) precis som Java. Båda finns i Oracle. Oracle Server Oracle JVM Oracle PLSQL VM 17
Java eller PL/SQL? Java eller PL/SQL i Oracle? Använd Java när det inte går att använda PL/SQL. Skicka email med bilagor? - PL/SQL = svårt! - Java = lätt! Loopa igenom rader i en databastabell och göra något! - PL/SQL = lätt! -Java = svårt! "If it touch data PL/SQL" T. Kyte 18
Case sensitive PL/SQL är inte case sensitive. DecLAre variabeldeklareationer; BEGIN vad programmet skall göra; -- kommentar på en rad. Ignoreras av kompilatorn. anonymt PL/SQL-block /* kommentarer till koden på flera rader. */ end; / 19
Olika PL/SQL block Två olika typer av PL/SQL block 1. Anonyma block - Icke namngivna block. begin dbms_output.put_line('hello World!'); end; / SQL-developer, F5 eller Run Script. 2. Namngivna block - Lagrade procedurer, funktioner, triggrar och paktet. 20
Clean code Clean code Easy and Simple! 1. Easy to read 2. Easy to follow 3. Easy to understand 4. Easy to modify 5. Easy to test 6. Works correctly Tänk på att skriva bra PLSQL kod! Att koden ska fungera korrekt inbegriper att den är smart konstruerad och optimerad. Ett exempel på smart kod är att utforma sin logik så att vi förflyttar så lite data som möjligt över nätverket! Data lives forever! 21
Läsbarhet Mikaela Hedbergs "rensa-script" " declare cursor c_objects is select object_name, object_type from user_objects; cursor c_constraints is select owner, constraint_name, constraint_type, table_name from user_constraints where constraint_name not like upper('bin%'); v_object_name varchar2(100); v_object_type varchar2(100); begin for c in c_constraints loop execute immediate 'alter table ' c.table_name ' drop constraint ' c.constraint_name; end loop; for x in c_objects loop if upper(x.object_type) not in ('PACKAGE BODY') then execute immediate 'drop ' x.object_type ' ' x.object_name; end if; end loop; end; / 22
Läsbarhet Med syntax highlightinghli h i declare cursor c_objects is select object_name, object_type t from user_objects; cursor c_constraints is select owner, constraint_name, constraint_type, table_name from user_constraints where constraint_name not like upper('bin%'); v_object_name varchar2(100); v_object_type varchar2(100); begin for c in c_constraints loop execute immediate 'alter table ' c.table_name ' drop constraint ' c.constraint_name; end loop; for x in c_ objects loop if upper(x.object_type) not in ('PACKAGE BODY') then execute immediate 'drop ' x.object_type ' ' x.object_name; end if; end loop; end; / 23
Läsbarhet Med syntax highlighting, hli h i indentering i och monospaced font declare cursor c_objects is select object_name, object_type from user_objects; cursor c_constraints is select owner, constraint_name, constraint_type, table_name from user_constraints where constraint_namename not like upper('bin%'); v_object_name varchar2(100); v_object_type varchar2(100); begin for c in c_constraints loop execute immediate 'alter table ' c.table_name ' drop constraint ' c.constraint_name; end loop; for x in c_ objects loop if upper(x.object_type) not in ('PACKAGE BODY') then execute immediate 'drop ' x.object_type ' ' x.object_name; end if; end loop; end; / 24
Notepad ++ Klistra in RTF i labbrapporten Välj SQL 25
Variabeltyper Variabeltyper i PL/SQL 1. Skalär - nummer, datum, teckensträngar, boolean 2. Komposit - record, PL/SQL-table, varray... 3. Referens -ref cursor 4. LOB -BLOB 26
Variabeltyper Variabeltyper som kommer att användas på kursen: number varchar2 date boolean skalära datatyper true, false eller null record komposit datatyp 27
Variabeldeklaration Variabeldeklaration och tilldelning av värden declare v_namn varchar2(50); v_år varchar2(4) := to_char(sysdate,'yyyy'); begin -- tilldelar l v_namn en textsträng. v_namn := 'Hans Rosendahl'; end; / dbms_output.put_line('årets pedagog ' v_år 'är: ' v_namn); := tilldelningsoperator. = operator för att utvärdera likhet. if a = b then -- true eller false. 28
Utskrift Utskrift slås på med set serveroutput on set serveroutput on /* slå på utskrift med set serveroutput on */ declare v_namn varchar2(50); v_år varchar2(4) := to_char(sysdate,'yyyy'); /* hämtar dagens datum och gör om det till en teckensträng med fyra tecken. YYYY medför att det kommer att bara visa årtal med fyra tecken */ begin v_ namn := 'Hans Rosendahl'; ; dbms_output.put_line('årets pedagog ' v_år ' är: ' v_namn); end; anonymous block completed Årets pedagog 2015 är: Hans Rosendahl 29
PLSQL Loopar och styrstrukturer 30
Ait Aritmetiska tik operatorer Artitmetisk operator Användning + Addition - Subtraktion * Multiplikation / Division ** Exponentiering - 2 + 3 * (10-2 * 3) / 6 = x 1. Parenteser 2. Potenser 3. Multiplikation lik i och division i i 4. Subtraktion och addition - 2 + 3 * (4) / 6 = x 31-2 + 12 / 6 = x - 2 + 2 = x x = 0 2 ** 3 = 2*2*2 = 8
Substitutionsvariabler i bl PLSQL har inga input satser & markerar en substitutions variabel '&ange_namn' 32
Styrstrukturert Styrstrukturer = Control Structures 1. if... then... end if; 2. if... then... else... end if; 3. if... then... elsif... then... end if; 4. case... when... then... end case; OBS! ELSIF 33
CASE Exempel på CASE-sats: set serveroutput on -- slå på utskrift declare v_num number(7) := &ange_ett_heltal; v_test number(1); begin v_test := mod(v_num,2); case v_test t end; / when 0 then dbms_output.put_line('talet är jämnt'); else end case; dbms_output.put_line('talet är udda'); 34
IF Samma exempel med IF-sats: set serveroutput on declare v_num number := &ange_ett_heltal; v_test number; begin v_test := mod(v_num,2); if v_test = 0 then end; / dbms_output.put_line('talet är jämnt'); else end if; dbms_output.put_line('talet är udda'); 35
NULL? Testa null-värden äd i en IF-sats: set serveroutput on declare a number := null; Utskrift? if ((a is null) and (b is null)) then c b number := null; begin if (a = b) then dbms_output.put_line('a'); elsif (a <> b) then end if; end; / dbms_ output.put p _ line('b'); else dbms_output.put_line('c'); 36
Loopar Det finns tre olika typer av loopar i PL/SQL: 1. Basic loop 2. WHILE loop 3. FOR loop 37
Basic loop Exempel på basic loop: set serveroutput on declare i number(3); begin i = 1 i = 2 i = 3 i := 1; i = 4 loop i = 5 end; / exit when i = 6; dbms_output.put_line('i = ' i); i = i + 1; end loop; 38
While loop Exempel på WHILE loop: set serveroutput on declare i number(3); begin i := 1; while (i < 6) loop dbms_output.put_line('i = ' i); i = i + 1; end loop; end; / i = 1 i = 2 i = 3 i = 4 i = 5 39
For loop Exempel på FOR loop: set serveroutput on begin i = 1 for i in 1.. 5 loop i = 2 dbms_output.put_line('i = ' i); i = 3 end loop; i = 4 end; / i = 5 -- har inbyggd räknare, som vi kan kalla vad vi vill for counter in 1.. 5 loop dbms_output.put_line('i = ' counter); 40
For select Exempel på FOR SELECT loop: set serveroutput on begin end; / for rec in (select fnamn,enamn from student) loop dbms_output.put_line(rec.fnamn ' ' rec.enamn); end loop; Bo Ek Tommy Kvist Stina Klanth Hans Dalros Marie Ekholm Aressa Kristossih Mgabhe Mboto Sonja Stenlund Stina Dalkvist Arne Möller 41
The End 42