1. PLSQL 2 2. Select into

Relevanta dokument
9. :new och :old -värden 10. Triggerns olika delar 11. Olika typer av triggrar 12. Kodexempel. Pär Douhan,

Du skall naturligtvis visa körexempel med output där det behövs i din rapport!

1. SQL DML (Data Manipulation Language) 2. Lägga till data. 4. Uppdatera data 5. Aktivera default value 6. Hantera datum 7.

1. SQL 2. Utsökningar mot flera tabeller. 4. IN-operatorn 5. Join 6. Kartesisk produkt 7. Tabellalias

9. Anonyma block 10. Clean code och läsbarhet 11. Variabeltyper och variabeldeklaration 12. Olika loopar: Basic, while och for loop

2. Objekt, operatorer och integritetsregler 3. Databasobjekt

Databaser och. SQL, utsökningar mot flera tabeller TENTA. # radnr (#) studnr (#) kursnr * tentadatum * betyg

Innehåll MySQL Intro. Allmänt om Lagrade Procedurer Enkel utformning Skapa en lagrad procedur Använda parameter som indata

9. Between 10. Group by 11. Aggregatfunktionerna max, min, sum och avg 12. Nästlade sökningar

Klientprogrammering mot databaser

Innehåll Programability Del 2

TENTAMEN DATABASKUNSKAP ITEK12

1. SQL DDL (Data Definition Language) 2. Skapa tabell

2. Säkerhet 3. Autentisering. 5. Dataintegritet 6. Data privacy 7. PuL 8. Personuppgifter 9. Säkerhetspolicy. Pär Douhan,

FÖ 13: Databaskursen. Pär Douhan,

SQL. Structured Query Language. Frågespråk för att används för. Kommandon. data åtkomst data manipulation

1.Lär känna MS SQL Observera. Tips. Förberedelse

Föreläsning 6: Introduktion av listor

Databaser och. SQL, utsökningar mot en tabell

Databasens består av: Tabell Kolumner fält Rader poster (varje post är unik)

SQL, nästlade delfrågor Nästlade delfrågor. En nästlda delfråga är ett select-from-where uttryck inom where-klausulen i en annan fråga.

INNEHÅLL SQL DEL 2. Funktioner inbyggda Aggregatfunktioner Skalärfunktioner. Chapter 11. Beginning SQL Server 2008 for Developers

WCMS-15, Webbutvecklare CMS

Structured query language (SQL)

Databaskunskap 7,5 högskolepoäng Provmoment: Ladokkod: Tentamen ges för:

Lär känna MS SQL 2008 / Övning. Observera. Tips. Förberedelse

Transaktioner. 1. Transaktioner 2. Samtidighet ( concurrency ) och lås. 3. Deadlock. Kap. 17. Informatik B: Databashantering med SQL Server

Lösningsförslag, tentamen i Databaser

Kompendium till databaser och informationssystem 10p för SY2 2000

SQLs delar. Idag. Att utplåna en databas. Skapa en databas

Vyer, Prepared Statements, Triggers

Lektion 5 HTML, CSS, PHP och MySQL

Tabeller och kolumner SQL. Lägga till en ny post. Lägga till en ny post

Databasutveckling Microsoft T-SQL - Fortsättning. Funktioner GROUP BY HAVING Skapa databaser Skapa tabeller Lite om transaktioshantering

Sammanfattning. Listor. List-manipulering. Matris. /home/lindahlm/activity-phd/teaching/11dd1310/exercise3/exercise3.py September 13, 20111

Sockets: server. with Ada.Command_Line; use Ada.Command_Line; with Ada.Exceptions; use Ada.Exceptions; with Ada.Text_IO; use Ada.

Labb LIVE. Exempelkod från föreläsningen. Plushögskolan Frågeutveckling inom MSSQL - SU14

Databasföreläsning. Del 2 lagrade procedurer, vyer och transaktioner

Idag. Hur skapar vi och underhåller en databas? DD1370 (Föreläsning 4) Databasteknik och informationssystem 7,5 hp Hösten / 20

! Teori och praktik. ! Ändringar från förra året. ! Examination (tenta, projekt) LiU. ! Varför ni? ! Varför överhuvudtaget? LiU

Att skriva till och läsa från terminalfönstret

Övningar i SQL. SQLAccess.doc Ove Lundgren

DIVISIONSEXEMPEL RELATIONSALGEBRA OCH SQL. r s använder vi för att uttrycka frågor där ordet alla figurerar:

Vad är en databas? Databaser. Relationsdatabas. Vad är en databashanterare? Vad du ska lära dig: Ordlista

1 Comparator & Comparable

Databaser och Datamodellering Foreläsning IV

Skapa exempeldatabasen

INTRODUKTION TILL JDBC

Starta MySQL Query Browser

Databaser - Design och programmering. Kursöversikt. Exempel: telefonbok. Varför databaser?

Structured Query Language (SQL)

Tentamen i Databasteknik

Objektorienterad programmering i Java Undantag Sven-Olof Nyström Uppsala Universitet Skansholm: Kapitel 11

Felhantering TDDD78, TDDE30, 729A

Vad är en databas? Exempel på databaser: Databas = Organiserad samling och lagring av information.

Tentamen ID1004 Objektorienterad programmering May 29, 2012

Introduktion Schenker-BTL AB, Stab IT Beskrivning över informationsintegreringmed Schenker, metodbeskrivning version 1.

Disposition. 1. Kopplingen mellan Processanalys (DFDdiagram) 2. Treskikts Client-Server arkitektur (Fig 1.8) 3. Data layer

Innehåll. Föreläsning 3. javax.naming.context. javax.sql.datasource. Vad är JDBC? Java Naming and Directory Interface(JNDI) Viktigaste metoder:

Klassdeklaration. Metoddeklaration. Parameteröverföring

732G16: Databaser - Design och programmering

2. Redundans 3. Normalformer

Omgivningar. Omgivningar är viktiga eftersom de avgör vilka namn som är synliga och därmed dessas innebörd och de värden som är förknippade med dem.

Grundkurs i programmering, 6 hp (725G61) Dugga 2 tillfälle 2

Datatyper och kontrollstrukturer. Skansholm: Kapitel 2) De åtta primitiva typerna. Typ Innehåll Defaultvärde Storlek

TENTAMEN TDDB53. Programmering i Ada för MI (provkod TEN2) den 7 april 2010 kl Institutionen för datavetenskap, IDA Olle Willén mars 2010

Exceptions (undantag) Murach s: kap 7

Sätta upp e-post server Ubuntu 14.04, del 1 installation av programvara, konfiguration av mysql och Postfix

Föreläsning 5: Introduktion av pekare

Systembeskrivning Sakfrågan

Pascal. reserverade ord fördefinierade funktioner och procedurer egendefinierade funktioner, procedurer och objekt

Spara papper! Skriv inte ut sammanfattning utan ladda ner PDF!

Tentamen Grundläggande programmering

ADO.NET Murach Kapitel 17-20

Databaser - Design och programmering

Grunderna i SQL del 1

public DataSet GenerateDataSet(SqlCommand dbcommand, String tablename, out String errormsg) { errormsg = "";

DDL Kommandon CREATE/DROP Database CREATE /ALTER/DROP Table ALTER/ADD/DROP Column CREATE /ALTER/DROP Index

Objektorienterad Programkonstruktion. Föreläsning 4 8 nov 2016

Datalogi, grundkurs 1. Lösningsförslag till tentamen

Föreläsning 15: Parallella subrutiner. Parallellitet. Varför parallella underprogram?

Sample exam questions. Database exam TIG058

Uppstart Inloggning SSMS Skapa Databas Skapa Tabell Skapa Diagram, Fk, RI Hantering av Index, Pk, Fk, Ix Constraints Beräknande fält Några funktioner

Introduktion till integrering av Schenkers e-tjänster. Version 2.0

Skizz till en enkel databas

Informationssystem och Databasteknik, 2I-1100 HT2001. Relationsalgebra. Relationsalgebran är sluten: R 1 op R 2 R 3.

TER3. Försättsblad till skriftlig tentamen vid Linköpings universitet G28 TEN1 Webprogrammering och databaser Tentamen IDA 1 (7)

INNEHÅLL. Historik Vad är SQL Språkuppbyggnad SELECT Operatorer Logiska/Jämförelse SELECT med Alias och JOIN INSERT UPDATE DELETE

Exempel på ett litet Ada-program

FNTSK SKNNK Fonetisk sökning

DVA234 Databaser. Dag Nyström, Introduktion till databaser och MS SQL Server

Informa5onsmodellering

Webprogrammering och 729G28 databaser Webprogrammering och databaser Kursöversikt Webprogrammering Designprocessen Lösningsförslag

Stored procedure i ASP.NET

Översikt över Visual Basic

Innehåll Programability del 1

I denna laboration skriver jag inte ut resultatet på de flesta frågorna utan du kör dem själv i din miljö.

Lite om felhantering och Exceptions Mer om variabler och parametrar Fält (eng array) och klassen ArrayList.

Pascal... Pascal. Pascal... Pascal...

ÖVERVAKNING AV SQL SERVER

Transkript:

FÖ 11: Databaskursen 1 1. PLSQL 2 2. Select into 3. Anchored declaration 4. Cursorvariabler 5. Olika typer av cursors 6. Cursorattribut 7. Cursorloop 8. Datatypen record: %rowtype 9. Cursor for loop 10. Några kodexempel 11. Felhantering 12. Olika typer av undantag 13. no_data_found d 14. raise_application_error Pär Douhan, pdo@du.se

PLSQL 2 Vi börjar med cursorvariabler 2

Select into KUND kundnr fnamn enamn email mobil 56482 Rolf Björk rb@gmail.com 0730211142 89658 Malin Ek maek@du.se 0703658974 58476 Jossef Mdoud jossef@du.se 0730533347 # knr: number(8) fnamn: varchar2(40) enamn: varchar2(60) email: varchar2(30) mobil: varchar2(10) Maria exekverar följande anonyma PL/SQL-block vi tidpunkt T1: v_email varchar2(30); v_mobil varchar2(10); begin select email,mobil into v_email,v_mobil from kund "select into" fungerar bara med "singelton select" where knr = 56482; dbms_output.put_line('mobil: ' v_mobil ',' 'email: ' v_email); end; / 3

Problem KUND kundnr fnamn enamn email mobil 56482 Rolf Björk rb@gmail.com 0730211142 89658 Malin Ek maek@du.se 0703658974 58476 Jossef Mdoud jossef@du.se 0730533347 mobil: varchar2(15) Någon annan skriver följande kod vid tidpunkt T2: alter table kund modify mobil varchar2(15); update kund set mobil = '+46730277742' where knr = 56482; commit; 4

ORA-06502 Vad händer vid tidpunkt T3, när Maria exekverar sitt anonyma PL/SQL-block igen? v_email varchar2(30); v_mobil varchar2(10); begin select email,mobilmobil into v_email,v_mobil from kund where knr = 56482; dbms_output.put_line('mobil: ' v_mobil ',' 'email: ' v_email); end; / ORA-06502: PL/SQL: numeric or value error select length('+46730277742') from dual; LENGTH('+46730277742') 12 v_mobil varchar2(10); 5

"Ankardeklaration" kl " Lösningen på problemet är anchored declaration %type v_email kund.email%type; v_mobil kund.mobil%type; Hämtar datatypen från databasen. tabell kolumn 6

Vad är en cursor? Synonymer cursor ~ recordset ~ recordgroup ~ resultset ~ länkad lista "en packe med rader", d.v.s. resultatet av en select-sats. select kursnr,poäng,nivå from kurs; cursor-deklaration KURSNR POÄNG NIVÅ ------ ----- ---- 100 5 A 101 5 A first record 102 5 B cursor = resultatet av sql-satsen 103 10 C 104 5 D 105 5 B last record 7

Varför använda en cursor? När behöver vi använda oss av en cursor? "en packe med rader" När vår SQL-sats reurnerar fler än en rad. Om vi gör en singelton select, d.v.s. where-villkoret matchar en kolumn som innehåller unika värden (PK eller unique) så kan vi använda select-into. Får vi tillbaka fler än en rad, så kan vi inte använda select-into, utan vi måste använda en cursor. 8

Olika typer av cursors 1. Statiska cursors - Refererar alltid till samma SQL. 2. Dynamiska cursors - Kan referera till olika SQL-satser vid olika tidpunkter. Statiska cursors - två olika typer 1. Implicit cursor - Hanteras av DBMS. 2. Explicit it cursor 1. Deklarera den 2. Öppna den 3. Loopa igenom raderna 4. Stänga den 9

Deklarera en cursor cursor c_kunder is select fnamn,enamn,adress from kund; begin end; / null; namnet på cursorn cursor c_storkunder is select fnamn,enamn,adress from kund where knr in(select knr from kundorder where ordnr in(select orderrad.ordnr from orderrad,artikel where orderrad.artnr = artikel.artnr having sum(artikel.pris * orderrad.antal) > 20000 group by orderrad.ordnr)); ordnr)); 10

Cursorattribut t %isopen true, false %found %notfound %rowcount true, false true, false number select fnamn,enamn from kund; FNAMN ENAMN -------------------- --------- olof andersson %rowcount = 1 maria andersson %rowcount = 2 tomas kvist %rowcount = 3 hans rosenboll %rowcount = 4 11 NULL EOF,%notfound = true

Cursor loop cursor c_kundmobil is select fnamn,enamn,mobil O from kund; L v_fnamn kund.fnamn%type; v_enamn kund.enamn%type; F v_mobil kund.mobil%type; E begin E if not c_kundmobil%isopen then -- öppna cursorn C open c_kundmobil; end if; loop -- loopa igenom resultatet t t av SQL-satsen fetch c_kundmobil -- ställ pekaren på första raden into v_fnamn,v_enamn,v_mobil; -- hämta data från aktuell rad till variablerna exit when c_ kundmobil%notfound; -- sluta loopa när EOF inträffar dbms_output.put_line(v_fnamn ', ' v_enamn ', mobil: ' v_mobil); end loop; close c_ kundmobil; -- stäng cursorobjektet end; / 12

Datatypen t record: %rowtype cursor c_kundmobil is select fnamn,enamn,mobil from kund; v_fnamn kund.fnamn%type; v_enamn kund.enamn%type; irriterande med v_mobil kund.mobil%type; flera variabler! rec c_ kundmobil%rowtype; rec fnamn enamn mobil begin if not c_kundmobil%isopen then open c_ kundmobil; end if; loop fetch c_kundmobil into rec; v_fnamn,v_enamn,v_mobil; exit when c_kundmobil%notfound; dbms_output.put_line(rec.fnamn ', ' rec.enamn ', mobil: ' rec.mobil); end loop; close c_kundmobil; end; / 13

Cursor for loop For loop innebär minst kod! Cursorn behöver varken öppnas eller stängas. Detta sker implicit. cursor c_kundmobil is begin for rec in c_kundmobil loop select fnamn,enamn,mobil mobil from kund; dbms_output.put_line(rec.fnamn ', ' rec.enamn ', mobil: ' rec.mobil); end loop; end; / 14

Några kodexempel Uppgift: Skriv ett PLSQL-program som kopierar över alla artiklar, som kostar mer än 2000 kr, från tabellen ARTIKEL till tabellen LYXARTIKEL. ARTIKEL artnr artnamn varumärke lagerantal pris 1 Såskastrull Sofoni 5 498 2 Traktörpanna Hackman 13 795 3 Atlantis kastrull Demeyere 13 2999 4 Opera Såskastrull i koppar 18 cm Ruffoni 2 2599 5 Pi Prima Matera Såskastrull i koppar de Buyer 2 2595 LYXARTIKEL artnr artnamn varumärke lagerantal pris 15

Basic loop set serveroutput on cursor c_lyxartiklar is select artnr,artnamn,varumärke,lagerantal,pris from artikel where pris > 2000; v_rec c_lyxartiklar%rowtype; begin if not c_lyxartiklar%isopen then open c_lyxartiklar; end if; O L F E E C loop fetch c_lyxartiklar into v_rec; exit when c_lyxartiklar%notfound; insert into lyxartikel(artnr,artnamn,varumärke,lagerantal,pris) artnamn lagerantal values(v_rec.artnr,v_rec.artnamn,v_rec.varumärke,v_rec.lagerantal,v_rec.pris); end loop; close c_lyxartiklar; commit; dbms_output.put_line('kopieringen är klar!'); end; 16

For loop Samma sak men med en for loop: set serveroutput on cursor c_lyxartiklar is select artnr,artnamn,varumärke,lagerantal,pris from artikel where pris > 2000; begin for v_rec in c_lyxartiklar loop insert into lyxartikel(artnr,artnamn,varumärke,lagerantal,pris) values(v_rec.artnr,v_rec.artnamn,v_rec.varumärke,v_rec.lagerantal,v_rec.pris); artnr v artnamn v varumärke v lagerantal v end loop; commit; dbms_output.put_line( line('kopieringen är klar!'); end; 17

Resultat t anonymous block completed Kopieringen är klar! select * from lyxartikel; ARTNR ARTNAMN VARUMÄRKE LAGERANTAL PRIS 3 Atlantis kastrull Demeyere 13 2999 4 Opera Såskastrull i koppar 18 cm Ruffoni 2 2599 5 Prima Matera Såskastrull i koppar de Buyer 2 2595 18

Generera HTML set serveroutput on cursor c_lyxartiklar is select artnr,artnamn,varumärke,lagerantal,pris from artikel where pris > 2000; begin dbms_output.put_line('<table>'); dbms_output.put_line('<tr>'); dbms_output.put_line( line('<th>artnamn</th>'); dbms_output.put_line('<th>varumärke</th>'); dbms_output.put_line('<th>pris</th>'); dbms_output.put_line('</tr>'); for v_rec in c_lyxartiklar loop dbms_output.put_line('<tr>'); dbms_ output.put p _ line('<td>' v _ rec.artnamn '</td>'); dbms_output.put_line('<td>' v_rec.varumärke '</td>'); dbms_output.put_line('<td>' v_rec.pris '</td>'); dbms_output.put_line('</tr>'); end loop; dbms_output.put_line('</table>'); end; 19

Resultat t <table> <tr> <th>artnamn</th> <th>varumärke</th> <th>pris</th> </tr> <tr> <td>atlantis kastrull</td> <td>demeyere</td> <td>2999</td> </tr> <tr> <td>opera Såskastrull i koppar 18 cm</td> <td>ruffoni</td> <td>2599</td> </tr> <tr> </tr> </table> <td>prima Matera Såskastrull i koppar</td> <td>de Buyer</td> <td>2595</td> 20

I webbläsaren 21

PLSQL PLSQL: Felhantering 22

Exception Felhantering exceptions = errors När ett fel inträffar i programblocket, så förflyttas kontrollen av programblocket till felhanteringsdelen. l v_mobil kund.mobil%type; begin select mobil into v_mobil *** E R R O R *** inträffar här from kund where knr = 3; exception -- MÅSTE ligga sist i programblocket end; / *** E R R O R *** hanteras här 23

Exception handler Rätt exception handler (felhanterare) spåras via en namnreferens till det inträffade felet. Om ett exception (undantag) inträffar och det inte finns någon exception handler, så kommer others att ta hand om det. Om inte others heller finns, så kommer en felkod (error code) och ett felmeddelande (error message) att visas. 24

Olika typer av undantag Tre olika typer av exceptions: 1. Fördefinierade Oracle Server Exceptions Har ett fördefinierat namn, t. ex. no_data_found, zero_divide, to_many_rows, cursor_allready_open, value_error etc. ~ 20 st, "raised implicitly" av servern. 2. Icke fördefinierade Standard Oracle Server-fel som inte är namngivna av systemet. Har en felkod och ett felmeddelande. "raised implicitly" av servern. 3. Användardefinierade Deklareras och namnges av användaren (programmeraren). "raised explicitly" av användaren. 25

sqlcode och sqlerrm sqlcode felkoden number sqlerrm felmeddelandet varchar2 v_mobil kund.mobil%type; begin select mobil into v_ mobil v_mobil innehåller således null from kund where knr = 138; det finns ingen kund med PK = 138 exception when others then dbms_output.put_line('fel: ' sqlerrm ', felkod: ' sqlcode); end; / fel: ORA-01403: data saknas, felkod: 100 26

no_data_found d Undantaget t no_data_found d "kastas" " när en select into-sats t inte returnerar någon data. Detta gäller bara när select into-satsen inte jobbar mot en aggregatfunktion. studera: v_antal number(1); begin select count(*) returnerar alltid 1 eller 0 into v_antal from kund where knr = 138; exception when no_data_found _ then inget kommer att fångas här dbms_output.put_line('data saknas!'); end; / 27

no_data_found d i en cursor Undantaget t no_data_found d fungerar inte i en cursor! Här måste vi hantera undantaget själva: studera: cursor c_kundmobil is begin select mobil from kund where knr = 2; for rec in c_kundmobil loop if rec.mobil is null then raise_application_error(-20001,'mobilnummer saknas!'); end if; end; / dbms_output.put_line(', mobil: ' rec.mobil); end loop; 28

raise_application_error Vi kan anropa proceduren raise_application_error raise_application_error(-20001,'error!, here is some text about it'); Egen felkod: -20001 till -20999 Eget felmeddelande 29

Egendefinierade i d undantag Vi kan skapa s.k. användardefinerade undantag: Studera: cursor c_kundmobil is select mobil from kund where knr = 2; no_mobil exception; egendefinierat undantag begin for rec in c_kundmobil loop if rec.mobil is null then raise no_mobil; end if; undantaget kastas explicit dbms_output.put_line('mobil: t t bil ' rec.mobil); end loop; exception when no_mobil then undantaget t hanteras dbms_output.put_line('kunden saknar mobiltelefon!'); end; / 30

The End 31