Elementi di PL/SQL. Pl/Sql Il PL/SQL (Procedural Language/Structured Query Language) è un linguaggio di programmazione procedurale di Oracle che costituisce.

Slides:



Advertisements
Presentazioni simili
Introduzione al linguaggio C++
Advertisements

Java base V: La gestione delle Eccezioni
© 2007 SEI-Società Editrice Internazionale, Apogeo Unità F2 Selezione.
PROGRAMMARE IN PASCAL (le basi)
Structured Query Language (SQL) Presentazione 13.1 Informatica Generale (Prof. Luca A. Ludovico)
PHP.
MATLAB. Scopo della lezione Programmare in Matlab Funzioni Cicli Operatori relazionali Esercizi vari.
Algoritmi e Programmazione
Esercitazioni del Corso di Sistemi Informativi Marina Mongiello
Programmazione Procedurale in Linguaggio C++
Elementi di PL/SQL.
Informatica 2. Concetti fondamentali di programmazione Programmare vuol dire scrivere un algoritmo in un linguaggio che faccia funzionare un calcolatore.
Ricorsione e Debug.
SQL per la modifica di basi di dati. 29/01/2014SQL per la modifica di basi di dati2 Data Manipulation Language Introduciamo ora il Data Manipulation Language.
Cosè un programma? LALA PROGRAMMAZIONE PROGRAMMAZIONELALA PROGRAMMAZIONE PROGRAMMAZIONE UN ELENCO DI ISTRUZIONI, APPARTENENTI A UN BEN DEFINITO LINGUAGGIO,
Uso dei cicli y t =c+ty t-1 +e Un uso dei cicli può essere quello di creare una serie storica per cui y t =c+ty t-1 +e dove poniamo c e t scalari ed e~N(0,1).
Introduzione alla programmazione lll
AA 2005/06 Informatica Programmazione M.A. Alberti-L. Capra 1 Le eccezioni in Java Programmazione Corso di laurea in Informatica.
Basi di dati attive Paolo Atzeni.
Access: Query semplici
Lezione 4: Costrutti Condizionali Prof. Raffaele Montella.
SQL Per la modifica di basi di dati
AA2003/04 © M.A. Alberti Programmazione Eccezioni 1 Le eccezioni in Java Programmazione Corso di laurea in Informatica.
nome: sequenza di caratteri usata per denotare un oggetto
Strutture di controllo in C -- Flow Chart --
Fondamenti di Informatica Algoritmi
Vincoli di integrità generici Con i costrutti visti sinora, non è sempre possibile definire tutti i possibili vincoli di integrità. Per questo esiste listruzione.
Manipolazione dei dati I comandi SQL che permettono di modificare il contenuto di una base di dati sono insertdeleteupdate insert ha la seguente sintassi:
Lezione 2 Programmare in ASP
GESTIONE DEGLI ERRORI Spesso vi sono istruzioni critiche, che in certi casi possono produrre errori. Lapproccio classico consiste nellinse- rire controlli.
Corso di INFORMATICA anno scolastico 2009/10 Linguaggio SQL IDENTIFICATORI di tabelle e attributi: stringhe di lunghezza max 18 caratteri, composte da.
CODIFICA Da flow-chart a C++.
TURBOPASCAL …. ripassiamo - prof. V. Riboldi -.
Architettura degli Elaboratori II (canale P-Z) Istruzioni di controllo Dott. Franco Liberati.
Cicli in Fortran I cicli consentono di eseguire una sequenza di istruzioni più di una volta due tipi: Cicli iterativi Cicli while.
Programmare in Visual Basic
BIOINFO3 - Lezione 51 INSERIMENTO DEI DATI Visto come si creano le tabelle (sinora tristemente vuote), cominciamo ad occuparci di come riempirle con dei.
TURBOPASCAL …. ripassiamo - prof. V. Riboldi -.
TURBOPASCAL L’iterazione - prof. V. Riboldi -.
FUNZIONI Dichiarazione: Definizione:
Il ciclo while.  Permette di ripetere un blocco di istruzioni fino a quando non si verifica un determinato evento  Il ciclo while può essere realizzato.
PLSQL 1.1 LA REALIZZAZIONE DI APPLICAZIONI Quattro parti: Gestione dati Business rules Logica applicativa Interfaccia utente Molte possibili architetture.
Introduzione a Javascript
R 255 G 211 B 8 R 255 G 175 B 0 R 127 G 16 B 162 R 163 G 166 B 173 R 104 G 113 B 122 R 234 G 234 B 234 R 175 G 0 B 51 R 0 G 0 B 0 R 255 G 255 B 255 Supporting.
Tecnologie di InternetDocument Type Definition Dott. Nicola Dragoni Document Type Definition  Document Type Definition (DTD)  Documento XML valido 
Interazione col DB Per interagire con una base dati da una pagina PHP occorre procedere come segue: Eseguire la connessione al DBMS MySQL in ascolto;
1 Eccezioni in Java. 2 Ricordiamo che 4 una procedura può terminare –normalmente, ritornando un risultato –in modo eccezionale ci possono essere diverse.
MySQL Database Management System
1 Fabio Scotti – Università degli Studi di Milano Fabio Scotti ( ) Laboratorio di programmazione per la sicurezza Valentina Ciriani ( )
Database Elaborato da: Claudio Ciavarella & Marco Salvati.
Nozione ed uso Operazioni eseguite automaticamente ogni volta che avviene un certo evento Uso: –Gestione di vincoli di integrità: Per fallimento Per modifica.
13 ottobre Decisioni F. Bombi 13 ottobre 2002.
PLSQL 1.1 LA REALIZZAZIONE DI APPLICAZIONI Quattro parti: Gestione dati Business rules Logica applicativa Interfaccia utente Molte possibili architetture.
Interpreti e compilatori
Linguaggio C: Le basi Stefano Cagnoni e Monica Mordonini
PL/SQL Procedural Language/SQL estensione procedurale del linguaggio SQL.
Esercizi.
Informatica e Informatica di Base
Ciclo for nei linguaggi di programmazione. Nei linguaggi di programmazione, il ciclo for è una struttura di controllo iterativa che determina l'esecuzione.
Eprogram informatica V anno. Introduzione a PHP Introduzione La diffusione di PHP ha avuto un notevole incremento dalla fine degli anni Novanta a oggi,
Strutture di controllo
1 Metodo I metodi sono uno strumento che i programmatori usano per strutturare i programmi, sia per renderli più facili da capire che per permettere il.
Linguaggi per basi di dati Linguaggi di definizione dei dati Utilizzati per definire gli schemi e le autorizzazioni per l’accesso Linguaggi di manipolazione.
Linguaggio SQL prima parte Linguaggio SQL prima parte A. Lorenzi, E. Cavalli INFORMATICA PER SISTEMI INFORMATIVI AZIENDALI Copyright © Istituto Italiano.
Normalizzazione. Introduzione Nell’organizzazione tradizionale degli archivi, si verificano alcuni problemi, quali: Ridondanza dei dati (gli stessi dati.
Basi di Dati attive. Sistemi Informativi DEE - Politecnico di Bari E. TinelliBasi di dati attive2 Definizione Una base di dati si dice attiva quando dispone.
Linguaggio SQL. Linguaggi per database La diffusione del modello relazionale ha favorito l’uso prevalente di linguaggi non procedurali: in questo modo.
Basi di Java Strutture base di Java. Basi di java ▪Variabili ▪Operatori ▪Condizioni e Cicli ▪Array.
Metodi in Java. Note Identificazione input: (il raggio è un numero reale !!!) Identificazione delle operazioni necessarie al calcolo Area=r*r*PI Circonferenza=2*r*PI.
Eccezioni in Java. Le eccezioni in Java Exception handling: insieme di costrutti e regole sintattiche e semantiche presenti nel linguaggio allo scopo.
Transcript della presentazione:

Elementi di PL/SQL

Pl/Sql Il PL/SQL (Procedural Language/Structured Query Language) è un linguaggio di programmazione procedurale di Oracle che costituisce un’estensione dell‘SQL. Esso consente di creare store procedures e funzioni, ma anche di creare i triggers. Infatti l’azione di un trigger è spesso definita mediante un codice PL/SQL. Il PL/SQL supporta le variabili, condizioni e gestisce le eccezioni.

Struttura di un programma PL/SQL I programmi PL/SQL sono strutturati a blocchi. I blocchi hanno questa forma generale: declare -- Blocco di dichiarazione (opzionale) begin -- Codice da eseguire exception -- Gestione eccezioni(opzionale) end

Struttura dei programmi PL/SQL La sezione DECLARE specifica i tipi di dato della variabili, delle costanti e i tipi definiti dall'utente. Il blocco tra BEGIN ed END specifica il codice da eseguire. Le eccezioni possono essere di due tipi: eccezioni predefinite eccezioni definite dall'utente. Si possono lanciare le eccezioni definite dall'utente in modo esplicito Oracle ha predefinito numerose eccezioni.

Dichiarazioni La sezione dichiarativa inizia con la parola chiave declare ed è seguita da un elenco di definizioni di variabili e cursori. Le variabili possono essere definite come valori costanti, mediante la parola chiave constant, e possono essere inizializzate a un valore in fase di dichiarazione. I tipi di base che possono essere utilizzati sono gli stessi che possono essere utilizzati nella definizione delle colonne. L’assegnazione dei valori alle variabili viene fatta mediante il simbolo := come in Pascal. I valori costanti possono anche essere assegnati mediante la parola chiave default.

Esempio RaggioArea Aree Il seguente listato calcola l’area di un cerchio con raggio fissato e l’inserisce nella tabella aree DECLARE pi constant number(9,7) := ; raggio integer (5); area number (14,2); BEGIN raggio :=3; area := pi*power(raggio,2); Insert into Aree values (raggio, Area); end RaggioArea

Reperire valori da una tabella Supponiamo che i valori del raggio che ci interessano siano già presenti in una tabella VALORI_RAGGIO di una sola colonna Raggio. Vogliamo inserire nella tabella AREE i valori dei raggi contenuti nella tabella VALORI_RAGGIO insieme alle rispettive aree. Per fare questo abbiamo bisogno di un cursore.

Cursori Un Cursore è essenzialmente una variabile di tipo tupla che varia su tutte le tuple che risultano da qualche query. Un cursore ha il compito di conservare i risultati di una query affinchè possano essere elaborati da altri comandi all’interno del blocco PL/SQL. In PL/SQL un cursore si dichiara mediante l’istruzione: CURSOR is ; Per prelevare una tupla dal cursore C si usa FETCH C INTO

Variabili ancorate a colonne E’ possibile definire delle variabili il cui tipo corrisponde a quello di una determinata colonna, di cui si specifica il nome. La variabile viene dichiarata nel seguente modo: %TYPE Esempio: X articoli.art_descrizione%TYPE Vantaggi: 1. non occorre conoscere il tipo esatto della colonna. 2. se si cambia la definizione della colonna dal database, la variabile cambia tipo in accordo con essa

Variabili ancorate a righe E’ possibile definire delle variabili di tipo tupla legate alla definizione delle righe di una tabella. Esse costituiscono di fatto dei record, in cui le definizioni dei campi sono in corrispondenza gli attributi di una tabella. Tali variabili sono definite nel seguente modo: %ROWTYPE Assegna a nomevar il tipo delle tuple della tabella. nomevar potrà essere trattata come una tupla e nomevar.a fornirà il valore dell’attributo a nella tupla nomevar

Variabile ancorata a cursore In particolare un cursore “contiene” il risultato di una select. Dunque, allo stesso modo in cui il tipo di una variabile si può ancorare a una tabella, esso si può ancorare anche a un cursore. La variabile ancorata a un cursore è dichiarata così: %ROWTYPE

Cursori, attivazione Un cursore per essere utilizzato deve essere attivato mediante l’istruzione OPEN Quando non serve più viene disattivato mediante l’istruzione CLOSE Con l’istruzione open, il cursore viene inizializzato automaticamente alla prima tupla del risultato della select che la definisce.

Reperire valori da una tabella: Esempio Torniamo al nostro problema iniziale: supponiamo che i valori del raggio che ci interessano siano già presenti in una tabella VALORI_RAGGIO di una sola colonna Raggio. Vogliamo inserire nella tabella AREE i valori dei raggi contenuti nella tabella VALORI_RAGGIO insieme alle rispettive aree. Raggio Valori Raggio RaggioArea Aree

Cursori, Esempio DECLARE pi constant number(9,7) := ; area number (14,2); Cursor rag_cursore is Select * from Valori_raggio; val_rag rag_cursore%Rowtype; BEGIN OPEN rag_cursore; FETCH rag_cursore into val_rag; area := pi*power(val_rag.raggio,2); Insert into Aree values (val_rag.raggio, Area); CLOSE rag_cursore; end Dichiarazione del cursore rag_cursore Definizione della variabile val_rag, ancorata al cursore Attiva cursore Inserisce il contenuto del cursore nella variabile val_rag Disattiva il cursore

Esempio: Effetto RaggioArea Aree Raggio Valori Raggio Inserisce solo il primo valore della tabella Valori_Raggio e la relativa area. Come si fa a inserirle tutte?

Cicli Come in altri linguaggi di programmazione procedurali, in PL/SQL sono definiti dei costrutti per effettuare i cicli. Esistono tre principali tipi Cicli semplici: si ripetono fino al raggiungimento di un’istruzione exit o exit when Cicli FOR: si ripetono un numero fissato di volte Cicli WHILE: si ripetono mentre una condizione è soddisfatta

Cicli Semplici Sintassi: LOOP EXIT WHEN END LOOP Esempio: Inserire nella tabella aree tutte le aree dei cerchi quando il raggio assume valori interi crescenti a partire da 3, fino a quando non si trova la prima area maggiore di 100.

Ciclo semplice, Esempio DECLARE pi constant number(9,7) := ; raggio integer (5); area number (14,2); BEGIN raggio :=3; LOOP area := pi*power(raggio,2); Insert into Aree values (raggio, Area); raggio:=raggio+1; EXIT WHEN area>100; END LOOP; end RaggioArea Aree

Cicli semplici a cursore Nel nostro problema iniziale, ci interessava far variare i valori del cursore su tutta la tabella target della query. Questo si può realizzare mediante i cicli. Le condizioni per uscire dal ciclo sono spesso condizioni sullo stato del cursore. Questo stato può essere individuato mediante i valori di certi attributi: %FOUND significa che il cursore può trasmettere un record %NOT FOUND il cursore non può trasmettere record %ISOPEN il cursore è stato aperto %ROWCOUNT numero di righe trasmesse dal cursore fino a questo momento

Cicli semplici a Cursore, Esempio DECLARE pi constant number(9,7) := ; area number (14,2); Cursor rag_cursore is Select * from Valori_raggio; val_rag rag_cursore%Rowtype; BEGIN OPEN rag_cursore; LOOP FETCH rag_cursore into val_rag; EXIT WHEN rag_cursore%NOTFOUND; area := pi*power(val_rag.raggio,2); Insert into Aree values (val_rag.raggio, Area); END LOOP; CLOSE rag_cursore; end RaggioArea Aree Condizione di uscita: quando il cursore non trova più tuple

Ciclo FOR Come negli altri linguaggi di programmazione il ciclo FOR serve a ripetere un certo numero di istruzioni un numero preciso di volte. La variabile contatore viene incrementata automaticamente e la condizione di uscita è data contestualmente all’istruzione di ciclo Sintassi: For IN.. LOOP END LOOP;

Ciclo FOR, Esempio DECLARE pi constant number(9,7) := ; raggio integer (5); area number (14,2); BEGIN FOR raggio IN 1..7 LOOP area := pi*power(raggio,2); Insert into Aree values (raggio, Area); END LOOP; end RaggioArea Aree

Ciclo for a cursore In un ciclo for a cursore i risultati di una query servono per stabilire in modo dinamico il numero di esecuzioni del ciclo. In questi cicli l’apertura,la trasmissione e la chiusura dei cursori sono eseguite automaticamente. Non devono quindi essere specificate dalle corrispondenti istruizioni

Cicli FOR a cursore, esempio DECLARE pi constant number(9,7) := ; area number (14,2); Cursor rag_cursore is Select * from Valori_raggio; val_rag rag_cursore%Rowtype; BEGIN For val_rag in rag_cursore LOOP area := pi*power(val_rag.raggio,2); Insert into Aree values (val_rag.raggio, Area); END LOOP; end RaggioArea Aree Viene svolto per ogni riga della tabella Nota la mancanza delle istruzioni Open, Fetch e Close, che sono sottointese

Cicli WHILE In un ciclo While le istruzioni del ciclo vengono svolte fintantochè una certa condizione è verificata. Sintassi: WHILE LOOP END LOOP

Ciclo WHILE, Esempio DECLARE pi constant number(9,7) := ; raggio integer (5); area number (14,2); BEGIN raggio :=3; WHILE raggio<=10 LOOP area := pi*power(raggio,2); Insert into Aree values (raggio, Area); raggio:=raggio+1; END LOOP; end

Esercizio Creare una tabella Prezzi (articolo, p_netto, p_lordo) contenente il nome degli articoli, seguiti dal loro prezzo netto e dal prezzo lordo, calcolato mediante un blocco PL/SQL.

Esercizio (ciclo for) Create table Prezzi (articolo articoli.varchar2(50), p_lordo number(6,2), p_netto number(6,2)) DECLARE n articoli.art_prezzo%Type; l articoli.art_prezzo%Type; Cursor prezzo_cursore is Select art_descrizione, art_prezzo, art_IVA from Articoli; val_art prezzo_cursore%Rowtype; BEGIN For val_art in prezzo_cursore LOOP l := val_art.art_prezzo*(1+val_art.art_IVA/100); Insert into Prezzi values (val_art.art_descrizione, val_art.art_prezzo, l); END LOOP; end

Esercizio (ciclo semplice) DECLARE n articoli.art_prezzo%Type; l articoli.art_prezzo%Type; Cursor prezzo_cursore is Select art_descrizione, art_prezzo, art_IVA from Articoli; val_art prezzo_cursore%Rowtype; BEGIN Open prezzo_cursore; LOOP FETCH val_art prezzo_cursore; Exit when prezzo_cursore%NOTFOUND; l := val_art.art_prezzo*(1+val_art.art_IVA/100); Insert into Prezzi values (val_art.art_descrizione, val_art.art_prezzo, l); END LOOP; Close prezzo_cursore; end

Istruzioni condizionali In PL/SQL è possibile utilizzare i comandi if, elsif, else, per controllare il flusso delle istruzioni. Sintassi: IF THEN ELSIF THEN … ELSIF THEN ELSE END IF;

Istruzioni condizionali, esempio DECLARE pi constant number(9,7) := ; area number (14,2); Cursor rag_cursore is Select * from Valori_raggio; val_rag rag_cursore%Rowtype; BEGIN OPEN rag_cursore; FETCH rag_cursore into val_rag; area := pi*power(val_rag.raggio,2); if area>30 then Insert into Aree values (val_rag.raggio, Area); end if; CLOSE rag_cursore; end

DECLARE pi constant number(9,7) := ; area number (14,2); Cursor rag_cursore is Select * from Valori_raggio; val_rag rag_cursore%Rowtype; BEGIN OPEN rag_cursore; LOOP FETCH rag_cursore into val_rag; EXIT WHEN rag_cursore%NOTFOUND; area := pi*power(val_rag.raggio,2); CASE when val_rag.raggio=3 then Insert into Aree values (val_rag.raggio, Area); when val_rag.raggio=5 then Insert into Aree values (val_rag.raggio, Area); when val_rag.raggio=10 then Insert into Aree values (0, 0); else raise CASE_NOT_FOUND; end case; END LOOP; CLOSE rag_cursore; end

Gestione delle eccezioni Quando nell’esecuzione di un blocco PL/SQL si trovano delle eccezioni, il controllo passa (se esiste) alla sezione in cui si gestiscono le eccezioni, che è collocata alla fine dei comandi eseguibili, dopo la parola chiave exception. All’interno di questa sezione sono contenute una o più clausole del tipo When then che permettono di dire quale soluzione dare nel caso in cui un’eccezione si verifica.

Gestione delle eccezioni Se nell’esecuzione delle istruzioni viene sollevata un’eccezione, il flusso dei comandi passa alla sezione exception e verifica se l’errore verificatosi è compreso tra quelli previsti in questa sezione. Se si, viene applicata la soluzione suggerita e il programma termina

Gestione delle eccezioni Se si verifica un errore e l’eccezione non è contemplata nella sezione exception, potrebbero esserci degli effetti indesiderati, come per esempio la cancellazione di tutti i dati che sono stati inseriti fino a quel punto dal programma in una tabella.

Esempio DECLARE pi constant number(9,7) := ; raggio integer (5); area number (14,2); X number (14,2); BEGIN raggio :=3; LOOP x:=1/(raggio-4); area := pi*power(raggio,2); Insert into Aree values (raggio, Area); raggio:=raggio+1; EXIT WHEN area>100; END LOOP; end Quando il programma entra nel loop per la prima volta, tutte le istruzioni vengono eseguite, mentre la seconda volta raggio=4 fa si che il valore assegnato alla variabile x è indefinito. Allora il programma termina e si esegue il rollback (i valori che erano stati inseriti nella tabella aree vengono cancellati)

Soluzione Per evitare il rollback, la soluzione è proprio la gestione delle eccezioni. Il caso in cui il denominatore è uguale a zero viene esaminato a parte. Questo non impedisce al programma di terminare, perché una volta che ci si trova nella sezione exception non è possibile tornare al codice del programma, però questo evita che i valori già inseriti vengano cancellati.

Esempio DECLARE pi constant number(9,7) := ; raggio integer (5); area number (14,2); X number (14,2); BEGIN raggio :=3; LOOP x:=1/(raggio-4) area := pi*power(raggio,2); Insert into Aree values (raggio, Area); raggio:=raggio+1; EXIT WHEN area>100; END LOOP; Exception when ZERO_DIVIDE then insert into aree values (0,0) end

Eccezioni predefinite Molte eccezioni sono predefinite in Oracle come per esempio ZERO_DIVIDE (il programma cerca di dividere un numero per 0), CASE_NOT FOUND (nessuno dei casi del CASE è verificato e non esiste l’else) etc. Un elenco si trova nel manuale oracle a cap.42, Pagina 997. E’ anche possibile da parte del programmatore, definire delle eccezioni personalizzate mediante il comando RAISE.