PL/SQL Procedural Language/SQL estensione procedurale del linguaggio SQL.

Slides:



Advertisements
Presentazioni simili
Shell: variabili di sistema PATH HOME USER PWD SHELL HOSTNAME HOSTTYPE Per visualizzare il valore di tutte le variabili dambiente si usa il comando set.
Advertisements

Sicurezza e concorrenza nelle basi di dati
Stored Procedure Function Trigger
© 2007 SEI-Società Editrice Internazionale, Apogeo Unità D3 Sicurezza e concorrenza nelle basi di dati.
1 Comandi per la manipolazione dei dati. 2 Tipi di comandi INSERT UPDATE DELETE COMANDI COMANDI 2.
1 Basi di dati attive. 2 Sommario Preliminari Approcci architetturali Linguaggi per la specifica di regole – Eventi – Condizioni – Azioni – Ulteriori.
Algoritmi e Programmazione
1 Biglietti: schema E/R. 2 Biglietti: albero degli attributi.
Asserzioni, Viste & Triggers
Basi di dati attive Dispongono di un sottosistema integrato per definire e gestire regole di produzione (regole attive) Regole di tipo: Evento-Condizione-Azione.
Esercitazioni del Corso di Sistemi Informativi Marina Mongiello
Esercitazioni del Corso di Sistemi Informativi Marina Mongiello
SQL Structured Query Language
Elementi di PL/SQL.
Basi di dati attive Paolo Atzeni.
SQL: Lezione 7 Nataliya Rassadko
Aspetti sistemistici dellSQL. SQL environment Un SQL environment è un framework dove esistono dati e possono aversi istruzioni SQL eseguite su questi.
SQL Per la modifica di basi di dati
Procedure e funzioni nei linguaggi di alto livello Lab Programmazione - turno /2006.
SQL1 Modifica dei dati inserimento cancellazione modifica.
nome: sequenza di caratteri usata per denotare un oggetto
Modello Relazionale Definisce tipi attraverso il costruttore relazione, che organizza i dati secondo record a struttura fissa, rappresentabili attraverso.
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:
SELECT STATEMENT Clausola WHERE permette di limitare il numero di record da estrarre SELECT */ [DISTINCT] colonna/ espressione [alias],… FROM table [WHERE.
Viste. Cosè una vista? è possibile creare un subset logico di dati o una combinazione di dati una vista è una tabella logica basata su una tabella o su.
Creazione e manipolazione tabelle. TABELLE una tabella può essere creata in qualsiasi momento,anche quando gli utenti stanno usando il database la struttura.
Gestione dell’Informazione: Aspetti Introduttivi
Basi di dati Claudia Raibulet
Corso di INFORMATICA anno scolastico 2009/10 Linguaggio SQL IDENTIFICATORI di tabelle e attributi: stringhe di lunghezza max 18 caratteri, composte da.
Corso di Basi di Dati Il Linguaggio SQL
Basi di Dati e Sistemi Informativi
Basi di Dati e Sistemi Informativi SQL per Applicazioni Home page del corso:
Basi di Dati e Sistemi Informativi
Basi di dati attive. Una base di dati che offre regole attive Si parla normalmente di trigger Trigger presentati rapidamente in precedenza Si vogliono.
CORSI DI FORMAZIONE - Basi di Dati: MySql - Parte 4 - Dicembre Utenti e privilegi del database - 1 Root è lutente amministratore predefinito, ma.
Dati e DBMS DBMS relazionali SQL Progettazione di una base di dati Programma del Corso.
Dynamic SQL.
SQL*PLUS Worksheet Permette di:
SQL (IV) Data Definition Language/ Data Manipulation Language.
ESERCIZIO PL/SQL e PSP.
FUNZIONI Dichiarazione: Definizione:
Pagine ASP parte 3 I data base Stefano Schacherl.
© 2007 SEI-Società Editrice Internazionale, Apogeo Unità D3 Sicurezza e concorrenza nelle basi di dati.
PLSQL 1.1 LA REALIZZAZIONE DI APPLICAZIONI Quattro parti: Gestione dati Business rules Logica applicativa Interfaccia utente Molte possibili architetture.
SQL, esempi 30/10/2014Basi di dati SQL1. 30/10/2014Basi di dati SQL2 CREATE TABLE, esempi CREATE TABLE corsi( codice numeric NOT NULL PRIMARY KEY, titolo.
ATOMICITÀ Il tipo di atomicità di un programma PL/SQL è stabilito dall’ambiente chiamante oppure dal programma Gestione atomicità: –COMMIT –SAVEPOINT nome_punto.
Lez. 9 (13/14)Elementi di Programmazione1 Lezione 9 Valutazione di espressioni File di testo sequenziali.
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;
MySQL Database Management System
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.
UNITÀ LESSICALI Simboli, identificatori, costanti, commenti Simboli: Identificatori: lettere, numeri, $, _, #
TIPI RECORD Sintassi: –TYPE mioTipoRecord IS RECORD (field[,field]*); –field ::= nome tipo [ [NOT NULL] := expr ] I campi possono essere scalari, record,
PLSQL 1.1 LA REALIZZAZIONE DI APPLICAZIONI Quattro parti: Gestione dati Business rules Logica applicativa Interfaccia utente Molte possibili architetture.
Elementi di PL/SQL. Pl/Sql Il PL/SQL (Procedural Language/Structured Query Language) è un linguaggio di programmazione procedurale di Oracle che costituisce.
Vincoli Interrelazionali Per i vincoli visti l’inserimento di un valore che li viola viene semplicemente impedito. In caso di vincoli di integrità referenziale,
Vincoli interrelazionali
Raggruppamenti e target list scorretta select padre, avg(f.reddito), p.reddito from persone f join paternita on figlio = nome join persone p on padre =
Introduzione ai database parte seconda
ESERCIZIO PL/SQL e PSP. LO SCHEMA create table studenti ( nome VARCHAR2(15) not null, cognome VARCHAR2(15) not null, eta NUMBER );
TIPI RECORD Sintassi: –TYPE mioTipoRecord IS RECORD (field[,field]*); –field ::= nome tipo [ [NOT NULL] := expr ] I campi possono essere scalari o record.
UNITÀ LESSICALI Simboli, identificatori, costanti, commenti Simboli: Identificatori: lettere, numeri, $, _, #
Approfondimenti SQL.
Basi di Dati e Sistemi Informativi Esercitazione: Il Linguaggio SQL (DDL+DML) Home page del corso:
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.
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.
Esercizi SQL Group by. CREATE TABLE dipendente (codDip CHAR(8) NOT NULL UNIQUE PRIMARY KEY, cognome CHAR(60) NOT NULL, nome CHAR(60) NOT NULL, stipendio.
Transcript della presentazione:

PL/SQL Procedural Language/SQL estensione procedurale del linguaggio SQL

Blocco di codice declare begin exception end;. /

Sezione dichiarazioni: variabili declare descrizionevarchar(255); pi constant number(9,7) := ; finitoboolean; matricolachar(6) not null default ‘000000’; costonumber; ivanumber := costo * 0.2; c_nettonumber := costo - iva;

%type declare matricolachar(6) not null default ‘000000’; codice matricola%type; stip IMPIEGATI.STIPENDIO%type;

%rowtype declare imp IMPIEGATI%rowtype; ruoloIMPIEGATI.LAVORO%type; begin select * into imp from IMPIEGATI where INO=7369;... ruolo := imp.LAVORO;... end;

Sezione dichiarazioni: cursori cursor [ ] [is ] [for update ]; open ; fetch into ; close ;

Esempio declare cursor imp_cur is select * from IMPIEGATI; imp IMPIEGATI%rowtype; begin open imp_cur; fetch imp_cur into imp;... imp.NOME... imp.INO... close imp_cur; end;

Attributi dei cursori %found il cursore ha ancora record da trasmettere %notfound in cursore non ha più record da trasmettere %isopen il cursore è stato aperto %rowcount numero di righe trasmesse dal cursore fino a quel momento

Parametri dei cursori cursor impiegati_cur (data date, dno number) is select LAVORO, INOME from IMPIEGATI I where DATA_ASS > data and exist (select * from IMPIEGATI where I.CAPO = INO and DIPNO = dno); impiegati assunti dopo una certa data, il cui capo lavora in un certo dipartimento.

Modifiche tramite cursore cursor impiegati_cur (data date, dno number) is select LAVORO, INOME from IMPIEGATI I where DATA_ASS > data and exist (select * from IMPIEGATI where I.CAPO = INO and DIPNO = dno) for update of LAVORO;

declare manager IMPIEGATI.CAPO%type; cursor imp_cur (mgr_no number) is select STIPENDIO from IMPIEGATI where CAPO=mgr.no for update of STIPENDIO; begin select INO into manager from IMPIEGATI where INOME=’KING’; for imp_rec in imp_cur(manager) loop update IMPIEGATI set STIPENDIO=imp_rec.STIPENDIO*1.5 where current of imp_cur; end loop; commit; end;

Sezione comandi eseguibili begin assegnazioni istruzioni condizionali cicli

Istruzioni condizionali if then {elsif then } [else ] end if;

declare imp IMPIEGATI%rowtype; begin select * into imp from IMPIEGATI where INO=7369; if imp.stipendio < 1000 then update IMPIEGATI set STIPENDIO=(STIPENDIO*1.2) where INO=7369; elsif imp.stipendio > 2000 then update IMPIEGATI set STIPENDIO=(STIPENDIO*1.1) where INO=7369; else update IMPIEGATI set STIPENDIO=(STIPENDIO*1.15) where INO=7369; end if; end;

Ciclo semplice loop [exit | exit when ] end loop;

declare cursor imp_cur is select * from IMPIEGATI; imp IMPIEGATI%rowtype; begin open imp_cur; loop fetch imp_cur into imp; exit when imp_cur%notfound; if imp.stipendio < 1000 then update IMPIEGATI set STIPENDIO=STIPENDIO*1.2 where INO=imp.INO; elsif imp.stipendio > 2000 then update IMPIEGATI set STIPENDIO=STIPENDIO*1.1 where INO= imp.INO; else update IMPIEGATI set STIPENDIO=STIPENDIO*1.15 where INO= imp.INO; end if; end loop; close imp_cur; end;

Ciclo for for in [reverse] [.. | ] loop end loop;

for i in loop dbms_output.put_line(‘i = ‘ || i); sum := sum+i; end loop; for i in reverse 1..5 loop dbms_output.put_line(‘i = ‘ || i); sum := sum+2*i; end loop;

declare cursor imp_cur is select * from IMPIEGATI; imp IMPIEGATI%rowtype; begin for imp in imp_cur loop if imp.stipendio < 1000 then update IMPIEGATI set STIPENDIO=STIPENDIO*1.2 where INO = imp.INO; elsif imp.stipendio > 2000 then update IMPIEGATI set STIPENDIO=STIPENDIO*1.1 where INO = imp.INO; else update IMPIEGATI set STIPENDIO=STIPENDIO*1.15 where INO = imp.INO; end if; end loop; end;

Ciclo while while loop end loop;

declare cursor imp_cur is select * from IMPIEGATI; imp IMPIEGATI%rowtype; begin open imp_cur; fetch imp_cur into imp; while imp_cur%found loop if imp.stipendio < 1000 then update IMPIEGATI set STIPENDIO=(STIPENDIO*1.2) where INO=imp.INO; elsif imp.stipendio > 2000 then update IMPIEGATI set STIPENDIO=(STIPENDIO*1.1) where INO= imp.INO; else update IMPIEGATI set STIPENDIO=(STIPENDIO*1.15) where INO= imp.INO; end if; fetch imp_cur into imp; end loop; close imp_cur; end;

Gestione delle eccezioni exception when then ;

Eccezioni di sistema cursor_already_open – quando si apre un cursore già aperto; dup_val_on_index – se si cerca di inserire un duplicato in una tabella in cui è definito un indice unico; invalid_cursor – quando si compie un’azione illegale su un corsore (si tenta di chiudere un cursore, già chiuso, si tenta di aprire un cursore non definito, …); invalid_number – quando fallisce la conversione di una stringa in numero; no_data_found – quando una select…into non trova dati che la soddisfino;

Eccezioni di sistema (2) storage_error – memoria insufficiente o corrotta; too_many_rows – quando una select…into senza cursore genera più di una riga; zero_divide – quando si verifica una divisione per zero; others – permette di gestire tutte le eccezioni non presenti nella sezione; deve essere l’ultima della lista.

Eccezioni definite dall’utente raise raise_application_error (, )

declare imp IMPIEGATI%rowtype; begin select * into imp from IMPIEGATI where INO=7369; if imp.stipendio < 1000 then update IMPIEGATI set STIPENDIO=(STIPENDIO*1.2) where INO=7369; elsif imp.stipendio < 2000 then update IMPIEGATI set STIPENDIO=(STIPENDIO*1.15) where INO=7369; else raise TROPPO_ALTO; end if; exception when TROPPO_ALTO then insert into STIPENDIALTI values (7369, imp.stip); when no_data_found then insert into INESISTENTI values (7369); when others rollback; end;

if imp.stipendio *1.2 > 4000 then raise_application_error(-20001,’aumento di stipendio per ’ || imp.inome || ‘ troppo elevato’);

Procedure create [or replace] procedure [( )] is ; drop procedure ; execute [(parametri attuali)];

create procedure aumenta_salario(dno number, percent number default 0.5) is cursor imp_cur (dip_num number) is select STIPENDIO from IMPIEGATI where DIPNO = dip_num for update of STIPENDIO; impstip number(8); begin open imp_cur(dno); --qui viene assegnato dno a dip_num loop fetch imp_cur into impstip; exit when imp_cur%notfount; update IMPIEGATI set STIPENDIO = impstip*(100+percent)/100) where current of imp_cur; end loop; close imp_cur; commit; end aumenta_salario;

execute aumenta_salario(10,3);

Funzioni create [or replace] function [( )] return is ;

Specifica dei parametri [in | out | in out] [{ := | default}] ]

create function salario_dipartimento (dno number) return number is totale number; begin totale := 0; for imp_stip in (select STIPENDIO from IMPIEGATI where DIPNO = dno and STIPENDIO is not null) loop totale := totale + imp_stip.STIPENDIO; end loop; return totale; end salario_dipartimento;

Chiamata di una funzione variable ; execute : := [(parametri)]; drop function ;

variable salario number; execute :salario:=salario_dipartimento(20);

Package: specifica create [or replace] package as ;

create package GESTIONE_IMPIEGATI as function AssunzioneImpiegato (nome varchar2, lavoro varchar2, mng number, assunzione date, stip number, dip number) return number; procedure LicenziamentoImpiegato (imp_id number); procedure AumentaStipendio (imp_id number, stip_incr number); end GESTIONE_IMPIEGATI;

Package: corpo create [or replace] package body as ;

create package body GESTIONE_IMPIEGATI as function AssunzioneImpiegato (nome varchar2, lavoro varchar2, mng number, assunzione date, stip number, dip number) return number is new_imp number(4); begin select imp_sequence.nextval into new_imp from dual; insert into IMPIEGATI values(new_imp, nome, lavoro, mng, assunzione, stip dip); return new_imp; end AssunzioneImpiegato; procedure LicenziamentoImpiegato (imp_id number) is begin delete from IMPIEGATI where ino=imp_id; if SQL%NOTFOUND then raise_applicatioon_error( ‘Impiegato con codice ‘||to_char(imp_id)||’ non esistente.’); end if; end LicenziamentoImpiegato; procedure AumentaStipendio (imp_id number, stip_incr number) is begin update IMPIEGATI set stipendio=stipendio+stip_incr where ino=imp_id; if SQL%NOTFOUND then raise_applicatioon_error( ‘Impiegato con codice ‘||to_char(imp_id)||’ non esistente.’); end if; end AumentaStipendio; end GESTIONE_IMPIEGATI;

create or replace package body GESTIONE_IMPIEGATI as user_name varchar2; data_accesso date; function AssunzioneImpiegato (nome varchar2, lavoro varchar2, mng number, assunzione date, stip number, dip number) return number is new_imp number(4); begin select imp_sequence.nextval into new_imp from dual; insert into IMPIEGATI values(new_imp, nome, lavoro, mng, assunzione, stip dip); return new_imp; end AssunzioneImpiegato;... procedure AumentaStipendio (imp_id number, stip_incr number) is begin update IMPIEGATI set stipendio=stipendio+stip_incr where ino=imp_id; if SQL%NOTFOUND then raise_applicatioon_error( ‘Impiegato con codice ‘||to_char(imp_id)||’ non esistente.’); end if; end AumentaStipendio; begin select user, sysdate into user_name, data_accesso from dual; end GESTIONE_IMPIEGATI;

Trigger è un meccanismo che esegue automaticamente un blocco PL/SQL, quando un determinato evento si verifica su una tabella; eventi: insert, update, delete livello: riga transazione

Definizione di un trigger create [or replace] trigger {before | after | instead of} {delete | insert | update [of ]} [or {delete | insert | update [of ]}] on [ [ referencing {old [as] | new [as] }] for each row [when ( )] ]

Valori in un trigger di update si può accedere ai valori :old. e :new. in un trigger insert si può accedere solo ai valori :new. in un trigger delete si può accedere solo ai valori :old.

create or replace trigger CONTROLLA_STIP_IMPIEGATI after insert or update of STIPENDIO, LAVORO on IMPIEGATI for each row when (new.LAVORO != ‘DIRIGENTE’) –- restrizione del trigger declare minstip, maxstip SALARI.MINSAL%type; begin -- ricerca del minimo e massimo stipendio per il nuovo lavoro select MINSAL, MAXSAL into minstip, maxstip from SALARI where LAVORO = :new.LAVORO; -- se il nuovo lavoro è stato diminuito, oppure -- non rientra nell’intervallo, lancia un’eccezione if (:new.STIPENDIO < :old.STIPENDIO) then raise_application_error(-20010,’Lo stipendio è stato diminuito’); elsif (:new.STIPENDIO maxstip) then raise_application_error(-20020,’Lo stipendio è fuori dal rango consentito’); elsif (:new.STIPENDIO > 1.1 * :old.STIPENDIO) then raise_application_error(-20030,’Lo stipendio è stato aumentato più del 10%’); end if; end;

create or replace trigger CONTROLLA_STIP_SALARI before update or delete on SALARI for each row when (new.MINSAL > old.MINSAL or new.MAXSAL < old.MAXSAL) declare imp_lav number(3) := 0; begin if deleting then select count(*) into imp_lav from IMPIEGATI where LAVORO = :old.LAVORO; if imp_lav != 0 then raise_application_error(-20040, ‘Esistono degli impiegato con lavoro ‘ || :old.LAVORO); end if; if updating then select count(*) into imp_lav from IMPIEGATI where LAVORO = :new.LAVORO and STIPENDIO not between :new.MINSAL and :new.MAXSAL; if imp_lav != 0 then :new.MINSAL := old.MINSAL; :new.MAXSAL := old.MAXSAL; end if; end;

create or replace trigger CONTROOLA_BUDGET_IMPIEGATI after insert or update of STIPENDIO, DIPNO on IMPIEGATI declare cursor DIP_CUR is select DIPNO, BUDGET from DIPARTIMENTI; DNODIPARTIMENTI.DIPNO%type; TOTALESALDIPARTIMENTO.BUDGET%type; DIP_SALnumber; begin open DIP_CUR; loop fetch DIP_CUR into DNO, TOTALESAL; exit when DIP_CUR%notfound; select sum(STIPENDIO) into DIP_SAL from IMPIEGATI where DIPNO = DNO; if DIP_SAL > TOTALESAL then raise_application_error(-20050, ‘Il totale degli stipendi del dipartimento ‘ || to_char(DNO) ||’ supera il budget’); end if; end loop; close DIP_CUR; end;

Regole per l’uso dei trigger Identificare le operazioni e le tabelle che possono essere critiche relativamente a vincoli di integrità; Per ciascuna di tali tabelle se i vincoli possono essere controllati a livello di riga, allora se le righe controllate sono modificate nel trigger, allora usa trigger di riga before altrimenti usa trigger di riga after altrimenti usa trigger di transazione after.

Uso dei trigger per imporre vincoli di integrità; per monitorare l’accesso a tabelle; per propagare certe modifiche su altre tabelle;

Abilitazione/disabilitazione drop ; alter trigger disable; alter table enable |disable all trigger; Le informazioni sui trigger sono memorizzate nella tabella USER_TRIGGERS del dizionario dei dati.