SlideShare a Scribd company logo
Programma Database relazionali Architettura Oracle SQL PL/SQL Introduzione a EMC
Testi di riferimento Kevin Loney, George Koch “Oracle 9i. La Guida Completa” Ed. Mc Graw-Hill Abbey, Corey, Abramson “Guida a Oracle 9i. I Fondamenti di Oracle 9i” Ed. Mc Graw-Hill
Parte 1 Database relazionali
Oracle Architettura indipendente dal sistema Database Relazionale a Oggetti Sistema di Gestione di Database Relazionale (RDBMS), funzioni principali: Inserire dati Reperire dati Mantenere dati Struttura a tabelle Interrogazioni SQL
Tabella Citta  Temperatura  Umidita  Condizione ATENE  36  89  SOLE CHICAGO  19  88  PIOGGIA LIMA 7  79  PIOGGIA MANCHESTER 19  98  NEBBIA PARIGI 27  62  NUVOLOSO SPARTA  23  63  NUVOLOSO SYDNEY -5  12  NEVE
Query SQL Linguaggio per interagire con il database Esempio: select  Citta  from  CLIMA  where  Umidita  =  89; La sintassi SQL è semplice e chiara anche per chi non è un programmatore.
Relazioni Significato di “ Relazionale ”: due o più tabelle sono relazionate se hanno un tipo di dato in comune. Esempio:  Tabella CLIMA Tabella DISLOCAZIONE geografica
Tabelle di esempio CITTA LONGITUDINE E LATITUDINE N ------------------------- ----------- - ---------- - ATENE  23.43 E  37.58 N CHICAGO  87.38 O  41.53 N CONAKRY  13.43 O  9.31 N LIMA  77.03 O  12.03 S MADRAS  80.17 E  13.05 N MANCHESTER  2.15 O  53.3 N MOSCA  37.35 E  55.45 N PARIGI  2.2 E  48.52 N SHENYANG  123.3 E  41.48 N ROMA  12.29 E  41.54 N TOKYO  139.5 E  35.42 N SYDNEY  151.1 E  33.52 S SPARTA  22.27 E  37.05 N MADRID  3.14 O  40.24 N CITTA  CONDIZIONE TEMPERATURA -----------  -----------  ----------- LIMA  PIOGGIA  7 PARIGI  NUVOLOSO  27 MANCHESTER NEBBIA  19 ATENE  SOLE  36 CHICAGO PIOGGIA  19 SYDNEY  NEVE  -2 SPARTA  NUVOLOSO  23
Nomi delle colonne dati Utilizzo di codici a struttura predefinita, oppure nomi in lingua corrente. Codice: Esigenza risparmio spazio memoria (ora non più) Per la categorizzazione di molti articoli non è sufficiente la lingua corrente Velocità inserimento (ma lentezza ad addestrare operatori) Abbreviazioni: Riduzione errori inserimento Applicazioni comprensibili Necessita di normalizzazione dei dati
Normalizzazione Separazione degli elementi dei dati (nomi, indirizzi, ecc…) in gruppi di affinità Definizione della relazione “normale” tra essi (“corretta”)
Biblioteca Tabella di partenza: BIBLIOTECA Titolo Editore Autore 1 Autore 2 Autore 3 Categoria 1 Categoria 2 Categoria 3 Classificazione DescrizioneClassificazione
Problematiche Numero di autori limitato Numero di categorie limitato Un aggiornamento dei dettagli delle categorie o dell’autore porta a un riaggiornamento generale della tabella
1° Forma Normale Separazione dei dati in tabelle separate, raggruppando i dati per tipo Esempio:  BIBLIOTECA  AUTORE AUTORE-BIBLIOTECA Individuazione chiave primaria (etichetta o ID)
Biblioteca 1° Forma Normale
2° Forma Normale Selezione dati dipendenti solo da una parte della chiave  Spostamento in nuova tabella dei dati indipendenti Esempio:  DescrizioneClassificazione non dipende da Titolo, ma da Classificazione
Biblioteca
3° Forma Normale Spostare tutti gli elementi delle tabelle che non dipendono unicamente dalla chiave primaria Esempio:  Categoria Una volta impostati i dati in 3° Forma Normale, sono automaticamente anche in 1° e 2°
Ricerca tra i dati AUTORE NomeAutore  Commenti ---------------------  ------------------------------------------- DIETRICH BONHOEFFER  TEOLOGO TEDESCO, UCCISO IN CAMPO DI CONCENTRAMENTO ROBERT BRETALL  STUDIOSO DI KIERKEGAARD ALEXANDRA DAY AUTRICE DI LIBRI ILLUSTRATI PER BAMBINI STEPHEN JAY GOULD  GIORNALISTA SCIENTIFICO, PROFESSORE AD HARVARD SOREN KIERKEGAARD  FILOSOFO E TEOLOGO DANESE HARPER LEE  ROMANZIERE AMERICANO, HA PUBBLICATO UN SOLO ROMANZO LUCY MAUD MONTGOMERY  SCRITTRICE CANADESE JOHN ALLEN PAULOS  PROFESSORE DI MATEMATICA J. RODALE  ESPERTO DI GIARDINAGGIO CLASSIFICAZIONE Classificazione  DescrizioneClassificazione ---------------  -------------------------- 1  EVASIONE 2  INFORMAZIONI DI BASE 3  CONSIGLIATO 4  VIVAMENTE CONSIGLIATO 5  LETTURA INDISPENSABILE
Ricerca tra i dati CATEGORIA NomeCategoria  CategoriaPadre  SottoCategoria -------------  --------------  -------------- CONSADULTI  ADULTI  CONSULTAZIONE NARRADULTI  ADULTI  NARRATIVA SAGGIADULTI  ADULTI  SAGGI ILLUSRAGAZZI  RAGAZZI  ILLUSTRATI NARRRAGAZZI  RAGAZZI  NARRATIVA SAGGIRAGAZZI  RAGAZZI  SAGGI AUTORE_BIBLIOTECA Titolo  NomeAutore ------------------------------  --------------------- TO KILL A MOCKINGBIRD  HARPER LEE WONDERFUL LIFE  STEPHEN JAY GOULD INNUMERACY  JOHN ALLEN PAULOS KIERKEGAARD ANTHOLOGY  ROBERT BRETALL KIERKEGAARD ANTHOLOGY  SOREN KIERKEGAARD ANNE OF GREEN GABLES  LUCY MAUD MONTGOMERY GOOD DOG, CARL  ALEXANDRA DAY LETTERS AND PAPERS FROM… DIETRICH BONHOEFFER
Ricerca tra i dati BIBLIOTECA Titolo  Editore  NomeCategoria  Classificazione ------------------------------  ---------------------  -------------  ------ TO KILL A MOCKINGBIRD  HARPERCOLLINS  NARRADULTI  5 WONDERFUL LIFE  W.W.NORTON & CO.  SAGGIADULTI  5 INNUMERACY  VINTAGE BOOKS SAGGIADULTI  4 KIERKEGAARD ANTHOLOGY  PRINCETON UNIV PR  CONSADULTI  3 ANNE OF GREEN GABLES  GRAMMERCY  NARRRAGAZZI 3 GOOD DOG, CARL  LITTLE SIMON  ILLUSRAGAZZI  1 LETTERS AND PAPERS… SCRIBNER  SAGGIADULTI  4
Normalizzazione Fa parte del processo di analisi, non di progettazione Le tabelle normalizzate non rappresentano il “progetto” del database
Assegnare i nomi Scegliere nomi per tabelle e colonne No alle abbreviazioni incongruenti o arbitrarie Scopo e significato di una tabella devono risultare evidenti Attenzione all’uso del plurale Attenzione agli underscore Case-insensitive nei nomi di tabella e colonna
Codici Nomi abbreviati e codificati: BIBLIOTECA  A_L  AUT  CATEGORIE -------------  --------  ------------  -------------- titolo  titolo  autn  cat ed  autn  comm  cat_p cat  cat_s clas Difficile lettura Necessita di addestramento operatori Difficile anche per il programmatore riprenderla dopo molto tempo
Risultato Query SQL select  Titolo, NomeAutore  from  AUTORE_BIBLIOTECA; Titolo  NomeAutore ------------------------------ --------------------- TO KILL A MOCKINGBIRD  HARPER LEE WONDERFUL LIFE  STEPHEN JAY GOULD INNUMERACY  JOHN ALLEN PAULOS KIERKEGAARD ANTHOLOGY  ROBERT BRETALL KIERKEGAARD ANTHOLOGY  SOREN KIERKEGAARD ANNE OF GREEN GABLES  LUCY MAUD MONTGOMERY GOOD DOG, CARL  ALEXANDRA DAY LETTERS AND PAPERS… DIETRICH BONHOEFFER
Comprensione dei compiti Quali compiti deve agevolare l’applicazione? Quali dati servono? Quali dati devono essere elaborati? Quali dati devono essere restituiti? Documentazione da produrre: dei compiti dei dati
Chiavi intelligenti Dette anche “chiavi sovraccariche” Esempio di descrizione di una chiave sovraccarica: “ L12348I : Il primo carattere rappresenta il codice della regione. I successivi quattro caratteri rappresentano il numero del catalogo. La cifra finale è il codice del costo centrale, a meno che questo non sia una parte importata, nel qual caso una ‘I’ viene accodata al numero, o a meno che si tratti di un elemento voluminoso, per esempio viti, in cui vengono utilizzate solo tre cifre per il numero del catalogo e il codice della regione è HD” Scomporre in chiavi primarie o esterne
Riepilogo Far partecipare gli utenti alla progettazione: nomi, dati, chiavi. Utilizzare nomi comprensibili e facili da memorizzare, in lingua corrente.  Non usare codici e abbreviazioni. Utilizzare chiavi significative. Scomporre le chiavi sovraccariche. Analisi e progettazione vanno svolte in funzione sia dei dati sia dei compiti.  Spostare le operazioni da svolgere dagli utenti al sistema. Dedicare tempo e attenzione ad analisi, progettazione, test e tuning.
Parte 2 Architettura Oracle
Panoramica Oracle può essere inserito in architetture a diversi livelli: 2 livelli: Client – Server 3 livelli: Client – Application Server – Database Server
Server Oracle Un Server Oracle è costituito da tre componenti: Le strutture di memoria  I processi  I file fisici  In genere con il termine  database  si fa riferimento esclusivamente ai file fisici, mentre processi e strutture di memoria costituiscono l’istanza.
Installazione Supponiamo di aver installato il software in una directory chiamata  c:racle  e di aver creato un database chiamato ORCL. La directory c:racle viene chiamata ORACLE_HOME, e contiene: c:racledminRCLfile c:racleatabase c:racleradataRCL Le prime due contengono il file di inizializzazione, ad esempio init.ora o spfileORCL.ora, cioè il file necessario per informare il sistema della quantità di RAM da allocare ,e quali processi lanciare. Tutte queste informazioni sono memorizzate nel file sotto forma di parametri cui viene assegnato un valore. La directory c:racleradataRCL conterrà invece i files che costituiscono il database ORCL.
Istanza Per utilizzare il database occorre allocare una struttura che possa interagire con essi. Tale struttura prende il nome di  Istanza  o  Server , ed è costituita da strutture di memoria e processi che lavorano con essa.
Strutture di memoria Il sistema legge il file di inizializzazione ( parameter file ) e richiede al sistema operativo una certa quantità di RAM. All’interno della RAM vengono create due tipi di strutture di memoria:  La SGA. La PGA.
SGA System Global Area  E’ costituita da diverse aree di memoria: Redo Log Buffer Cache  Database Buffer Cache  Shared Pool  Large Pool  Java Pool  Tutti i singoli componenti possono essere dimensionati in maniera opportuna usando i parametri presenti nel file di inizializzazione, ad esempio nell' init.ora . La dimensione totale della SGA è data dalla somma delle dimensioni dei singoli componenti.
Schema SGA:
RL BC RL BC (Redo Log Buffer Cache)   E’ quella parte della memoria in cui vengono registrati tutti i comandi di modifica che vengono lanciati sul database.  Lo scopo principale è di garantire la consistenza del database, permettendo al sistema di ripristinare i dati in seguito a crash improvvisi. Se si salva su file tutti i comandi che sono transitati in quest’area, si può ricreare l’intero Db su altre macchine.
DB BC DB BC (Data Base Buffer Cache) Quest’area viene utilizzata per memorizzare tutti i dati elaborati dal sistema.  Se viene lanciata una query: il sistema accede ai file di pertinenza prende i dati li porta nella DB BC li elabora li restituisce all’utente che ne ha fatto richiesta.
Shared Pool Area Shared Pool Area È un’area condivisa, all’interno della quale possiamo distinguere tre sotto aree: Data Dictionary (DD) Library Cache Strutture di controllo
Shared Pool Area Il Data Dictionary è il contenitore delle informazioni di sistema: Utenti, le tabelle, le viste, i file, i permessi.  Quando viene lanciata una query il sistema controlla se gli oggetti indicati nella query esistono, se l’utente ha i permessi per eseguire quell’operazione, ecc…
Shared Pool Area La Library Cache invece è costituita dalla: Shared Sql Area Pl/Sql procedure e package Locks ed altre strutture La Shared Sql Area e’ un’area particolare che contiene le query lanciate sul db, ed il loro codice risultante (non il risultato), il sistema esegue i seguenti passi: Controllo sintassi query SQL Controllo esistenza oggetti Controllo privilegi Controllo indici per velocizzare la query Elaborazione risultato e generazione codice risultante.
Shared Pool Area Large Pool   Area di memoria opzionale.  Puo’ essere configurata per fornire memoria aggiuntiva per alcune particolari operazioni sul database, come il backup od il restore.  Se quest’area non è configurata, viene utilizzata la database buffer cache, cosa che potrebbe provocare contese con i dati degli utenti.  Java Pool Area opzionale, usata per eseguire al suo interno codice java
PGA PGA Program Global Area Contiene informazioni su ogni singolo processo Non è condivisa come la SGA, nel senso che ogni singolo processo di Oracle ha la sua area privata nella quale vengono memorizzate i valori delle variabili, informazioni sulle connessioni, ecc… E’ costituita da 3 aree: stack space informazioni sulla sessione area di ordinamento
Processi I processi sono componenti che mettono in relazione tra di loro i vari elementi del server. Ad esempio si occupano di caricare in memoria i dati presenti sui files, elaborano le istruzioni inviate dagli utenti, salvano su file le modifiche ai dati. Ogni database ha un certo numero di processi sempre attivi, mentre altri possono essere attivati solo in particolari configurazioni.  Alcuni processi, quelli che hanno una “n” nella loro sigla, possono essere lanciati più volte. Ad esempio il  DBWn .
DBWn Database Writer Ogni volta che viene modificato un dato, esso viene dapprima modificato in memoria, e poi la modifica viene salvata su file dal DBWn.  Il primo DBWn attivato è il DBW0, e si può attivarne altri 9 utilizzando il parametro DB_WRITER_PROCESSES presente nel file di inizializzazione. E’ necessario un hardware adeguato. Quando viene eseguita una modifica ad un dato, viene inizialmente fatta in memoria, in un buffer adeguato. I buffers che sono stati modificati e non ancora salvati su file vengono chiamati Dirty Buffers. Il DBWn scrive i Dirty Buffers sui DF (Data Files). La scrittura avviene in blocco, per ridurre le contese di accesso a disco, e la quantità di blocchi scritti in unica operazione di I/O dipende dal SO.
LGWR Log Writer Questo processo si occupa di scrivere sugli RLF (Redo Log Files), in maniera circolare, i buffers della Redo Log Buffer Cache.  In pratica si occupa di registrare su file tutti i comandi di modifica che sono transitati nella rispettiva area di memoria.
CKPT Chekpoint È un evento che scarica tutti i dati modificati nella buffer cache sui dischi, ed esegue l'update dei CF (file di controllo del database) e dei DF (data files). Più spesso si verifica il Checkpoint, minore sarà il tempo necessario a fare il recovery.
SMON System Monitor Si occupa di fare il recovery dell'istanza dopo crash, e controlla il Db all'avvio, appoggiandosi al contenuto dei RLF. Esegue la pulizia dei segmenti temporanei non più usati. In fase di recovery se alcune transazioni vengono saltate, perché i file corrispondenti sono off-line, SMON esegue il recovery di tali transazioni quando i file tornano on-line. SMON saltuariamente si attiva per eseguire controlli, ma può anche essere attivato da altri processi.
PMON Process Monitor Esegue la pulizia di tutte le risorse usate dai processi nel caso essi terminino in maniera anomala. Esegue il Reset sulla tabella delle transazioni attive, e rimuove il Process Id dalla lista dei processi attivi. Rilascia tutte le risorse bloccate dall'utente, e tutti i suoi locks. Si attiva periodicamente.
ARCn Archiver Si occupa di eseguire copia dei RLF prima che vengano sovrascritti. Se ne possono avere fino a 10, da ARC0 fino ad ARC9. È il LGWR che lancia nuovi ARCn se il loro numero è  insufficiente a gestire il carico di lavoro.
RECO Recoverer Viene usato per gestire le transazioni distribuite. Il suo scopo è quindi gestire le transazioni "in-doubt", cioè quelle che coinvolgono più Db in contemporanea e che falliscono (problemi di rete o crash di server) prima di salvare le modifiche.
Altri processi LCKn (Lock) Sono usati in configurazione RAC, quando più istanze montano lo stesso Db. QMNn (Queue Monitor) Esegue monitoraggio delle code messaggi.I messaggi vengono salvati in code, e permettono ai server di processarli in "differita". Dnnn (Dispatcher) Si hanno in configurazione Shared Server, per gestire più utenti usando un numero limitato di processi server. Snnn (Shared Server) Hanno stesse identiche funzionalita' dei processi server dedicati.
Tipi di processi Processo Utente   Programma applicativo (o Tool Oracle come sql*plus), che genera, quando viene lanciato, un processo utente. Tale processo può girare sul Server o su un qualunque Client. Processo Server Prende le richieste dal processo Client, ed interagisce con l'istanza per soddisfare la richiesta. Esso pertanto si occupa di: Eseguire il parsing e l'esecuzione dei comandi SQL. Accedere ai DF e portare i blocchi dati richiesti nella Buffer Cache Restituire i dati al processo utente che ne ha fatto richiesta
File Fisici I file fisici possono essere divisi in tre categorie principali: DF: DATA FILES Fisicamente contengono i dati del DB. Sono organizzati logicamente in Tablespaces. RLF: REDO LOG FILES Gli RLF sono invece “la parte fisica” della Redo Log Buffer Cache, e memorizzano quindi tutti i comandi di modifica lanciati sul Db. Lo scopo è quello di limitare od eliminare del tutto la perdita di dati in caso di crash o failure del sistema. CF: CONTROL FILES Contiene informazioni sul Db come il nome, su tutti i file che lo costituiscono, sulla loro dimensione e posizione, e su alcuni eventi particolari del Db stesso.
Schema La figura mostra la relazione tra blocchi, extent, segment, datafile, tablespace e database:
Tablespace Sono dei contenitori logici, riconosciuti solo da Oracle e non dal sistema operativo, fisicamente formati da uno o più DF. Ogni Db Oracle ha almeno un tablespace:  SYSTEM , il quale fisicamente è costituito da uno o più DF. Quando un utente di crea degli oggetti deve specificare su quale tablespace devono essere memorizzati. L’oggetto sarà memorizzato in uno dei file che costituiscono quel tablespace. Se lo spazio all’interno del tablespace finisce, si può aggiungere un altro file al tablespace, oppure si può aumentare la dimensione di uno dei file esistenti. Il vantaggio è che per l’utente queste modifiche sono trasparenti: l’utente sa solamente che i suoi dati sono memorizzati in un dato tablespace, e non su quale file specifico risiedono.
La creazione del Database  Costruzione del PFILE (parameter file). Il file contiene una serie di parametri necessari per attivare l’istanza (SGA + processi).  Dopo aver avviato l’istanza, si crea il database mediante il comando “CREATE DATABASE”.  Infine si configura e personalizza il sistema.
PFile Contiene al suo interno una serie di parametri necessari per attivare e configurare l’istanza.  È l’istanza che permette di accedere ad un database e lavorare con esso. I parametri di inizializzazione sono generalmente distinti in espliciti ed impliciti: espliciti sono quelli presenti nel parameter file.  Impliciti sono quelli non esplicitamente valorizzati, che assumeranno un valore di default.
PFile Parametri principali: CONTROL_FILES indica la path completa dei CF utilizzati dal database. Il control file è unico, ma si possono avere dei mirror. Esempio: control_files=("c:racleradataRCLontrol01.ctl“) DB_BLOCK_SIZE indica la dimensione del blocco Oracle. Non può più essere modificato dopo la creazione del database.  Default a 4 Kb, compreso tra 2 Kb e 32 Kb.
PFile DB_NAME indica il nome del Db, che può essere lungo fino ad 8 caratteri, di cui il primo deve essere alfabetico, e può contenere solamente i caratteri speciali : #, _ , e $. Il nome del database potrebbe essere cambiato dopo la sua creazione, ma è si deve ricreare il CF. LOG_BUFFER indica la dimensione in Bytes della Redo log Buffer Cache. Il parametro non è dinamico. SHARED_POOL_SIZE indica la dimensione, in bytes, della Shared Pool. Il default è 16 Mb, ed il parametro è dinamico.
PFile LARGE_POOL_SIZE indica la dimensione, in bytes, della Large Pool. Il default è 0, ed il parametro è dinamico. JAVA_POOL_SIZE indica la dimensione, in bytes, della Java Pool. Il default è 20.000 Kb. Se non si usa Java si può impostare 0. SGA_MAX_SIZE indica la dimensione massima che può avere la SGA. Imposta il limite massimo che Oracle può usare per evitare lo swap. Si consiglia di impostare un valore inferiore, rispetto alla ram fisicamente installata sul server, di almeno 300 Mb, a seconda del sistema operativo e delle applicazioni installate.
PFile PROCESSES indica il numero massimo di processi, inclusi quelli in background, che possono connettersi all’istanza. BACKGROUND_DUMP_DEST indica la directory di Dump dei processi in caso di crash. Nella directory viene anche salvato il file Alert.log. CORE_DUMP_DEST indica la directory di Dump del Core. Tale parametro non viene usato in Windows. USER_DUMP_DEST indica directory di Dump dei processi degli utenti. REMOTE_LOGIN_PASSWORDFILE indica il metodo di autenticazione.
PFile COMPATIBLE indica la release di compatibilità. Utile in caso di migrazione da un vecchio database, e si vogliono disattivare per problemi di compatibilità  alcune funzionalità.  UNDO_MANAGEMENT indica se la gestione dei Segmenti di Rollback deve essere effettuata in modalità automatica. SORT_AREA_SIZE indica la dimensione dell’area di memoria da utilizzare per gli ordinamenti temporanei (Temporary sorts). In generale più è grande questo valore e più veloci sono le operazioni di sort o join.
Variabili d’ambiente Oltre ai parametri indicati nel PFILE si devono considerare le variabili d’ambiente del sistema operativo, soprattutto in ambito Unix. Tali variabili permettono di individuare correttamente il software oracle necessario al corretto funzionamento. Variabili principali: ORACLE_BASE La directory alla base dell’installazione. Tutte le versioni di Oracle presenti su una macchina devono essere installate sotto questa directory. ORACLE_HOME indica la directory contenente il software, ed è relativa alla oracle_base. ORACLE_SID indica il nome dell’istanza. PATH indica la directory contente gli eseguibili, in genere $ORACLE_HOME/bin
Creazione del DB Creazione del file di autenticazione per utenze amministrative. Utilizzo di sql*plus e connessione come utente SYS. Attivazione dell’istanza (startup) Create database
Data Dictionary È l’insieme delle tabelle e viste contenenti informazioni sui metadata del Db, come gli utenti, le tabelle, i privilegi, ecc… Le informazioni in esso contenute sono vitali per il corretto funzionamento del database. Tuttavia le tabelle contengono informazioni codificate e di non semplice lettura, mentre le viste decodificano tali informazioni rendendole disponibili agli utenti abilitati. Dopo la creazione del database è importante creare le viste, al fine di poter interrogare il sistema chiedendo ad esempio quanti e quali sono i tablespaces. Le viste vengono create dagli script lanciati dopo creazione del Db, che si trovano in $ORACLE_HOME/rdbms/admin
Viste di sistema Le viste sono query memorizzate nel database. Gli script permettono di creare le cosiddette “viste di sistema”, molto utili per ricavare informazioni sul database, in quanto le tabelle interne, comunque accessibili dai SYSDBA, memorizzano i dati in un formato spesso numerico e di difficile interpretazione. Le viste di sistema sono classificate in base al prefisso: USER_ Contengono informazioni sugli oggetti di proprietà dell’utente che lancia la query sulla vista. ALL_Contengono informazioni sugli oggetti sui quali l’utente che lancia la query ha accesso o privilegi. DBA_  Contengono informazioni sugli oggetti di tutti gli utenti. Solo gli utenti privilegiati (aventi il ruolo SELECT_CATALOG_ROLE come SYSTEM o SYS) possono eseguire delle query sulle viste DBA_. Alcune di esse contengono informazioni sulle strutture del DB, come l’elenco dei DF.
Viste di sistema V$ Dynamic Performance Views, in quanto il loro contenuto è strettamente legato alle performance e perché i dati su cui si appoggiano vengono aggiornati continuamente. GV$ Perr la quasi totalità delle V$, Oracle ha un corrispondente GV$. Sono Dynamic Performance Views Globali. La GV$ corrispondente ha una colonna in più, INST_ID, che identifica il numero dell’istanza. Osservazione: le viste USER_ ed ALL_ hanno le stesse informazioni, differiscono per la presenza o meno della colonna OWNER, mentre le viste DBA_ hanno in genere qualche informazione in più.
Viste Esempi di vista con informazioni sulle tabelle: USER_TABLES USER_TAB_COLUMNS ALL_TABLES ALL_TAB_COLUMNS DBA_TABLES DBA_TAB_COLUMNS
Esempi di viste Per ottenere un elenco di tutte le viste del Data Dictionary, si possono lanciare le query: SQL> select * from DICTIONARY;  Se si vogliono informazioni sul contenuto delle singole colonne lanciare la query: SQL> select * from DICT_COLUMNS;  È meglio far precedere, per visualizzare meglio l’output a video, da: SQL> set linesize 1500 SQL> COL TABLE_NAME FORMAT A25 SQL> COL COMMENTS FORMAT A40
Utenti Durante la creazione del database vengono creati di default due utenti: SYS (default password: CHANGE_ON_INSTALL) SYSTEM (default password: MANAGER) SYS è il proprietario di tutte le tabelle di sistema. SYSTEM è un amministratore meno “potente” di SYS, ma sufficiente per svolgere la maggior parte dei compiti tipici dell’amministratore del database.
Ruoli Due ruoli di default: SYSOPER e SYSDBA.  SYSOPER   STARTUP e SHUTDOWN ALTER DATABASE [ OPEN / MOUNT ] ALTER DATABASE BACKUP ALTER DATABASE ARCHIVELOG RECOVER DATABASE CREATE SPFILE RESTRICTED SESSION  SYSDBA Tutti i privilegi inclusi in SYSOPER con ADMIN OPTION CREATE DATABASE ALTER DATABASE [ BEGIN / END ] BACKUP RECOVER DATABASE UNTIL (Time-based Recovery)
SPFile L’SPFILE non è altro che un file avente lo stesso contenuto del PFILE (in formato binario e quindi non più editabile direttamente), ma aggiornato direttamente dal database. I parametri di inizializzazione possono essere statici o dinamici: Quelli statici sono così definiti perché, affinché la modifica abbia effetto, è necessario riavviare il database. Quelli dinamici possono essere modificati senza essere costretti a riavviare il database. Per modificare il valore di un parametro, si utilizza il comando: ALTER SYSTEM SET nome_parametro=nuovo_valore;  Se ho un database avviato con PFILE e modifico un parametro dinamicamente con ALTER SYSTEM, devo ricordarmi di modificare il valore corrispondente nel PFILE, altrimenti al successivo riavvio del database, il sistema leggerà il PFILE, impostando il parametro al valore in esso indicato.
SPFile Si può creare (con privilegi SYSOPER o SYSDBA) utilizzando il comando:  SQL> CREATE SPFILE='C:ra_cleatabasePFILEORCL.ORA’ FROM PFILE='C:racledminRCLfilenit.ora'; A questo punto, tutte le modifiche apportate con il comando: ALTER SYSTEM SET nome_parametro=nuovo_valore; verranno salvate in automatico nell’SPFILE, e non andranno perdute in caso di riavvio del database.
SPFile Il comando ha una clausola SCOPE che può assumere tre valori: SPFILE: le modifiche apportate da ALTER SYSTEM verranno salvate solo nell'SPFILE. Affinché diventino attive occorre eseguire uno shutdown e startup. Questo è l'unico mezzo per modificare i parametri statici. MEMORY: le modifiche all'istanza verranno subito attivate, ma non verranno salvate sul file. Pertanto dopo lo startup e shutdown queste modifiche verranno perse. Non si può usare questa clausola con i parametri statici. BOTH: è il valore di default della clausola SCOPE si sta utilizzando un SPFILE, le modifiche apportate da ALTER SYSTEM verranno subito applicate all'instanza e saranno anche salvate nello SPFILE. Non si può usare questa clausola con i parametri statici.
Control File Il Control File (CF) è il file di controllo dell’intero database. Il CF è unico, ma è possibile avere dei mirror, fino a un massimo di 8. Se si danneggiano tutti i CF, il database non sarà più funzionante, ed occorrerà ricrearlo.
Control File Nome DB Timestamp di creazione del DB DF: nome, path, stato (online/offline) RLF: nome, path Informazioni sullo stato archive Nome tablespaces LSN (Log Sequence number) corrente Info sul Checkpoint più recente Inizio e fine degli Undo segments Informazioni di BackUp di RMAN La dimensione del CF è legata al valore dei seguenti parametri:  MAXLOGFILES  MAXLOGMEMBERS  MAXLOGHISTORY  MAXDATAFILES  MAXINSTANCES
Tablespace Il Tablespace è un contenitore logico, visibile solo da Oracle, costituito fisicamente da uno o più files chiamati DATA-FILES (DF). Il Sistema Operativo vede solamente i Data Files, mentre Oracle gestisce sia i data files che il loro raggruppamento logico.
Tablespace Il Tablespace può essere visto come un sottoinsieme dell'intero database. Il database più piccolo può essere costituito da un solo tablespace, SYSTEM, che è l'unico sempre presente in qualunque database Oracle in quanto è il contenitore fisico del Data Dictionary (DD), che contiene di tutti gli oggetti del database necessari al funzionamento del DB: contiene la tabella degli utenti, con tutte le informazioni relative quali login e password,  contiene la tabella con l'elenco di tutti i files del database la tabella con l'elenco di tutti gli oggetti del database la tabella con tutti i privilegi assegnati agli utenti
Tablespace Generalmente un database Oracle è costituito anche da altri tablespaces che permettono di suddividere fisicamente gli oggetti in esso memorizzati,ad esempio: un tablespace che contiene gli oggetti degli utenti (USERS) un tablespace che contiene gli indici (INDX) un tablespace che contiene gli oggetti temporanei (TEMP) un tablespace che contiene RollBack Segments (UNDO)
Tablespace A livello funzionale, la presenza di più tablespace è importante: Permette di suddividere il DB in più unità, ognuna della quale contiene solo elementi tra loro correlati. Poiché ogni tablespace fisicamente è costituita da almeno un DF, c’è la possibilità di appoggiarsi fisicamente a files diversi, che si possono memorizzare su dischi differenti al fine di migliorare le prestazioni complessive del database. Per ogni utente si può stabilire su quale tablespace potrà creare oggetti, e quanto spazio massimo utilizzare, permettendo un controllo globale preciso delle quote. Tali impostazioni sono trasparenti per gli utenti.
Vantaggi Vantaggi di avere più tablespace : Separazione del DD dagli altri dati, e quindi riduzione delle contese di accesso a disco (se i DF che costituiscono i vari tablespaces sono su dischi diversi).  Gestione delle quote per singolo utente. Gestione più efficiente degli oggetti temporanei (ad esempio per le operazioni di Sort) che vengono trattati solo su uno specifico tablespace, in genere TEMP. Gestione più efficiente dei Segmenti di Roll Back (tablespace UNDO), che sono i dati necessari a permettere l'utilizzo del comando "RollBack"  Gestione più efficiente delle applicazioni che usano lo stesso database: se infatti raggruppo le applicazioni usando un tablespace diverso per ognuna, in caso di manutenzione, una parte delle applicazioni potrebbero non funzionare (quelle che si appoggiano ai tablespaces in manutenzione o recovery) mentre le altre non risentono del disservizio. Si possono gestire le operazioni di Back Up e Recovery per singolo tablespace.
Tablespace e DF Al momento della creazione di un tablespace viene fisicamente allocato sul filesytem un DF, avente la dimensione specificata.  Il DF sarà inizialmente vuoto, ma verrà strutturato in modo da ospitare i futuri oggetti che verranno creati in esso. Oracle ha due modalità per gestire lo spazio interno: Memorizzando le informazioni nel DD. All'interno del tablespace.
Tablespace In funzione della modalità scelta si suddividono i tablespaces in:  DICTIONARY-MANAGED: Le informazioni necessarie per la gestione dello spazio sono memorizzate nel DD. Implica che ad ogni modifica dello stato di un blocco viene eseguito un update su una specifica tabella del DD. Ad ogni modifica dello stato di un blocco avviene la creazione di una informazione di UNDO, necessaria per un eventuale Rollback. LOCALLY-MANAGED: Le informazioni necessarie per la gestione dello spazio sono memorizzate nel tablespace, in genere nell'header di ogni singolo DF.  Se un blocco cambia il suo stato, la modifica non genera informazioni di UNDO, in quanto non viene eseguito nessun update su tabelle del DD. Questo tipo di tablespace permette di avere prestazioni superiori.
Temp Tablespace Serve per permettere ad Oracle di memorizzare dati od oggetti temporaneamente, facendo una sorta di SWAP ogni qual volta la Ram a disposizione non è sufficiente. L'utilizzo più frequente avviene durante le operazioni di ordinamento (SORT). All'interno del tablespace viene creato un Segment particolare, chiamato SORT SEGMENT: Condiviso da tutti gli utenti del DB Costituito da un certo numero di extents (ogni transazione userà un extent in maniera esclusiva). Allocato nel momento della prima operazione di sort. Non è possibile creare esplicitamente oggetti al suo interno.
Undo Tablespace Questo tipo di tablespace viene utilizzato internamente per consentire l'operazione di ROLLBACK. Oracle memorizza temporaneamente nel tablespace i dati che vengono modificati, permettendo di annullare le transazioni terminate erroneamente od esplicitamente dagli utenti.
Alter Tablespace Dopo aver creato un tablespace, si possono modificarne alcune caratteristiche utilizzando il comando ALTER TABLESPACE, tra cui: aggiungere nuovi DF o TF (Temporary files).  rinominare i files. modificare i parametri di storage dei tablespace dictionary-managed. modificare l'allocazione degli extents. modificare disponibilità del tablespace (ONLINE - OFFLINE).  passare da READ-ONLY a READ-WRITE e viceversa.  passare da PERMANENT a TEMPORARY e viceversa.
Parte 3 SQL
SQL Structured Query Language Operazioni fondamentali: SELECT INSERT UPDATE DELETE
Sintassi Query case insensitive: SeLeCt argoMENTO, sezione, PAGINA FROM gioRNAle; select Argomento, Sezione, Pagina from GIORNALE; Case sensitive solo nelle verifiche: Sezione = ‘f’ Sezione = ‘F’ Le due clausole precedenti sono differenti.
Tabelle Creazione di una tabella di esempio: create   table  GIORNALE ( Argomento  VARCHAR2(15) not null, Sezione  CHAR(1), Pagina  NUMBER ); “ Not null” impedisce l’inserimento della riga se il campo è vuoto
Tabella GIORNALE Argomento  Sezione  Pagina ---------------------------------------------------------- Notizie  A  1 Sport  D  1 Editoriali  A  12 Economia  E  1 Meteo  C  2 Televisione  B  7 Nascite  F  7 Annunci  F  8 Salute  F  6 Vita moderna B  1 Fumetti  C  4 Film  B  4 Bridge  B  2 Necrologi  F  6
Query select  Argomento, Sezione, Pagina  from  GIORNALE; ARGOMENTO  S  PAGINA ------------------- - ----------- Notizie  A  1 Sport  D  1 Editoriali  A  12 Economia  E  1 Meteo  C  2 Televisione  B  7 Nascite  F  7 Annunci  F  8 […]
Risultati I nomi di colonna sono visualizzati in maiuscolo La query è effettivamente case-insensitive L’ampiezza delle colonne è prefissata da Oracle (“Sezione” viene abbreviata) Per avere informazioni usiamo il comando DESCRIBE
DESCRIBE describe GIORNALE Name  Null?  Type -------------------------------  --------  ------- ARGOMENTO  NOT NULL  VARCHAR2(15) SEZIONE  CHAR(1) PAGINA  NUMBER
SELECT Comando per selezionare informazioni dalle tabelle 4 parole chiave principali: SELECT FROM WHERE ORDER BY
ORDER BY Esempio: select  Argomento, Sezione, Pagina  from  GIORNALE  where  Sezione = ‘F’  order by  Argomento; ARGOMENTO  S  PAGINA --------------- -  ------ Annunci  F  8 Nascite  F  7 Necrologi F  6 Salute F  6
ORDER BY Esempio su più campi: select  Argomento, Sezione, Pagina  from  GIORNALE  where  Sezione = ‘F’  order by  Pagina, Argomento; ARGOMENTO  S  PAGINA --------------- -  ------ Necrologi F  6 Salute F  6 Nascite  F  7 Annunci  F  8
DESC Ordinamento decrescente: select  Argomento, Sezione, Pagina  from  GIORNALE  where  Sezione = ‘F’  order by  Pagina  desc ; ARGOMENTO  S  PAGINA --------------- -  ------ Annunci  F  8  Nascite  F  7  Necrologi F  6 Salute F  6
WHERE Parola chiave per verificare un singolo valore. Uso degli operatori logici: Uguaglianza “ = “ Maggiore “ > ” Maggiore o uguale “ >= “ Minore “ < “ Minore o uguale “ <= “ Diverso “ != “  “ <> ”
LIKE Operatore logico per verificare similitudini. %  : carattere jolly _  : marcatore di posizione Sintassi di esempio: Argomento  LIKE  ‘CIA % ’ “ Argomento” inizia con le lettere CIA Argomento  LIKE  ‘ % IAO’ “ Argomento” finisce con le lettere IAO Argomento  LIKE  ‘ __ A % ’ “ Argomento” ha una “A” in terza posizione Argomento  LIKE  ‘ % 0 % 0 % ’ “ Argomento” contiene due “0”
NULL Operatore logico per verificare se una riga è vuota (priva di dati). Sintassi di esempio: Argomento  IS   NULL Argomento  IS   NOT   NULL
Query select  Argomento, Sezione, Pagina  from  GIORNALE  where  Pagina  >  4; ARGOMENTO  S  PAGINA ---------------  - ------ Editoriali  A  12 Televisione  B  7 Nascite  F  7 Annunci F  8 Necrologi  F  6 Salute  F  6
Query select  Argomento, Sezione, Pagina  from  GIORNALE  where  Argomento  LIKE  ‘N % ’; ARGOMENTO  S  PAGINA ---------------  - ------ N ascite  F  7 N ecrologi  F  6 select  Argomento, Sezione, Pagina  from  GIORNALE  where  Argomento  LIKE  ‘__i % ’; ARGOMENTO  S  PAGINA ---------------  - ------ Ed i toriali  A  12 Br i dge  B  2
Verifica di valori Operatori logici per verificare più valori: Pagina  IN  (1,2,3)  Pagina è nell’elenco (1,2,3). Pagina  NOT IN  (1,2,3)  Pagina non è nell’elenco (1,2,3). Sezione  BETWEEN  ‘B’  AND  ‘D’  Sezione è uguale a un carattere compreso tra ‘B’ e ‘D’. Pagina  NOT   BETWEEN  6  AND  10  Pagina è strettamente minore di 6 o maggiore di 10.
Logica della combinazione Gli operatori logici AND e OR si usano per combinare le espressioni logiche: AND :  visualizza le righe che soddisfano entrambe le condizioni logiche OR : visualizza le righe che soddisfano almeno una delle due condizioni logiche.
Query select  Argomento, Sezione, Pagina  from  GIORNALE  where  Sezione  =  ‘F’  OR  Pagina  >  7; ARGOMENTO  S  PAGINA ---------------  -  ------- Editoriali  A  12 Nascite  F  7 Annunci  F  8 Necrologi  F  6 Salute  F  6
Precedenza operazioni Stabilire le priorità di combinazione usando le parentesi: select  Argomento, Sezione, Pagina  from  GIORNALE  where  Pagina > 2  and   (  Sezione = ‘A’  or  Sezione = ‘B’  ) ; AND ha precedenza su OR, in assenza di parentesi.
Subquery Può essere utile inserire delle query in altre query. La subquery va racchiusa tra parentesi Se la subquery ha come risultato valori multipli (più righe), si possono usare solo operatori per valori multipli
Subquery select  ARGOMENTO  from  GIORNALE  where  Sezione  =  ‘F’; select  Sezione  from  GIORNALE  where  Argomento  =  ‘Salute’; ARGOMENTO --------------- Nascite Annunci Necrologi Salute S - F
Subquery select  ARGOMENTO  from  GIORNALE  where  Sezione  = (select  Sezione  from  GIORNALE  where  Argomento  =  ‘Salute’ ) ; ARGOMENTO --------------- Nascite Annunci Necrologi Salute
Combinazione di tabelle E’ possibile combinare più tabelle se hanno un dato in comune. Esempio:  tabella CLIMA: condizioni meteo attuali per città select  Citta, Condizione, Temperatura  from  CLIMA; tabella DISLOCAZIONE: coordinate geografiche per città select  Citta, Longitudine, EstOvest, Latitudine, NordSud  from  LOCAZIONE;
Tabelle di esempio CITTA LONGITUDINE E LATITUDINE N ------------------------- ----------- - ---------- - ATENE  23.43 E 37.58 N CHICAGO  87.38 O 41.53 N CONAKRY  13.43 O 9.31 N LIMA  77.03 O 12.03 S MADRAS  80.17 E 13.05 N MANCHESTER  2.15 O 53.3 N MOSCA  37.35 E 55.45 N PARIGI  2.2 E 48.52 N SHENYANG  123.3 E 41.48 N ROMA  12.29 E 41.54 N TOKYO  139.5 E 35.42 N SYDNEY  151.1 E 33.52 S SPARTA  22.27 E 37.05 N MADRID  3.14 O 40.24 N CITTA  CONDIZIONE TEMPERATURA -----------  ----------- ----------- LIMA  PIOGGIA 7 PARIGI  NUVOLOSO 27 MANCHESTER NEBBIA 19 ATENE  SOLE 36 CHICAGO PIOGGIA 19 SYDNEY  NEVE -2 SPARTA  NUVOLOSO 23
Unione dei risultati Le tabelle dell’esempio possono essere unite Bisogna indicare nella query il dato in comune Esempio: select   CLIMA.Citta , Condizione, Temperatura, Latitudine, NordSud, Longitudine, EastOvest  from  CLIMA, LOCAZIONE  where   CLIMA.Citta   =   LOCAZIONE.Citta ;
Risultati CITTA  CONDIZIONE  TEMPERATURA  LATITUDINE N  LONGITUDINE E -----------  -----------  -----------  ---------- -  ----------- - ATENE  SOLE  36  37.58 N  23.43 E CHICAGO PIOGGIA  19  41.53 N  87.38 O LIMA  PIOGGIA  7  12.03 S  77.03 O MANCHESTER NEBBIA  19  53.3 N  2.15 O PARIGI  NUVOLOSO  27  48.52 N  2.2 E SPARTA  NUVOLOSO  23  37.05 N  22.27 E SYDNEY  NEVE  -2  33.52 S  151.1 E
Viste Il risultato della combinazione di più tabelle può ricevere un nome ed essere utilizzato come una tabella (vista). Esempio: create view  INVASIONE  AS select  CLIMA.Citta, Condizione, Temperatura, Latitudine, NordSud, Longitudine, EstOvest from  CLIMA, DISLOCAZIONE where  CLIMA.Citta  =  DISLOCAZIONE.Citta;
Tipi di dati Servono per tipizzare i dati Oracle usa diversi tipi di dati: NUMBER CHAR DATE VARCHAR2 LONG RAW LONG RAW BLOB CLOB BFILE
Stringhe CHAR:  Lunghezza prefissata Vengono inseriti spazi vuoti per raggiungere la dimensione VARCHAR2: Lunghezza variabile
Funzioni per stringhe Sintassi:  FUNZIONE(stringa  [,opzione] ) Funzioni principali: Concat, || Lenght Lower, Upper LPad, RPad Trim, LTrim, RTrim Substr, Instr
Esempio: LOWER select  Citta, LOWER(Citta), LOWER('Citta')  from  CLIMA; CITTA  LOWER(CITTA)  LOWER('CITTA') -----------  -----------  ------------- LIMA  lima   citta PARIGI  parigi   citta MANCHESTER  manchester   citta ATENE  atene   citta CHICAGO  chicago   citta SYDNEY  sydney   citta SPARTA  sparta   citta
Esempio: concatenazione select  Citta||Paese  from  DISLOCAZIONE; CITTA || PAESE -------------------------------------------------- ATENEGRECIA CHICAGOSTATI UNITI CONAKRYGUINEA LIMAPERU MADRASINDIA MANCHESTERINGHILTERRA MOSCARUSSIA PARIGIFRANCIA SHENYANGCINA ROMAITALIA TOKYOGIAPPONE SYDNEYAUSTRALIA SPARTAGRECIA MADRIDSPAGNA
Esempio: RPAD RPAD RPAD(stringa,lunghezza [,'car']) Riempie con il carattere ‘ car ’ fino a che la stringa ha lunghezza ‘ lunghezza ’, partendo da destra select  RPAD(Citta,35,'.'), Temperatura  from  CLIMA; RPAD(CITTA,35,'.')  TEMPERATURA -----------------------------------  ----------- LIMA................................  7 PARIGI.............................  27 MANCHESTER................ 19
Esempio: LTrim LTrim LTrim(stringa [.'car']) Elimina le occorrenze del carattere ‘ car ’ select  RTRIM(Titolo,'.“')  From  RIVISTA TITOLO:  THE BARBERS WHO SHAVE THEMSELVES .&quot; HUNTING THOREAU IN NEW HAMPSHIRE“ RTRIM(TITOLO,'.“'):  THE BARBERS WHO SHAVE THEMSELVES  &quot; HUNTING THOREAU IN NEW HAMPSHIRE
Lenght e Substr Lenght: restituisce lunghezza di una stringa Non funziona sui dati di tipo LONG Substr: restituisce una sottostringa SUBSTR(stringa,inizio  [,conta] )
Funzioni numeriche Funzioni a valore singolo Operazioni fondamentali + - * / Cos, Sin, Exp, Abs, Trunc (val, precis), Round Trunc (val, precis) Funzioni di gruppo Max, Min (su gruppi di righe) Avg, Count
Gestione delle date Formato DATE Gg mm aa hh mm ss Le colonne di tipo DATE sono gestite con l’aritmetica delle date da SQL SYSDATE restituisce la data del sistema su cui è installato Oracle select SysDate from DUAL; CURRENT_DATE restituisce l’ora di sessione, con fuso orario select Current_Date from DUAL;  15-MAR-02 SYSTIMESTAMP restituisce la data di sistema in timestamp select SysTimeStamp from DUAL; 15-MAR-02 02.41.31.000000 PM -05:00
Funzioni per le date ADDMONTHS: Aggiungere mesi select ADD_MONTHS(Celebrata,6) GiornoFesta from FESTA LEAST: Data che viene per prima in un elenco select Festa, LEAST(Dataeff,Celebrata) Primo, Dataeff,Celebrata GREATEST: Data più recente in un elenco FESTA  PRIMO  DATAEFF CELEBRATA -------------------------  ---------  ---------     --------- MARTIN LUTHER KING, JR.  15-JAN-02  15-JAN-02  17-JAN-02 LINCOLNS BIRTHDAY  12-FEB-02  12-FEB-02  18-FEB-02 WASHINGTONS BIRTHDAY  18-FEB-02  22-FEB-02  18-FEB-02 MEMORIAL DAY  27-MAY-02  30-MAY-02  27-MAY-02 COLUMBUS DAY  12-OCT-02  12-OCT-02  14-OCT-02
Conversione in data Le funzioni che operano sulle date sono delicate perché hanno bisogno di operare su valori in formato DATE select LEAST('20-JAN-02','20-DEC-02') from DUAL; Restituisce risultato errato, perché considera le stringhe come letterali select LEAST(  TO_DATE ('20-JAN-02'), TO_DATE ('20-DEC-02') ) from DUAL; Restituisce il risultato corretto, utilizzando la funzione di conversione  TO_DATE
Conversione da data Per convertire una data in una stringa si usa TO_CHAR TO_CHAR(data[,'formato'[,'NLSparametri']]) Formato predefinito delle date: DD-MON-YY Usando vari parametri si possono ottenere le formattazioni desiderate: select DataNascita, TO_CHAR(DataNascita,'Month, ddth, YyyY') Formattato from COMPLEANNO; DATANASCITA  FORMATTATO -----------  ------------------------------ 12-MAY-46  May , 12th, 1946 23-AUG-37  August , 23rd, 1937 02-FEB-47  February , 02nd, 1947 20-MAY-49  May , 20th, 1949 11-NOV-42  November , 11th, 1942
Funzioni di conversione Oracle mette a disposizione molte funzioni di conversione tra diversi tipi di dato TO_CHAR: converte DATE o NUMBER TO_DATE: converte NUMBER, CHAR, VARCHAR2 TO_NUMBER: converte CHAR, VARCHAR2 Esistono delle conversioni automatiche a livello di codice Intervengono soprattutto nei parametri passati alle funzioni
Raggruppamento di righe HAVING e GROUP BY Sono clausole che funzionano su gruppi di righe e non su singole righe Sono parallele a WHERE e ORDER BY
Esempio Group By select NomeCategoria, COUNT(*) from BIBLIOTECA group by NomeCategoria; NOMECATEGORIA  COUNT(*) --------------------  ---------- NARRAADULTI  6 SAGGIAADULTI  10 CONSADULTI 6 NARRRAGAZZI  5 SAGGIRAGAZZI  1 ILLUSRAGAZZI  3
Esempio Having select  NomeCategoria, COUNT(*)  from  BIBLIOTECA  group by  NomeCategoria having  COUNT(*) 5; NOMECATEGORIA  COUNT(*) --------------------  ---------- NARRADULTI  6 SAGGIADULTI  10 CONSADULTI  6
Funzioni combinate su gruppi select  NomeCategoria, COUNT(*), AVG(Valutazione)  from  BIBLIOTECA where  Valutazione > 1  group by  Nomecategoria  having  Nomecategoria like ‘A%’  order by  COUNT(*) desc; NOMECATEGORIA  COUNT(*)  AVG(VALUTAZIONE) --------------------  ----------  ---------------- SAGGIADULTI  10  4.2 NARRADULTI  6  3.66666667 CONSADULTI  6  3.16666667
Outer Join Serve per restituire dei risultati anche se non ci sono corrispondenze in una delle 2 tabelle coinvolte da un join L’outer join può essere left, right, o full
Esempio: join Join: elenco libri ed elenco prestiti in una biblioteca select   distinct  B.Titolo from  BIBLIOTECA_PRESTITO BC, BIBLIOTECA B  where  BC.Titolo  =  B.Titolo; TITOLO ---------------------------------------- ANNE OF GREEN GABLES EITHER/OR GOOD DOG, CARL HARRY POTTER AND THE GOBLET OF FIRE INNUMERACY JOHN ADAMS MIDNIGHT MAGIC
Esempio: outer join Si vogliono ora visualizzare tutti i titoli, anche quelli non presi in prestito. Si utilizza il segno ‘+’ sul lato del join che deve restituire le righe senza corrispondenze. select  B.Titolo, MAX(BC.DataRestituzione - BC.DataPrestito) “MAX GIORNI PRESTITO!“ from  BIBLIOTECA_PRESTITO BC, BIBLIOTECA B where  BC.Titolo  (+) =  B.Titolo group by  B.Titolo;
Esempio: risultato TITOLO  Max Giorni Prestito ----------------------------------------  ------------------- ANNE OF GREEN GABLES  18 BOX SOCIALS CHARLOTTE'S WEB EITHER/OR  8 EMMA WHO SAVED MY LIFE GOOD DOG, CARL  14
Outer Join Da Oracle 9i si può usare la sintassi ANSI SQL: Left outer join… on Right outer join… on Full outer join … on select  B.Titolo, MAX(BC.DataRestituzione - BC.DataPrestito) &quot;Max Giorni Prestito“ from  BIBLIOTECA_PRESTITO BC  left outer join  BIBLIOTECA B on  BC.Titolo = B.Titolo group by  B.Titolo;
Gestione dei dati Funzioni principali INSERT Inserisce dati direttamente in una tabella Inserisce dati indirettamente tramite una vista UPDATE Modifica i dati presenti in una o più righe della tabella DELETE Cancella una o più righe
Tabella di esempio Tabella COMFORT: registra dati meteo di alcune città describe COMFORT Nome  Null?  Type -------------------------------  --------  ---- CITTA  NOT NULL  VARCHAR2(13) DATACAMPIONE  NOT NULL  DATE MEZZOGIORNO  NUMBER(3,1) MEZZANOTTE  NUMBER(3,1) PRECIPITAZIONE  NUMBER
Insert Inserisce una nuova riga Sintassi:  insert into  COMFORT values  (‘WALPOLE', '21-MAR-01'). 13.8, 6.6, 0); Il punto a fine riga della query precedente serve per andare a capo concatenando, è analogo a: values  (‘WALPOLE', '21-MAR-01‘,13.8, 6.6, 0);
Insert e date Per inserire le date è necessario utilizzare la funzione di conversione TO_DATE e specificare il formato: insert into  COMFORT values  (‘WALPOLE',  TO_DATE ('06/22/2001 1:35',‘MM/DD/YYYY HH24:MI') , 13.8, 6.6, 0);
Delete Elimina righe Bisogna indicare quali con la clausola WHERE, altrimenti la tabella viene interamente svuotata: delete from  COMFORT  where  Citta = ‘WALPOLE';
Update Aggiorna i dati di una colonna del database, per una o più righe a seconda della clausola WHERE. update  COMFORT set  Precipitazione = .5, Mezzanotte = 73.1 where  Citta = ‘KEENE‘  and  DataCampione = '22-DEC-2001';
Gestione delle tabelle Si usa il comando CREATE TABLE Bisogna definire le colonne create table  STRANO ( Citta VARCHAR2(13) NOT NULL, DataCampione DATE NOT NULL, Mezzogiorno NUMBER(3,1), Mezzanotte NUMBER(3,1), Precipitazione NUMBER );
Create table Requisiti: I nomi delle tabelle e delle colonne devono iniziare con una lettera Nomi lunghi da 1 a 30 caratteri Se i nomi non sono inseriti tra virgolette, non si distingue tra maiuscole e minuscole I tipi di dati CHAR e VARCHAR devono specificare la lunghezza
Chiavi Candidata E’ una combinazione di una o più colonne, i cui valori identificano univocamente ogni riga di una tabella. Primaria E’ una chiave candidata  speciale , può esisterne solo una e una colonna di tale chiave non può essere NULL. Creano degli indici per mantenere l’integrità del database.
Esempio: chiave candidata Chiave candidata STRANO_UQ: create table STRANO ( Citta VARCHAR2(13) NOT NULL, DataCampione DATE NOT NULL, Mezzogiorno NUMBER(4,1), Mezzanotte NUMBER(4,1), Precipitazione NUMBER, constraint  STRANO_UQ  UNIQUE  (Citta, DataCampione) );
Esempio: chiave primaria Chiave primaria STRANO_PK: create table STRANO ( Citta VARCHAR2(13), DataCampione DATE, Mezzogiorno NUMBER(4,1), Mezzanotte NUMBER(4,1), Precipitazione NUMBER, constraint  STRANO_PK  PRIMARY KEY  (Citta, DataCampione) );
Esempio: chiave primaria Si può inserire un vincolo di chiave primaria anche successivamente: alter table   STRANO   add constraint   STRANO_PK   PRIMARY KEY  ( Citta );
Chiave esterna E’ una combinazione di colonne con valori basati su quelli di una chiave primaria esterna. I valori della chiave esterna corrispondono ai valori effettivi della chiave primaria nell’altra tabella.
Esempio: chiave esterna Nella tabella BIBLIOTECA, la colonna NomeCategoria fa riferimento ai valori della colonna NomeCategoria nella tabella CATEGORIA: create table  BIBLIOTECA ( Titolo  VARCHAR2(100)  primary key , Editore  VARCHAR2(20), NomeCategoria  VARCHAR2(20), Valutazione  VARCHAR2(2), constraint  CATFK  foreign key  (NomeCategoria) references  CATEGORIA(NomeCategoria) );
Eliminazione di tabelle DROP: rimozione di una tabella drop table  STRANO; TRUNCATE: svuota una tabella, eliminando tutte le righe truncate table  STRANO;
Modifica di tabelle Comando ALTER: Aggiunta di colonne Modifica di colonne Rimozione di colonne Regole: Si può aggiungere o modificare una colonna in qualsiasi momento, purché non sia NOT NULL Si può aggiungere una colonna NOT NULL eseguendo 3 passaggi Aggiunta nuova colonna (senza specificare NOT NULL) Riempimento della nuova colonna con valori predefiniti Modifica della colonna in NOT NULL
Esempio: aggiunta colonne Aggiunta di 2 colonne alla tabella STRANO: alter table  STRANO  add  ( Condizione  VARCHAR2(9), Vento  NUMBER(3) );
Esempio: modifica colonne Modifica di una colonna: alter table  STRANO  modify  ( Condizione  VARCHAR2(9) NOT NULL, Citta  VARCHAR2(17) );
Esempio: eliminazione Eliminazione di una colonna: alter table  STRANO  drop column  Vento;
Parte 4 PL/SQL
Sicurezza e accesso Utenti Ogni utente ha nome, password, e possiede tabelle, viste e risorse da lui create Ruoli Sono serie di privilegi I privilegi si associano ai ruoli, e i ruoli si associano agli utenti Privilegi Sono regole che consentono di eseguire determinate operazioni sul database
Utenti Creazione di un utente Esistono utenti predefiniti SYS: possiede le tabelle principali del database SYSTEM: possiede altre tabelle e viste L’utente SYSTEM può creare altri utenti create   user  utente  identified  {by password | externally};
Esempio: nuovo utente Creo un nuovo utente Dora con password avocado: create user  Dora  identified by   avocado ; Modifico la password: alter user  Dora  identified by   psyche ; Assegnazione privilegi: grant   CREATE SESSION   to  Dora;
Ruoli Sono raccolte di privilegi di sistema che consentono agli utenti di effettuare operazioni: CONNECT: consente accesso a funzioni base RESOURCE: per utenti più avanzati, possono creare procedure, trigger, tipi di dati DBA: per l’amministratore di sistema, accesso e privilegi completi
Privilegi GRANT: assegna privilegi grant {privilegio sistema | ruolo | all [privileges] } [. {privilegio sistema | ruolo | all [privileges]} to {utente | ruolo} [. {utente | ruolo}] [identified by password ] [with admin option] Esempio: grant CONNECT to Judy;
Revoca REVOKE: revoca i privilegi di un utente revoke {privilegio sistema | ruolo | all [privileges]} [, {privilegio sistema | ruolo | all [privileges]}, from {utente | ruolo} [, {utente | ruolo}].
Privilegi per tabelle Tabelle e viste: INSERT UPDATE SELECT DELETE ALTER INDEX … ALL (tutti i precedenti)
Altri privilegi Procedure, funzioni, package: EXECUTE Sequenze ALTER, SELECT Directory READ WRITE …
Esempio: privilegi L’utente corrente concede l’accesso alla tabella COMFORT all’utente Bob: grant  select  on  COMFORT  to  Bob;
Ruoli personalizzati Creo un ruolo IMPIEGATO: create role  IMPIEGATO; Do il privilegio di effettuare delle Select: grant   select   on  COMFORT  to  IMPIEGATO; Do il privilegio di collegarsi al database: grant   CREATE SESSION   to  IMPIEGATO; Assegno i privilegi di un ruolo a un altro: grant  IMPIEGATO  to  MANAGER;
Indici Elenco di parole chiave contenente la posizione delle informazioni relative a un argomento. Esempio: indice analitico dei libri Non sono necessari, ma velocizzano le prestazioni Si creano con il comando CREATE INDEX: create  [bitmap | unique]  index  indice  on  tabella(colonna [,colonna]. . .) [reverse];
Indici e chiavi E’ una tecnica per garantire l’unicità delle chiavi. Esempio: create unique index  BA$TITOLO_AUTORE on  BIBLIOTECA_AUTORE(Titolo, NomeAutore); Sono molto utili in tabelle grandi, in cui una (o più) colonne sono utilizzate spesso in clausole where con uguaglianza. Lo svantaggio è un inserimento più lento delle righe nel database.
Trigger E’ un’azione che il database deve intraprendere quando si verifica un evento legato al database stesso. Tecnica utilizzata in particolare per revisioni sui dati. In genere sono legati alle operazioni fondamentali Insert, Delete e Update (DML) Per utilizzare i trigger bisogna: Possedere la tabella Avere i privilegi di Alter sulla tabella
Tipi di trigger I tipi di trigger sono definiti da: Tipo di transazione che li attiva Livello cui è eseguito il trigger Livello di riga Livello di istruzione Livello di database
Livello di riga Trigger a livello di riga: Vengono eseguiti una sola volta  per ogni riga  su cui agisce un’istruzione. Parola chiave:  for each row Utili per la sincronizzazione dei dati
Livello di istruzione Trigger a livello di istruzione: Sono eseguiti una solta volta per ogni istruzione. Se aggiungo 500 righe con una sola istruzione INSERT, il trigger viene eseguito 1 sola volta Non vengono usati in genere sui dati, ma sul controllo delle istruzioni eseguite.
Livello di database Trigger a livello di database: Si attivano su eventi legati al database, come connessioni, collegamenti, chiusure, avvii, ecc… Serve per automatizzare le operazioni di gestione del database
Altri trigger BEFORE / AFTER: Vengono eseguiti prima o dopo determinati eventi All’interno del trigger si può fare riferimento a valori vecchi e nuovi nel database. INSTEAD OF: Rimpiazza determinate azioni. In genere si usano sulle viste, per far operare invece sulle tabelle che compongono la vista. Trigger di schema: Operano su istruzioni che lavorano sugli schemi (create, alter, truncate, ecc…)
Sintassi Sintassi: create  [or replace]  trigger  [schema .]  trigger { before | after | instead of } { clausola_evento_dml | { evento_ddl [or evento_ddl ]... | evento_database [or evento_database ]... } on  { [schema .] schema | database } } [when ( condizione ) ] { blocco_pl/sql| istruzione_procedura_chiamata }
Esempio: Trigger Si vogliono registrare in una tabella AUDIT_BIBLIOTECA tutte le modifiche che vengono effettuate sulla colonna Classificazione di BIBLIOTECA. La tabella AUDIT_BIBLIOTECA riceve una INSERT con i valori del dato che si sta cambiando (UPDATE) su BIBLIOTECA. La clausola WHERE viene usata in modo particolare per indicare che utilizzeremo dati  vecchi  e  nuovi . SQL nella slide seguente…
Esempio: Trigger before create or replace trigger  BIBLIOTECA_BEF_UPD_ROW before update on  BIBLIOTECA  for each row when  (nuova.Classificazione != vecchia.Classificazione)   begin   insert into AUDIT_BIBLIOTECA   (Titolo, Editore, NomeCategoria,   Vecchia_Classificazione, Nuova_Classificazione, Data_Audit)   values   (:old.Titolo, :old.Editore, :old.NomeCategoria,   :old.Classificazione, :new.Classificazione, Sysdate);   end ;
Procedure Procedure: Stored procedure : gruppi di istruzioni SQL memorizzate nel sistema Si possono riutilizzare più volte Funzioni: Procedure che possono restituire valori agli utenti Packages: Raggruppamenti di procedure e comandi SQL Sono compilati in automatico, ma possono essere ricompilati
Procedure Una volta memorizzata, può essere eseguita Bisogna dare i permessi di esecuzione agli utenti: grant  execute  on  MIA_PROCEDURA  to  Dora; In assenza dell’assegnazione diretta del privilegio precedente, gli utenti dovranno avere il privilegio generico EXECUTE ANY PROCEDURE per eseguire la procedura. Sintassi: execute  NUOVO_LIBRO(‘ TITOLO '); Il comando execute non serve se si è: All’interno di un’altra procedura o funzione In un trigger In un package
Sintassi Sintassi: create  [or replace]  procedure  [schema .]  procedura [( argomento [ in | out | in out ] [nocopy] tipodati [, argomento [ in | out | in out ] [nocopy] tipodati]... )] [authid { current_user | definer }] { is | as } { corpo_sottoprogramma_sql | language { java name 'stringa'| c [name nome] library nome_lib [agent in ( argomento )] [with context] [parameters ( parametri )] }};
Esempio Procedura per inserire un nuovo libro in BIBLIOTECA e cancellare il titolo da una lista ordini LIBRO_ORDINE: create or replace procedure  NUOVO_LIBRO (aTitolo IN VARCHAR2, aEditore IN VARCHAR2, aNomeCategoria IN VARCHAR2) as begin insert into  BIBLIOTECA (Titolo, Editore, NomeCategoria,  Classificazione) values  (aTitolo, aEditore, aNomeCategoria, NULL); delete from  LIBRO_ORDINE where  Titolo = aTitolo; end ;
Esecuzione Esempio di esecuzione della procedura di prima: execute  NUOVO_LIBRO(‘ TITOLO','SANCTUARY PUB','SAGGIADULTI' );
Funzione E’ una procedura che restituisce un valore. Sintassi: create  [or replace]  function  [schema .] funzione [( argomento [ in | out | in out ] [nocopy] tipodati [, argomento [ in | out | in out ] [nocopy] tipodati]... )] return tipodati [{ clausola_privilegi_utentechiamante | deterministic | clausola_abilitazione_parallela } [clausola_privilegi_utentechiamante | deterministic | clausola_abilitazione_parallela]... ] { { aggregate | pipelined } using [schema .] tipo_implementazione | [pipelined] { is | as } { corpo_funzione_pl/sql | spec_chiamata }};
Esempio Si crea una funzione che restituisce la spesa dovuta ai ritardi nella riconsegna dei libri: create or replace function  SPESE_RITARDO (aNome IN VARCHAR2) return  NUMBER is saldo NUMBER(10,2); begin select  SUM(((DataRestituzione-DataPrestito) -14)*0.20) into  saldo from  BIBLIOTECA_PRESTITO where  Nome  =  aNome; RETURN (saldo); end ;
Package Specifica e corpo del package sono creati separatamente: Create Package Create Package Body Richiedono il privilegio CREATE ANY PROCEDURE
Sintassi Package: create  [or replace]  package  [utente.]  package [authid {definer | current_user} ] {is | as} specifica   package ; Package body: create  [or replace]  package body  [utente,]  corpo   package {is | as} corpo package ;
Esempio specifica Si crea un package che mette a disposizione dei suoi utenti alcune funzioni e procedure: create or replace package  GESTIONE_LIBRO as function  SPESE_RITARDO(aNome IN VARCHAR2)  return NUMBER; procedure  NUOVO_LIBRO (aTitolo IN VARCHAR2, aEditore IN VARCHAR2, aNomeCategoria IN  VARCHAR2); end  GESTIONE_LIBRO;
Esempio Body 1/2 create or replace package body  GESTIONE_LIBRO as function  SPESE_RITARDO (aNome IN VARCHAR2) return  NUMBER is saldo NUMBER(10,2); begin select  SUM(((DataRestituzione-DataPrestito) -14)*0.20) into  saldo from  BIBLIOTECA_PRESTITO where  Nome = aNome and  (DataRestituzione-DataPrestito) 14; RETURN (saldo); end  SPESE_RITARDO; Pagina 1/2
Esempio Body 2/2 procedure  NUOVO_LIBRO (aTitolo IN VARCHAR2, aEditore IN VARCHAR2, aNomeCategoria IN VARCHAR2) is begin insert into  BIBLIOTECA (Titolo, Editore, NomeCategoria, Classificazione) values (aTitolo, aEditore, aNomeCategoria, NULL); delete from  LIBRO_ORDINE where  Titolo = aTitolo; end  NUOVO_LIBRO; end  GESTIONE_LIBRO; Pagina 2/2
Inizializzazione I package possono includere comandi da eseguire ogniqualvolta il package viene chiamato, a prescindere dalla procedura o funzione chiamata all’interno del package. I package consentono di eseguire comandi che non siano specifici delle procedure raggruppate. Nell’esempio seguente, il corpo del package GESTIONE_LIBRO viene modificato in modo da includere un’istruzione SQL che registra il nome dell’utente corrente e l’indicatore orario per la prima volta in cui un componente del package viene eseguito all’interno della sessione.
Esempio: inizializzazione Si aggiunge in fondo al package l’inizializzazione: […]  //codice esempio precedente begin select  Utente, SysDate into  Nome_Utente, Data_Voce from  DUAL; end  GESTIONE_LIBRO;
Parte 5 Introduzione a EMC
EMC Enterprise Manager Console SQL*Plus Worksheet Introduzione all’uso attraverso esercizi in aula
LICENZA Questa produzione è regolata da Licenza Creative Commons: Tu sei libero: di riprodurre, distribuire, comunicare al pubblico, esporre in pubblico, rappresentare, eseguire e recitare quest'opera  di modificare quest'opera  Alle seguenti condizioni: Attribuzione . Devi attribuire la paternità dell'opera nei modi indicati dall'autore o da chi ti ha dato l'opera in licenza e in modo tale da non suggerire che essi avallino te o il modo in cui tu usi l'opera.   Non commerciale . Non puoi usare quest'opera per fini commerciali.  Condividi allo stesso modo . Se alteri o trasformi quest'opera, o se la usi per crearne un'altra, puoi distribuire l'opera risultante solo con una licenza identica o equivalente a questa.

More Related Content

Corso Oracle

  • 1. Programma Database relazionali Architettura Oracle SQL PL/SQL Introduzione a EMC
  • 2. Testi di riferimento Kevin Loney, George Koch “Oracle 9i. La Guida Completa” Ed. Mc Graw-Hill Abbey, Corey, Abramson “Guida a Oracle 9i. I Fondamenti di Oracle 9i” Ed. Mc Graw-Hill
  • 3. Parte 1 Database relazionali
  • 4. Oracle Architettura indipendente dal sistema Database Relazionale a Oggetti Sistema di Gestione di Database Relazionale (RDBMS), funzioni principali: Inserire dati Reperire dati Mantenere dati Struttura a tabelle Interrogazioni SQL
  • 5. Tabella Citta Temperatura Umidita Condizione ATENE 36 89 SOLE CHICAGO 19 88 PIOGGIA LIMA 7 79 PIOGGIA MANCHESTER 19 98 NEBBIA PARIGI 27 62 NUVOLOSO SPARTA 23 63 NUVOLOSO SYDNEY -5 12 NEVE
  • 6. Query SQL Linguaggio per interagire con il database Esempio: select Citta from CLIMA where Umidita = 89; La sintassi SQL è semplice e chiara anche per chi non è un programmatore.
  • 7. Relazioni Significato di “ Relazionale ”: due o più tabelle sono relazionate se hanno un tipo di dato in comune. Esempio: Tabella CLIMA Tabella DISLOCAZIONE geografica
  • 8. Tabelle di esempio CITTA LONGITUDINE E LATITUDINE N ------------------------- ----------- - ---------- - ATENE 23.43 E 37.58 N CHICAGO 87.38 O 41.53 N CONAKRY 13.43 O 9.31 N LIMA 77.03 O 12.03 S MADRAS 80.17 E 13.05 N MANCHESTER 2.15 O 53.3 N MOSCA 37.35 E 55.45 N PARIGI 2.2 E 48.52 N SHENYANG 123.3 E 41.48 N ROMA 12.29 E 41.54 N TOKYO 139.5 E 35.42 N SYDNEY 151.1 E 33.52 S SPARTA 22.27 E 37.05 N MADRID 3.14 O 40.24 N CITTA CONDIZIONE TEMPERATURA ----------- ----------- ----------- LIMA PIOGGIA 7 PARIGI NUVOLOSO 27 MANCHESTER NEBBIA 19 ATENE SOLE 36 CHICAGO PIOGGIA 19 SYDNEY NEVE -2 SPARTA NUVOLOSO 23
  • 9. Nomi delle colonne dati Utilizzo di codici a struttura predefinita, oppure nomi in lingua corrente. Codice: Esigenza risparmio spazio memoria (ora non più) Per la categorizzazione di molti articoli non è sufficiente la lingua corrente Velocità inserimento (ma lentezza ad addestrare operatori) Abbreviazioni: Riduzione errori inserimento Applicazioni comprensibili Necessita di normalizzazione dei dati
  • 10. Normalizzazione Separazione degli elementi dei dati (nomi, indirizzi, ecc…) in gruppi di affinità Definizione della relazione “normale” tra essi (“corretta”)
  • 11. Biblioteca Tabella di partenza: BIBLIOTECA Titolo Editore Autore 1 Autore 2 Autore 3 Categoria 1 Categoria 2 Categoria 3 Classificazione DescrizioneClassificazione
  • 12. Problematiche Numero di autori limitato Numero di categorie limitato Un aggiornamento dei dettagli delle categorie o dell’autore porta a un riaggiornamento generale della tabella
  • 13. 1° Forma Normale Separazione dei dati in tabelle separate, raggruppando i dati per tipo Esempio: BIBLIOTECA AUTORE AUTORE-BIBLIOTECA Individuazione chiave primaria (etichetta o ID)
  • 15. 2° Forma Normale Selezione dati dipendenti solo da una parte della chiave Spostamento in nuova tabella dei dati indipendenti Esempio: DescrizioneClassificazione non dipende da Titolo, ma da Classificazione
  • 17. 3° Forma Normale Spostare tutti gli elementi delle tabelle che non dipendono unicamente dalla chiave primaria Esempio: Categoria Una volta impostati i dati in 3° Forma Normale, sono automaticamente anche in 1° e 2°
  • 18. Ricerca tra i dati AUTORE NomeAutore Commenti --------------------- ------------------------------------------- DIETRICH BONHOEFFER TEOLOGO TEDESCO, UCCISO IN CAMPO DI CONCENTRAMENTO ROBERT BRETALL STUDIOSO DI KIERKEGAARD ALEXANDRA DAY AUTRICE DI LIBRI ILLUSTRATI PER BAMBINI STEPHEN JAY GOULD GIORNALISTA SCIENTIFICO, PROFESSORE AD HARVARD SOREN KIERKEGAARD FILOSOFO E TEOLOGO DANESE HARPER LEE ROMANZIERE AMERICANO, HA PUBBLICATO UN SOLO ROMANZO LUCY MAUD MONTGOMERY SCRITTRICE CANADESE JOHN ALLEN PAULOS PROFESSORE DI MATEMATICA J. RODALE ESPERTO DI GIARDINAGGIO CLASSIFICAZIONE Classificazione DescrizioneClassificazione --------------- -------------------------- 1 EVASIONE 2 INFORMAZIONI DI BASE 3 CONSIGLIATO 4 VIVAMENTE CONSIGLIATO 5 LETTURA INDISPENSABILE
  • 19. Ricerca tra i dati CATEGORIA NomeCategoria CategoriaPadre SottoCategoria ------------- -------------- -------------- CONSADULTI ADULTI CONSULTAZIONE NARRADULTI ADULTI NARRATIVA SAGGIADULTI ADULTI SAGGI ILLUSRAGAZZI RAGAZZI ILLUSTRATI NARRRAGAZZI RAGAZZI NARRATIVA SAGGIRAGAZZI RAGAZZI SAGGI AUTORE_BIBLIOTECA Titolo NomeAutore ------------------------------ --------------------- TO KILL A MOCKINGBIRD HARPER LEE WONDERFUL LIFE STEPHEN JAY GOULD INNUMERACY JOHN ALLEN PAULOS KIERKEGAARD ANTHOLOGY ROBERT BRETALL KIERKEGAARD ANTHOLOGY SOREN KIERKEGAARD ANNE OF GREEN GABLES LUCY MAUD MONTGOMERY GOOD DOG, CARL ALEXANDRA DAY LETTERS AND PAPERS FROM… DIETRICH BONHOEFFER
  • 20. Ricerca tra i dati BIBLIOTECA Titolo Editore NomeCategoria Classificazione ------------------------------ --------------------- ------------- ------ TO KILL A MOCKINGBIRD HARPERCOLLINS NARRADULTI 5 WONDERFUL LIFE W.W.NORTON & CO. SAGGIADULTI 5 INNUMERACY VINTAGE BOOKS SAGGIADULTI 4 KIERKEGAARD ANTHOLOGY PRINCETON UNIV PR CONSADULTI 3 ANNE OF GREEN GABLES GRAMMERCY NARRRAGAZZI 3 GOOD DOG, CARL LITTLE SIMON ILLUSRAGAZZI 1 LETTERS AND PAPERS… SCRIBNER SAGGIADULTI 4
  • 21. Normalizzazione Fa parte del processo di analisi, non di progettazione Le tabelle normalizzate non rappresentano il “progetto” del database
  • 22. Assegnare i nomi Scegliere nomi per tabelle e colonne No alle abbreviazioni incongruenti o arbitrarie Scopo e significato di una tabella devono risultare evidenti Attenzione all’uso del plurale Attenzione agli underscore Case-insensitive nei nomi di tabella e colonna
  • 23. Codici Nomi abbreviati e codificati: BIBLIOTECA A_L AUT CATEGORIE ------------- -------- ------------ -------------- titolo titolo autn cat ed autn comm cat_p cat cat_s clas Difficile lettura Necessita di addestramento operatori Difficile anche per il programmatore riprenderla dopo molto tempo
  • 24. Risultato Query SQL select Titolo, NomeAutore from AUTORE_BIBLIOTECA; Titolo NomeAutore ------------------------------ --------------------- TO KILL A MOCKINGBIRD HARPER LEE WONDERFUL LIFE STEPHEN JAY GOULD INNUMERACY JOHN ALLEN PAULOS KIERKEGAARD ANTHOLOGY ROBERT BRETALL KIERKEGAARD ANTHOLOGY SOREN KIERKEGAARD ANNE OF GREEN GABLES LUCY MAUD MONTGOMERY GOOD DOG, CARL ALEXANDRA DAY LETTERS AND PAPERS… DIETRICH BONHOEFFER
  • 25. Comprensione dei compiti Quali compiti deve agevolare l’applicazione? Quali dati servono? Quali dati devono essere elaborati? Quali dati devono essere restituiti? Documentazione da produrre: dei compiti dei dati
  • 26. Chiavi intelligenti Dette anche “chiavi sovraccariche” Esempio di descrizione di una chiave sovraccarica: “ L12348I : Il primo carattere rappresenta il codice della regione. I successivi quattro caratteri rappresentano il numero del catalogo. La cifra finale è il codice del costo centrale, a meno che questo non sia una parte importata, nel qual caso una ‘I’ viene accodata al numero, o a meno che si tratti di un elemento voluminoso, per esempio viti, in cui vengono utilizzate solo tre cifre per il numero del catalogo e il codice della regione è HD” Scomporre in chiavi primarie o esterne
  • 27. Riepilogo Far partecipare gli utenti alla progettazione: nomi, dati, chiavi. Utilizzare nomi comprensibili e facili da memorizzare, in lingua corrente. Non usare codici e abbreviazioni. Utilizzare chiavi significative. Scomporre le chiavi sovraccariche. Analisi e progettazione vanno svolte in funzione sia dei dati sia dei compiti. Spostare le operazioni da svolgere dagli utenti al sistema. Dedicare tempo e attenzione ad analisi, progettazione, test e tuning.
  • 29. Panoramica Oracle può essere inserito in architetture a diversi livelli: 2 livelli: Client – Server 3 livelli: Client – Application Server – Database Server
  • 30. Server Oracle Un Server Oracle è costituito da tre componenti: Le strutture di memoria I processi I file fisici In genere con il termine database si fa riferimento esclusivamente ai file fisici, mentre processi e strutture di memoria costituiscono l’istanza.
  • 31. Installazione Supponiamo di aver installato il software in una directory chiamata c:racle e di aver creato un database chiamato ORCL. La directory c:racle viene chiamata ORACLE_HOME, e contiene: c:racledminRCLfile c:racleatabase c:racleradataRCL Le prime due contengono il file di inizializzazione, ad esempio init.ora o spfileORCL.ora, cioè il file necessario per informare il sistema della quantità di RAM da allocare ,e quali processi lanciare. Tutte queste informazioni sono memorizzate nel file sotto forma di parametri cui viene assegnato un valore. La directory c:racleradataRCL conterrà invece i files che costituiscono il database ORCL.
  • 32. Istanza Per utilizzare il database occorre allocare una struttura che possa interagire con essi. Tale struttura prende il nome di Istanza o Server , ed è costituita da strutture di memoria e processi che lavorano con essa.
  • 33. Strutture di memoria Il sistema legge il file di inizializzazione ( parameter file ) e richiede al sistema operativo una certa quantità di RAM. All’interno della RAM vengono create due tipi di strutture di memoria: La SGA. La PGA.
  • 34. SGA System Global Area E’ costituita da diverse aree di memoria: Redo Log Buffer Cache Database Buffer Cache Shared Pool Large Pool Java Pool Tutti i singoli componenti possono essere dimensionati in maniera opportuna usando i parametri presenti nel file di inizializzazione, ad esempio nell' init.ora . La dimensione totale della SGA è data dalla somma delle dimensioni dei singoli componenti.
  • 36. RL BC RL BC (Redo Log Buffer Cache) E’ quella parte della memoria in cui vengono registrati tutti i comandi di modifica che vengono lanciati sul database. Lo scopo principale è di garantire la consistenza del database, permettendo al sistema di ripristinare i dati in seguito a crash improvvisi. Se si salva su file tutti i comandi che sono transitati in quest’area, si può ricreare l’intero Db su altre macchine.
  • 37. DB BC DB BC (Data Base Buffer Cache) Quest’area viene utilizzata per memorizzare tutti i dati elaborati dal sistema. Se viene lanciata una query: il sistema accede ai file di pertinenza prende i dati li porta nella DB BC li elabora li restituisce all’utente che ne ha fatto richiesta.
  • 38. Shared Pool Area Shared Pool Area È un’area condivisa, all’interno della quale possiamo distinguere tre sotto aree: Data Dictionary (DD) Library Cache Strutture di controllo
  • 39. Shared Pool Area Il Data Dictionary è il contenitore delle informazioni di sistema: Utenti, le tabelle, le viste, i file, i permessi. Quando viene lanciata una query il sistema controlla se gli oggetti indicati nella query esistono, se l’utente ha i permessi per eseguire quell’operazione, ecc…
  • 40. Shared Pool Area La Library Cache invece è costituita dalla: Shared Sql Area Pl/Sql procedure e package Locks ed altre strutture La Shared Sql Area e’ un’area particolare che contiene le query lanciate sul db, ed il loro codice risultante (non il risultato), il sistema esegue i seguenti passi: Controllo sintassi query SQL Controllo esistenza oggetti Controllo privilegi Controllo indici per velocizzare la query Elaborazione risultato e generazione codice risultante.
  • 41. Shared Pool Area Large Pool Area di memoria opzionale. Puo’ essere configurata per fornire memoria aggiuntiva per alcune particolari operazioni sul database, come il backup od il restore. Se quest’area non è configurata, viene utilizzata la database buffer cache, cosa che potrebbe provocare contese con i dati degli utenti. Java Pool Area opzionale, usata per eseguire al suo interno codice java
  • 42. PGA PGA Program Global Area Contiene informazioni su ogni singolo processo Non è condivisa come la SGA, nel senso che ogni singolo processo di Oracle ha la sua area privata nella quale vengono memorizzate i valori delle variabili, informazioni sulle connessioni, ecc… E’ costituita da 3 aree: stack space informazioni sulla sessione area di ordinamento
  • 43. Processi I processi sono componenti che mettono in relazione tra di loro i vari elementi del server. Ad esempio si occupano di caricare in memoria i dati presenti sui files, elaborano le istruzioni inviate dagli utenti, salvano su file le modifiche ai dati. Ogni database ha un certo numero di processi sempre attivi, mentre altri possono essere attivati solo in particolari configurazioni. Alcuni processi, quelli che hanno una “n” nella loro sigla, possono essere lanciati più volte. Ad esempio il DBWn .
  • 44. DBWn Database Writer Ogni volta che viene modificato un dato, esso viene dapprima modificato in memoria, e poi la modifica viene salvata su file dal DBWn. Il primo DBWn attivato è il DBW0, e si può attivarne altri 9 utilizzando il parametro DB_WRITER_PROCESSES presente nel file di inizializzazione. E’ necessario un hardware adeguato. Quando viene eseguita una modifica ad un dato, viene inizialmente fatta in memoria, in un buffer adeguato. I buffers che sono stati modificati e non ancora salvati su file vengono chiamati Dirty Buffers. Il DBWn scrive i Dirty Buffers sui DF (Data Files). La scrittura avviene in blocco, per ridurre le contese di accesso a disco, e la quantità di blocchi scritti in unica operazione di I/O dipende dal SO.
  • 45. LGWR Log Writer Questo processo si occupa di scrivere sugli RLF (Redo Log Files), in maniera circolare, i buffers della Redo Log Buffer Cache. In pratica si occupa di registrare su file tutti i comandi di modifica che sono transitati nella rispettiva area di memoria.
  • 46. CKPT Chekpoint È un evento che scarica tutti i dati modificati nella buffer cache sui dischi, ed esegue l'update dei CF (file di controllo del database) e dei DF (data files). Più spesso si verifica il Checkpoint, minore sarà il tempo necessario a fare il recovery.
  • 47. SMON System Monitor Si occupa di fare il recovery dell'istanza dopo crash, e controlla il Db all'avvio, appoggiandosi al contenuto dei RLF. Esegue la pulizia dei segmenti temporanei non più usati. In fase di recovery se alcune transazioni vengono saltate, perché i file corrispondenti sono off-line, SMON esegue il recovery di tali transazioni quando i file tornano on-line. SMON saltuariamente si attiva per eseguire controlli, ma può anche essere attivato da altri processi.
  • 48. PMON Process Monitor Esegue la pulizia di tutte le risorse usate dai processi nel caso essi terminino in maniera anomala. Esegue il Reset sulla tabella delle transazioni attive, e rimuove il Process Id dalla lista dei processi attivi. Rilascia tutte le risorse bloccate dall'utente, e tutti i suoi locks. Si attiva periodicamente.
  • 49. ARCn Archiver Si occupa di eseguire copia dei RLF prima che vengano sovrascritti. Se ne possono avere fino a 10, da ARC0 fino ad ARC9. È il LGWR che lancia nuovi ARCn se il loro numero è insufficiente a gestire il carico di lavoro.
  • 50. RECO Recoverer Viene usato per gestire le transazioni distribuite. Il suo scopo è quindi gestire le transazioni &quot;in-doubt&quot;, cioè quelle che coinvolgono più Db in contemporanea e che falliscono (problemi di rete o crash di server) prima di salvare le modifiche.
  • 51. Altri processi LCKn (Lock) Sono usati in configurazione RAC, quando più istanze montano lo stesso Db. QMNn (Queue Monitor) Esegue monitoraggio delle code messaggi.I messaggi vengono salvati in code, e permettono ai server di processarli in &quot;differita&quot;. Dnnn (Dispatcher) Si hanno in configurazione Shared Server, per gestire più utenti usando un numero limitato di processi server. Snnn (Shared Server) Hanno stesse identiche funzionalita' dei processi server dedicati.
  • 52. Tipi di processi Processo Utente Programma applicativo (o Tool Oracle come sql*plus), che genera, quando viene lanciato, un processo utente. Tale processo può girare sul Server o su un qualunque Client. Processo Server Prende le richieste dal processo Client, ed interagisce con l'istanza per soddisfare la richiesta. Esso pertanto si occupa di: Eseguire il parsing e l'esecuzione dei comandi SQL. Accedere ai DF e portare i blocchi dati richiesti nella Buffer Cache Restituire i dati al processo utente che ne ha fatto richiesta
  • 53. File Fisici I file fisici possono essere divisi in tre categorie principali: DF: DATA FILES Fisicamente contengono i dati del DB. Sono organizzati logicamente in Tablespaces. RLF: REDO LOG FILES Gli RLF sono invece “la parte fisica” della Redo Log Buffer Cache, e memorizzano quindi tutti i comandi di modifica lanciati sul Db. Lo scopo è quello di limitare od eliminare del tutto la perdita di dati in caso di crash o failure del sistema. CF: CONTROL FILES Contiene informazioni sul Db come il nome, su tutti i file che lo costituiscono, sulla loro dimensione e posizione, e su alcuni eventi particolari del Db stesso.
  • 54. Schema La figura mostra la relazione tra blocchi, extent, segment, datafile, tablespace e database:
  • 55. Tablespace Sono dei contenitori logici, riconosciuti solo da Oracle e non dal sistema operativo, fisicamente formati da uno o più DF. Ogni Db Oracle ha almeno un tablespace: SYSTEM , il quale fisicamente è costituito da uno o più DF. Quando un utente di crea degli oggetti deve specificare su quale tablespace devono essere memorizzati. L’oggetto sarà memorizzato in uno dei file che costituiscono quel tablespace. Se lo spazio all’interno del tablespace finisce, si può aggiungere un altro file al tablespace, oppure si può aumentare la dimensione di uno dei file esistenti. Il vantaggio è che per l’utente queste modifiche sono trasparenti: l’utente sa solamente che i suoi dati sono memorizzati in un dato tablespace, e non su quale file specifico risiedono.
  • 56. La creazione del Database Costruzione del PFILE (parameter file). Il file contiene una serie di parametri necessari per attivare l’istanza (SGA + processi). Dopo aver avviato l’istanza, si crea il database mediante il comando “CREATE DATABASE”. Infine si configura e personalizza il sistema.
  • 57. PFile Contiene al suo interno una serie di parametri necessari per attivare e configurare l’istanza. È l’istanza che permette di accedere ad un database e lavorare con esso. I parametri di inizializzazione sono generalmente distinti in espliciti ed impliciti: espliciti sono quelli presenti nel parameter file. Impliciti sono quelli non esplicitamente valorizzati, che assumeranno un valore di default.
  • 58. PFile Parametri principali: CONTROL_FILES indica la path completa dei CF utilizzati dal database. Il control file è unico, ma si possono avere dei mirror. Esempio: control_files=(&quot;c:racleradataRCLontrol01.ctl“) DB_BLOCK_SIZE indica la dimensione del blocco Oracle. Non può più essere modificato dopo la creazione del database. Default a 4 Kb, compreso tra 2 Kb e 32 Kb.
  • 59. PFile DB_NAME indica il nome del Db, che può essere lungo fino ad 8 caratteri, di cui il primo deve essere alfabetico, e può contenere solamente i caratteri speciali : #, _ , e $. Il nome del database potrebbe essere cambiato dopo la sua creazione, ma è si deve ricreare il CF. LOG_BUFFER indica la dimensione in Bytes della Redo log Buffer Cache. Il parametro non è dinamico. SHARED_POOL_SIZE indica la dimensione, in bytes, della Shared Pool. Il default è 16 Mb, ed il parametro è dinamico.
  • 60. PFile LARGE_POOL_SIZE indica la dimensione, in bytes, della Large Pool. Il default è 0, ed il parametro è dinamico. JAVA_POOL_SIZE indica la dimensione, in bytes, della Java Pool. Il default è 20.000 Kb. Se non si usa Java si può impostare 0. SGA_MAX_SIZE indica la dimensione massima che può avere la SGA. Imposta il limite massimo che Oracle può usare per evitare lo swap. Si consiglia di impostare un valore inferiore, rispetto alla ram fisicamente installata sul server, di almeno 300 Mb, a seconda del sistema operativo e delle applicazioni installate.
  • 61. PFile PROCESSES indica il numero massimo di processi, inclusi quelli in background, che possono connettersi all’istanza. BACKGROUND_DUMP_DEST indica la directory di Dump dei processi in caso di crash. Nella directory viene anche salvato il file Alert.log. CORE_DUMP_DEST indica la directory di Dump del Core. Tale parametro non viene usato in Windows. USER_DUMP_DEST indica directory di Dump dei processi degli utenti. REMOTE_LOGIN_PASSWORDFILE indica il metodo di autenticazione.
  • 62. PFile COMPATIBLE indica la release di compatibilità. Utile in caso di migrazione da un vecchio database, e si vogliono disattivare per problemi di compatibilità alcune funzionalità. UNDO_MANAGEMENT indica se la gestione dei Segmenti di Rollback deve essere effettuata in modalità automatica. SORT_AREA_SIZE indica la dimensione dell’area di memoria da utilizzare per gli ordinamenti temporanei (Temporary sorts). In generale più è grande questo valore e più veloci sono le operazioni di sort o join.
  • 63. Variabili d’ambiente Oltre ai parametri indicati nel PFILE si devono considerare le variabili d’ambiente del sistema operativo, soprattutto in ambito Unix. Tali variabili permettono di individuare correttamente il software oracle necessario al corretto funzionamento. Variabili principali: ORACLE_BASE La directory alla base dell’installazione. Tutte le versioni di Oracle presenti su una macchina devono essere installate sotto questa directory. ORACLE_HOME indica la directory contenente il software, ed è relativa alla oracle_base. ORACLE_SID indica il nome dell’istanza. PATH indica la directory contente gli eseguibili, in genere $ORACLE_HOME/bin
  • 64. Creazione del DB Creazione del file di autenticazione per utenze amministrative. Utilizzo di sql*plus e connessione come utente SYS. Attivazione dell’istanza (startup) Create database
  • 65. Data Dictionary È l’insieme delle tabelle e viste contenenti informazioni sui metadata del Db, come gli utenti, le tabelle, i privilegi, ecc… Le informazioni in esso contenute sono vitali per il corretto funzionamento del database. Tuttavia le tabelle contengono informazioni codificate e di non semplice lettura, mentre le viste decodificano tali informazioni rendendole disponibili agli utenti abilitati. Dopo la creazione del database è importante creare le viste, al fine di poter interrogare il sistema chiedendo ad esempio quanti e quali sono i tablespaces. Le viste vengono create dagli script lanciati dopo creazione del Db, che si trovano in $ORACLE_HOME/rdbms/admin
  • 66. Viste di sistema Le viste sono query memorizzate nel database. Gli script permettono di creare le cosiddette “viste di sistema”, molto utili per ricavare informazioni sul database, in quanto le tabelle interne, comunque accessibili dai SYSDBA, memorizzano i dati in un formato spesso numerico e di difficile interpretazione. Le viste di sistema sono classificate in base al prefisso: USER_ Contengono informazioni sugli oggetti di proprietà dell’utente che lancia la query sulla vista. ALL_Contengono informazioni sugli oggetti sui quali l’utente che lancia la query ha accesso o privilegi. DBA_ Contengono informazioni sugli oggetti di tutti gli utenti. Solo gli utenti privilegiati (aventi il ruolo SELECT_CATALOG_ROLE come SYSTEM o SYS) possono eseguire delle query sulle viste DBA_. Alcune di esse contengono informazioni sulle strutture del DB, come l’elenco dei DF.
  • 67. Viste di sistema V$ Dynamic Performance Views, in quanto il loro contenuto è strettamente legato alle performance e perché i dati su cui si appoggiano vengono aggiornati continuamente. GV$ Perr la quasi totalità delle V$, Oracle ha un corrispondente GV$. Sono Dynamic Performance Views Globali. La GV$ corrispondente ha una colonna in più, INST_ID, che identifica il numero dell’istanza. Osservazione: le viste USER_ ed ALL_ hanno le stesse informazioni, differiscono per la presenza o meno della colonna OWNER, mentre le viste DBA_ hanno in genere qualche informazione in più.
  • 68. Viste Esempi di vista con informazioni sulle tabelle: USER_TABLES USER_TAB_COLUMNS ALL_TABLES ALL_TAB_COLUMNS DBA_TABLES DBA_TAB_COLUMNS
  • 69. Esempi di viste Per ottenere un elenco di tutte le viste del Data Dictionary, si possono lanciare le query: SQL> select * from DICTIONARY; Se si vogliono informazioni sul contenuto delle singole colonne lanciare la query: SQL> select * from DICT_COLUMNS; È meglio far precedere, per visualizzare meglio l’output a video, da: SQL> set linesize 1500 SQL> COL TABLE_NAME FORMAT A25 SQL> COL COMMENTS FORMAT A40
  • 70. Utenti Durante la creazione del database vengono creati di default due utenti: SYS (default password: CHANGE_ON_INSTALL) SYSTEM (default password: MANAGER) SYS è il proprietario di tutte le tabelle di sistema. SYSTEM è un amministratore meno “potente” di SYS, ma sufficiente per svolgere la maggior parte dei compiti tipici dell’amministratore del database.
  • 71. Ruoli Due ruoli di default: SYSOPER e SYSDBA. SYSOPER STARTUP e SHUTDOWN ALTER DATABASE [ OPEN / MOUNT ] ALTER DATABASE BACKUP ALTER DATABASE ARCHIVELOG RECOVER DATABASE CREATE SPFILE RESTRICTED SESSION SYSDBA Tutti i privilegi inclusi in SYSOPER con ADMIN OPTION CREATE DATABASE ALTER DATABASE [ BEGIN / END ] BACKUP RECOVER DATABASE UNTIL (Time-based Recovery)
  • 72. SPFile L’SPFILE non è altro che un file avente lo stesso contenuto del PFILE (in formato binario e quindi non più editabile direttamente), ma aggiornato direttamente dal database. I parametri di inizializzazione possono essere statici o dinamici: Quelli statici sono così definiti perché, affinché la modifica abbia effetto, è necessario riavviare il database. Quelli dinamici possono essere modificati senza essere costretti a riavviare il database. Per modificare il valore di un parametro, si utilizza il comando: ALTER SYSTEM SET nome_parametro=nuovo_valore; Se ho un database avviato con PFILE e modifico un parametro dinamicamente con ALTER SYSTEM, devo ricordarmi di modificare il valore corrispondente nel PFILE, altrimenti al successivo riavvio del database, il sistema leggerà il PFILE, impostando il parametro al valore in esso indicato.
  • 73. SPFile Si può creare (con privilegi SYSOPER o SYSDBA) utilizzando il comando: SQL> CREATE SPFILE='C:ra_cleatabasePFILEORCL.ORA’ FROM PFILE='C:racledminRCLfilenit.ora'; A questo punto, tutte le modifiche apportate con il comando: ALTER SYSTEM SET nome_parametro=nuovo_valore; verranno salvate in automatico nell’SPFILE, e non andranno perdute in caso di riavvio del database.
  • 74. SPFile Il comando ha una clausola SCOPE che può assumere tre valori: SPFILE: le modifiche apportate da ALTER SYSTEM verranno salvate solo nell'SPFILE. Affinché diventino attive occorre eseguire uno shutdown e startup. Questo è l'unico mezzo per modificare i parametri statici. MEMORY: le modifiche all'istanza verranno subito attivate, ma non verranno salvate sul file. Pertanto dopo lo startup e shutdown queste modifiche verranno perse. Non si può usare questa clausola con i parametri statici. BOTH: è il valore di default della clausola SCOPE si sta utilizzando un SPFILE, le modifiche apportate da ALTER SYSTEM verranno subito applicate all'instanza e saranno anche salvate nello SPFILE. Non si può usare questa clausola con i parametri statici.
  • 75. Control File Il Control File (CF) è il file di controllo dell’intero database. Il CF è unico, ma è possibile avere dei mirror, fino a un massimo di 8. Se si danneggiano tutti i CF, il database non sarà più funzionante, ed occorrerà ricrearlo.
  • 76. Control File Nome DB Timestamp di creazione del DB DF: nome, path, stato (online/offline) RLF: nome, path Informazioni sullo stato archive Nome tablespaces LSN (Log Sequence number) corrente Info sul Checkpoint più recente Inizio e fine degli Undo segments Informazioni di BackUp di RMAN La dimensione del CF è legata al valore dei seguenti parametri: MAXLOGFILES MAXLOGMEMBERS MAXLOGHISTORY MAXDATAFILES MAXINSTANCES
  • 77. Tablespace Il Tablespace è un contenitore logico, visibile solo da Oracle, costituito fisicamente da uno o più files chiamati DATA-FILES (DF). Il Sistema Operativo vede solamente i Data Files, mentre Oracle gestisce sia i data files che il loro raggruppamento logico.
  • 78. Tablespace Il Tablespace può essere visto come un sottoinsieme dell'intero database. Il database più piccolo può essere costituito da un solo tablespace, SYSTEM, che è l'unico sempre presente in qualunque database Oracle in quanto è il contenitore fisico del Data Dictionary (DD), che contiene di tutti gli oggetti del database necessari al funzionamento del DB: contiene la tabella degli utenti, con tutte le informazioni relative quali login e password, contiene la tabella con l'elenco di tutti i files del database la tabella con l'elenco di tutti gli oggetti del database la tabella con tutti i privilegi assegnati agli utenti
  • 79. Tablespace Generalmente un database Oracle è costituito anche da altri tablespaces che permettono di suddividere fisicamente gli oggetti in esso memorizzati,ad esempio: un tablespace che contiene gli oggetti degli utenti (USERS) un tablespace che contiene gli indici (INDX) un tablespace che contiene gli oggetti temporanei (TEMP) un tablespace che contiene RollBack Segments (UNDO)
  • 80. Tablespace A livello funzionale, la presenza di più tablespace è importante: Permette di suddividere il DB in più unità, ognuna della quale contiene solo elementi tra loro correlati. Poiché ogni tablespace fisicamente è costituita da almeno un DF, c’è la possibilità di appoggiarsi fisicamente a files diversi, che si possono memorizzare su dischi differenti al fine di migliorare le prestazioni complessive del database. Per ogni utente si può stabilire su quale tablespace potrà creare oggetti, e quanto spazio massimo utilizzare, permettendo un controllo globale preciso delle quote. Tali impostazioni sono trasparenti per gli utenti.
  • 81. Vantaggi Vantaggi di avere più tablespace : Separazione del DD dagli altri dati, e quindi riduzione delle contese di accesso a disco (se i DF che costituiscono i vari tablespaces sono su dischi diversi). Gestione delle quote per singolo utente. Gestione più efficiente degli oggetti temporanei (ad esempio per le operazioni di Sort) che vengono trattati solo su uno specifico tablespace, in genere TEMP. Gestione più efficiente dei Segmenti di Roll Back (tablespace UNDO), che sono i dati necessari a permettere l'utilizzo del comando &quot;RollBack&quot; Gestione più efficiente delle applicazioni che usano lo stesso database: se infatti raggruppo le applicazioni usando un tablespace diverso per ognuna, in caso di manutenzione, una parte delle applicazioni potrebbero non funzionare (quelle che si appoggiano ai tablespaces in manutenzione o recovery) mentre le altre non risentono del disservizio. Si possono gestire le operazioni di Back Up e Recovery per singolo tablespace.
  • 82. Tablespace e DF Al momento della creazione di un tablespace viene fisicamente allocato sul filesytem un DF, avente la dimensione specificata. Il DF sarà inizialmente vuoto, ma verrà strutturato in modo da ospitare i futuri oggetti che verranno creati in esso. Oracle ha due modalità per gestire lo spazio interno: Memorizzando le informazioni nel DD. All'interno del tablespace.
  • 83. Tablespace In funzione della modalità scelta si suddividono i tablespaces in: DICTIONARY-MANAGED: Le informazioni necessarie per la gestione dello spazio sono memorizzate nel DD. Implica che ad ogni modifica dello stato di un blocco viene eseguito un update su una specifica tabella del DD. Ad ogni modifica dello stato di un blocco avviene la creazione di una informazione di UNDO, necessaria per un eventuale Rollback. LOCALLY-MANAGED: Le informazioni necessarie per la gestione dello spazio sono memorizzate nel tablespace, in genere nell'header di ogni singolo DF. Se un blocco cambia il suo stato, la modifica non genera informazioni di UNDO, in quanto non viene eseguito nessun update su tabelle del DD. Questo tipo di tablespace permette di avere prestazioni superiori.
  • 84. Temp Tablespace Serve per permettere ad Oracle di memorizzare dati od oggetti temporaneamente, facendo una sorta di SWAP ogni qual volta la Ram a disposizione non è sufficiente. L'utilizzo più frequente avviene durante le operazioni di ordinamento (SORT). All'interno del tablespace viene creato un Segment particolare, chiamato SORT SEGMENT: Condiviso da tutti gli utenti del DB Costituito da un certo numero di extents (ogni transazione userà un extent in maniera esclusiva). Allocato nel momento della prima operazione di sort. Non è possibile creare esplicitamente oggetti al suo interno.
  • 85. Undo Tablespace Questo tipo di tablespace viene utilizzato internamente per consentire l'operazione di ROLLBACK. Oracle memorizza temporaneamente nel tablespace i dati che vengono modificati, permettendo di annullare le transazioni terminate erroneamente od esplicitamente dagli utenti.
  • 86. Alter Tablespace Dopo aver creato un tablespace, si possono modificarne alcune caratteristiche utilizzando il comando ALTER TABLESPACE, tra cui: aggiungere nuovi DF o TF (Temporary files). rinominare i files. modificare i parametri di storage dei tablespace dictionary-managed. modificare l'allocazione degli extents. modificare disponibilità del tablespace (ONLINE - OFFLINE). passare da READ-ONLY a READ-WRITE e viceversa. passare da PERMANENT a TEMPORARY e viceversa.
  • 88. SQL Structured Query Language Operazioni fondamentali: SELECT INSERT UPDATE DELETE
  • 89. Sintassi Query case insensitive: SeLeCt argoMENTO, sezione, PAGINA FROM gioRNAle; select Argomento, Sezione, Pagina from GIORNALE; Case sensitive solo nelle verifiche: Sezione = ‘f’ Sezione = ‘F’ Le due clausole precedenti sono differenti.
  • 90. Tabelle Creazione di una tabella di esempio: create table GIORNALE ( Argomento VARCHAR2(15) not null, Sezione CHAR(1), Pagina NUMBER ); “ Not null” impedisce l’inserimento della riga se il campo è vuoto
  • 91. Tabella GIORNALE Argomento Sezione Pagina ---------------------------------------------------------- Notizie A 1 Sport D 1 Editoriali A 12 Economia E 1 Meteo C 2 Televisione B 7 Nascite F 7 Annunci F 8 Salute F 6 Vita moderna B 1 Fumetti C 4 Film B 4 Bridge B 2 Necrologi F 6
  • 92. Query select Argomento, Sezione, Pagina from GIORNALE; ARGOMENTO S PAGINA ------------------- - ----------- Notizie A 1 Sport D 1 Editoriali A 12 Economia E 1 Meteo C 2 Televisione B 7 Nascite F 7 Annunci F 8 […]
  • 93. Risultati I nomi di colonna sono visualizzati in maiuscolo La query è effettivamente case-insensitive L’ampiezza delle colonne è prefissata da Oracle (“Sezione” viene abbreviata) Per avere informazioni usiamo il comando DESCRIBE
  • 94. DESCRIBE describe GIORNALE Name Null? Type ------------------------------- -------- ------- ARGOMENTO NOT NULL VARCHAR2(15) SEZIONE CHAR(1) PAGINA NUMBER
  • 95. SELECT Comando per selezionare informazioni dalle tabelle 4 parole chiave principali: SELECT FROM WHERE ORDER BY
  • 96. ORDER BY Esempio: select Argomento, Sezione, Pagina from GIORNALE where Sezione = ‘F’ order by Argomento; ARGOMENTO S PAGINA --------------- - ------ Annunci F 8 Nascite F 7 Necrologi F 6 Salute F 6
  • 97. ORDER BY Esempio su più campi: select Argomento, Sezione, Pagina from GIORNALE where Sezione = ‘F’ order by Pagina, Argomento; ARGOMENTO S PAGINA --------------- - ------ Necrologi F 6 Salute F 6 Nascite F 7 Annunci F 8
  • 98. DESC Ordinamento decrescente: select Argomento, Sezione, Pagina from GIORNALE where Sezione = ‘F’ order by Pagina desc ; ARGOMENTO S PAGINA --------------- - ------ Annunci F 8 Nascite F 7 Necrologi F 6 Salute F 6
  • 99. WHERE Parola chiave per verificare un singolo valore. Uso degli operatori logici: Uguaglianza “ = “ Maggiore “ > ” Maggiore o uguale “ >= “ Minore “ < “ Minore o uguale “ <= “ Diverso “ != “ “ <> ”
  • 100. LIKE Operatore logico per verificare similitudini. % : carattere jolly _ : marcatore di posizione Sintassi di esempio: Argomento LIKE ‘CIA % ’ “ Argomento” inizia con le lettere CIA Argomento LIKE ‘ % IAO’ “ Argomento” finisce con le lettere IAO Argomento LIKE ‘ __ A % ’ “ Argomento” ha una “A” in terza posizione Argomento LIKE ‘ % 0 % 0 % ’ “ Argomento” contiene due “0”
  • 101. NULL Operatore logico per verificare se una riga è vuota (priva di dati). Sintassi di esempio: Argomento IS NULL Argomento IS NOT NULL
  • 102. Query select Argomento, Sezione, Pagina from GIORNALE where Pagina > 4; ARGOMENTO S PAGINA --------------- - ------ Editoriali A 12 Televisione B 7 Nascite F 7 Annunci F 8 Necrologi F 6 Salute F 6
  • 103. Query select Argomento, Sezione, Pagina from GIORNALE where Argomento LIKE ‘N % ’; ARGOMENTO S PAGINA --------------- - ------ N ascite F 7 N ecrologi F 6 select Argomento, Sezione, Pagina from GIORNALE where Argomento LIKE ‘__i % ’; ARGOMENTO S PAGINA --------------- - ------ Ed i toriali A 12 Br i dge B 2
  • 104. Verifica di valori Operatori logici per verificare più valori: Pagina IN (1,2,3) Pagina è nell’elenco (1,2,3). Pagina NOT IN (1,2,3) Pagina non è nell’elenco (1,2,3). Sezione BETWEEN ‘B’ AND ‘D’ Sezione è uguale a un carattere compreso tra ‘B’ e ‘D’. Pagina NOT BETWEEN 6 AND 10 Pagina è strettamente minore di 6 o maggiore di 10.
  • 105. Logica della combinazione Gli operatori logici AND e OR si usano per combinare le espressioni logiche: AND : visualizza le righe che soddisfano entrambe le condizioni logiche OR : visualizza le righe che soddisfano almeno una delle due condizioni logiche.
  • 106. Query select Argomento, Sezione, Pagina from GIORNALE where Sezione = ‘F’ OR Pagina > 7; ARGOMENTO S PAGINA --------------- - ------- Editoriali A 12 Nascite F 7 Annunci F 8 Necrologi F 6 Salute F 6
  • 107. Precedenza operazioni Stabilire le priorità di combinazione usando le parentesi: select Argomento, Sezione, Pagina from GIORNALE where Pagina > 2 and ( Sezione = ‘A’ or Sezione = ‘B’ ) ; AND ha precedenza su OR, in assenza di parentesi.
  • 108. Subquery Può essere utile inserire delle query in altre query. La subquery va racchiusa tra parentesi Se la subquery ha come risultato valori multipli (più righe), si possono usare solo operatori per valori multipli
  • 109. Subquery select ARGOMENTO from GIORNALE where Sezione = ‘F’; select Sezione from GIORNALE where Argomento = ‘Salute’; ARGOMENTO --------------- Nascite Annunci Necrologi Salute S - F
  • 110. Subquery select ARGOMENTO from GIORNALE where Sezione = (select Sezione from GIORNALE where Argomento = ‘Salute’ ) ; ARGOMENTO --------------- Nascite Annunci Necrologi Salute
  • 111. Combinazione di tabelle E’ possibile combinare più tabelle se hanno un dato in comune. Esempio: tabella CLIMA: condizioni meteo attuali per città select Citta, Condizione, Temperatura from CLIMA; tabella DISLOCAZIONE: coordinate geografiche per città select Citta, Longitudine, EstOvest, Latitudine, NordSud from LOCAZIONE;
  • 112. Tabelle di esempio CITTA LONGITUDINE E LATITUDINE N ------------------------- ----------- - ---------- - ATENE 23.43 E 37.58 N CHICAGO 87.38 O 41.53 N CONAKRY 13.43 O 9.31 N LIMA 77.03 O 12.03 S MADRAS 80.17 E 13.05 N MANCHESTER 2.15 O 53.3 N MOSCA 37.35 E 55.45 N PARIGI 2.2 E 48.52 N SHENYANG 123.3 E 41.48 N ROMA 12.29 E 41.54 N TOKYO 139.5 E 35.42 N SYDNEY 151.1 E 33.52 S SPARTA 22.27 E 37.05 N MADRID 3.14 O 40.24 N CITTA CONDIZIONE TEMPERATURA ----------- ----------- ----------- LIMA PIOGGIA 7 PARIGI NUVOLOSO 27 MANCHESTER NEBBIA 19 ATENE SOLE 36 CHICAGO PIOGGIA 19 SYDNEY NEVE -2 SPARTA NUVOLOSO 23
  • 113. Unione dei risultati Le tabelle dell’esempio possono essere unite Bisogna indicare nella query il dato in comune Esempio: select CLIMA.Citta , Condizione, Temperatura, Latitudine, NordSud, Longitudine, EastOvest from CLIMA, LOCAZIONE where CLIMA.Citta = LOCAZIONE.Citta ;
  • 114. Risultati CITTA CONDIZIONE TEMPERATURA LATITUDINE N LONGITUDINE E ----------- ----------- ----------- ---------- - ----------- - ATENE SOLE 36 37.58 N 23.43 E CHICAGO PIOGGIA 19 41.53 N 87.38 O LIMA PIOGGIA 7 12.03 S 77.03 O MANCHESTER NEBBIA 19 53.3 N 2.15 O PARIGI NUVOLOSO 27 48.52 N 2.2 E SPARTA NUVOLOSO 23 37.05 N 22.27 E SYDNEY NEVE -2 33.52 S 151.1 E
  • 115. Viste Il risultato della combinazione di più tabelle può ricevere un nome ed essere utilizzato come una tabella (vista). Esempio: create view INVASIONE AS select CLIMA.Citta, Condizione, Temperatura, Latitudine, NordSud, Longitudine, EstOvest from CLIMA, DISLOCAZIONE where CLIMA.Citta = DISLOCAZIONE.Citta;
  • 116. Tipi di dati Servono per tipizzare i dati Oracle usa diversi tipi di dati: NUMBER CHAR DATE VARCHAR2 LONG RAW LONG RAW BLOB CLOB BFILE
  • 117. Stringhe CHAR: Lunghezza prefissata Vengono inseriti spazi vuoti per raggiungere la dimensione VARCHAR2: Lunghezza variabile
  • 118. Funzioni per stringhe Sintassi: FUNZIONE(stringa [,opzione] ) Funzioni principali: Concat, || Lenght Lower, Upper LPad, RPad Trim, LTrim, RTrim Substr, Instr
  • 119. Esempio: LOWER select Citta, LOWER(Citta), LOWER('Citta') from CLIMA; CITTA LOWER(CITTA) LOWER('CITTA') ----------- ----------- ------------- LIMA lima citta PARIGI parigi citta MANCHESTER manchester citta ATENE atene citta CHICAGO chicago citta SYDNEY sydney citta SPARTA sparta citta
  • 120. Esempio: concatenazione select Citta||Paese from DISLOCAZIONE; CITTA || PAESE -------------------------------------------------- ATENEGRECIA CHICAGOSTATI UNITI CONAKRYGUINEA LIMAPERU MADRASINDIA MANCHESTERINGHILTERRA MOSCARUSSIA PARIGIFRANCIA SHENYANGCINA ROMAITALIA TOKYOGIAPPONE SYDNEYAUSTRALIA SPARTAGRECIA MADRIDSPAGNA
  • 121. Esempio: RPAD RPAD RPAD(stringa,lunghezza [,'car']) Riempie con il carattere ‘ car ’ fino a che la stringa ha lunghezza ‘ lunghezza ’, partendo da destra select RPAD(Citta,35,'.'), Temperatura from CLIMA; RPAD(CITTA,35,'.') TEMPERATURA ----------------------------------- ----------- LIMA................................ 7 PARIGI............................. 27 MANCHESTER................ 19
  • 122. Esempio: LTrim LTrim LTrim(stringa [.'car']) Elimina le occorrenze del carattere ‘ car ’ select RTRIM(Titolo,'.“') From RIVISTA TITOLO: THE BARBERS WHO SHAVE THEMSELVES .&quot; HUNTING THOREAU IN NEW HAMPSHIRE“ RTRIM(TITOLO,'.“'): THE BARBERS WHO SHAVE THEMSELVES &quot; HUNTING THOREAU IN NEW HAMPSHIRE
  • 123. Lenght e Substr Lenght: restituisce lunghezza di una stringa Non funziona sui dati di tipo LONG Substr: restituisce una sottostringa SUBSTR(stringa,inizio [,conta] )
  • 124. Funzioni numeriche Funzioni a valore singolo Operazioni fondamentali + - * / Cos, Sin, Exp, Abs, Trunc (val, precis), Round Trunc (val, precis) Funzioni di gruppo Max, Min (su gruppi di righe) Avg, Count
  • 125. Gestione delle date Formato DATE Gg mm aa hh mm ss Le colonne di tipo DATE sono gestite con l’aritmetica delle date da SQL SYSDATE restituisce la data del sistema su cui è installato Oracle select SysDate from DUAL; CURRENT_DATE restituisce l’ora di sessione, con fuso orario select Current_Date from DUAL; 15-MAR-02 SYSTIMESTAMP restituisce la data di sistema in timestamp select SysTimeStamp from DUAL; 15-MAR-02 02.41.31.000000 PM -05:00
  • 126. Funzioni per le date ADDMONTHS: Aggiungere mesi select ADD_MONTHS(Celebrata,6) GiornoFesta from FESTA LEAST: Data che viene per prima in un elenco select Festa, LEAST(Dataeff,Celebrata) Primo, Dataeff,Celebrata GREATEST: Data più recente in un elenco FESTA PRIMO DATAEFF CELEBRATA ------------------------- --------- --------- --------- MARTIN LUTHER KING, JR. 15-JAN-02 15-JAN-02 17-JAN-02 LINCOLNS BIRTHDAY 12-FEB-02 12-FEB-02 18-FEB-02 WASHINGTONS BIRTHDAY 18-FEB-02 22-FEB-02 18-FEB-02 MEMORIAL DAY 27-MAY-02 30-MAY-02 27-MAY-02 COLUMBUS DAY 12-OCT-02 12-OCT-02 14-OCT-02
  • 127. Conversione in data Le funzioni che operano sulle date sono delicate perché hanno bisogno di operare su valori in formato DATE select LEAST('20-JAN-02','20-DEC-02') from DUAL; Restituisce risultato errato, perché considera le stringhe come letterali select LEAST( TO_DATE ('20-JAN-02'), TO_DATE ('20-DEC-02') ) from DUAL; Restituisce il risultato corretto, utilizzando la funzione di conversione TO_DATE
  • 128. Conversione da data Per convertire una data in una stringa si usa TO_CHAR TO_CHAR(data[,'formato'[,'NLSparametri']]) Formato predefinito delle date: DD-MON-YY Usando vari parametri si possono ottenere le formattazioni desiderate: select DataNascita, TO_CHAR(DataNascita,'Month, ddth, YyyY') Formattato from COMPLEANNO; DATANASCITA FORMATTATO ----------- ------------------------------ 12-MAY-46 May , 12th, 1946 23-AUG-37 August , 23rd, 1937 02-FEB-47 February , 02nd, 1947 20-MAY-49 May , 20th, 1949 11-NOV-42 November , 11th, 1942
  • 129. Funzioni di conversione Oracle mette a disposizione molte funzioni di conversione tra diversi tipi di dato TO_CHAR: converte DATE o NUMBER TO_DATE: converte NUMBER, CHAR, VARCHAR2 TO_NUMBER: converte CHAR, VARCHAR2 Esistono delle conversioni automatiche a livello di codice Intervengono soprattutto nei parametri passati alle funzioni
  • 130. Raggruppamento di righe HAVING e GROUP BY Sono clausole che funzionano su gruppi di righe e non su singole righe Sono parallele a WHERE e ORDER BY
  • 131. Esempio Group By select NomeCategoria, COUNT(*) from BIBLIOTECA group by NomeCategoria; NOMECATEGORIA COUNT(*) -------------------- ---------- NARRAADULTI 6 SAGGIAADULTI 10 CONSADULTI 6 NARRRAGAZZI 5 SAGGIRAGAZZI 1 ILLUSRAGAZZI 3
  • 132. Esempio Having select NomeCategoria, COUNT(*) from BIBLIOTECA group by NomeCategoria having COUNT(*) 5; NOMECATEGORIA COUNT(*) -------------------- ---------- NARRADULTI 6 SAGGIADULTI 10 CONSADULTI 6
  • 133. Funzioni combinate su gruppi select NomeCategoria, COUNT(*), AVG(Valutazione) from BIBLIOTECA where Valutazione > 1 group by Nomecategoria having Nomecategoria like ‘A%’ order by COUNT(*) desc; NOMECATEGORIA COUNT(*) AVG(VALUTAZIONE) -------------------- ---------- ---------------- SAGGIADULTI 10 4.2 NARRADULTI 6 3.66666667 CONSADULTI 6 3.16666667
  • 134. Outer Join Serve per restituire dei risultati anche se non ci sono corrispondenze in una delle 2 tabelle coinvolte da un join L’outer join può essere left, right, o full
  • 135. Esempio: join Join: elenco libri ed elenco prestiti in una biblioteca select distinct B.Titolo from BIBLIOTECA_PRESTITO BC, BIBLIOTECA B where BC.Titolo = B.Titolo; TITOLO ---------------------------------------- ANNE OF GREEN GABLES EITHER/OR GOOD DOG, CARL HARRY POTTER AND THE GOBLET OF FIRE INNUMERACY JOHN ADAMS MIDNIGHT MAGIC
  • 136. Esempio: outer join Si vogliono ora visualizzare tutti i titoli, anche quelli non presi in prestito. Si utilizza il segno ‘+’ sul lato del join che deve restituire le righe senza corrispondenze. select B.Titolo, MAX(BC.DataRestituzione - BC.DataPrestito) “MAX GIORNI PRESTITO!“ from BIBLIOTECA_PRESTITO BC, BIBLIOTECA B where BC.Titolo (+) = B.Titolo group by B.Titolo;
  • 137. Esempio: risultato TITOLO Max Giorni Prestito ---------------------------------------- ------------------- ANNE OF GREEN GABLES 18 BOX SOCIALS CHARLOTTE'S WEB EITHER/OR 8 EMMA WHO SAVED MY LIFE GOOD DOG, CARL 14
  • 138. Outer Join Da Oracle 9i si può usare la sintassi ANSI SQL: Left outer join… on Right outer join… on Full outer join … on select B.Titolo, MAX(BC.DataRestituzione - BC.DataPrestito) &quot;Max Giorni Prestito“ from BIBLIOTECA_PRESTITO BC left outer join BIBLIOTECA B on BC.Titolo = B.Titolo group by B.Titolo;
  • 139. Gestione dei dati Funzioni principali INSERT Inserisce dati direttamente in una tabella Inserisce dati indirettamente tramite una vista UPDATE Modifica i dati presenti in una o più righe della tabella DELETE Cancella una o più righe
  • 140. Tabella di esempio Tabella COMFORT: registra dati meteo di alcune città describe COMFORT Nome Null? Type ------------------------------- -------- ---- CITTA NOT NULL VARCHAR2(13) DATACAMPIONE NOT NULL DATE MEZZOGIORNO NUMBER(3,1) MEZZANOTTE NUMBER(3,1) PRECIPITAZIONE NUMBER
  • 141. Insert Inserisce una nuova riga Sintassi: insert into COMFORT values (‘WALPOLE', '21-MAR-01'). 13.8, 6.6, 0); Il punto a fine riga della query precedente serve per andare a capo concatenando, è analogo a: values (‘WALPOLE', '21-MAR-01‘,13.8, 6.6, 0);
  • 142. Insert e date Per inserire le date è necessario utilizzare la funzione di conversione TO_DATE e specificare il formato: insert into COMFORT values (‘WALPOLE', TO_DATE ('06/22/2001 1:35',‘MM/DD/YYYY HH24:MI') , 13.8, 6.6, 0);
  • 143. Delete Elimina righe Bisogna indicare quali con la clausola WHERE, altrimenti la tabella viene interamente svuotata: delete from COMFORT where Citta = ‘WALPOLE';
  • 144. Update Aggiorna i dati di una colonna del database, per una o più righe a seconda della clausola WHERE. update COMFORT set Precipitazione = .5, Mezzanotte = 73.1 where Citta = ‘KEENE‘ and DataCampione = '22-DEC-2001';
  • 145. Gestione delle tabelle Si usa il comando CREATE TABLE Bisogna definire le colonne create table STRANO ( Citta VARCHAR2(13) NOT NULL, DataCampione DATE NOT NULL, Mezzogiorno NUMBER(3,1), Mezzanotte NUMBER(3,1), Precipitazione NUMBER );
  • 146. Create table Requisiti: I nomi delle tabelle e delle colonne devono iniziare con una lettera Nomi lunghi da 1 a 30 caratteri Se i nomi non sono inseriti tra virgolette, non si distingue tra maiuscole e minuscole I tipi di dati CHAR e VARCHAR devono specificare la lunghezza
  • 147. Chiavi Candidata E’ una combinazione di una o più colonne, i cui valori identificano univocamente ogni riga di una tabella. Primaria E’ una chiave candidata speciale , può esisterne solo una e una colonna di tale chiave non può essere NULL. Creano degli indici per mantenere l’integrità del database.
  • 148. Esempio: chiave candidata Chiave candidata STRANO_UQ: create table STRANO ( Citta VARCHAR2(13) NOT NULL, DataCampione DATE NOT NULL, Mezzogiorno NUMBER(4,1), Mezzanotte NUMBER(4,1), Precipitazione NUMBER, constraint STRANO_UQ UNIQUE (Citta, DataCampione) );
  • 149. Esempio: chiave primaria Chiave primaria STRANO_PK: create table STRANO ( Citta VARCHAR2(13), DataCampione DATE, Mezzogiorno NUMBER(4,1), Mezzanotte NUMBER(4,1), Precipitazione NUMBER, constraint STRANO_PK PRIMARY KEY (Citta, DataCampione) );
  • 150. Esempio: chiave primaria Si può inserire un vincolo di chiave primaria anche successivamente: alter table STRANO add constraint STRANO_PK PRIMARY KEY ( Citta );
  • 151. Chiave esterna E’ una combinazione di colonne con valori basati su quelli di una chiave primaria esterna. I valori della chiave esterna corrispondono ai valori effettivi della chiave primaria nell’altra tabella.
  • 152. Esempio: chiave esterna Nella tabella BIBLIOTECA, la colonna NomeCategoria fa riferimento ai valori della colonna NomeCategoria nella tabella CATEGORIA: create table BIBLIOTECA ( Titolo VARCHAR2(100) primary key , Editore VARCHAR2(20), NomeCategoria VARCHAR2(20), Valutazione VARCHAR2(2), constraint CATFK foreign key (NomeCategoria) references CATEGORIA(NomeCategoria) );
  • 153. Eliminazione di tabelle DROP: rimozione di una tabella drop table STRANO; TRUNCATE: svuota una tabella, eliminando tutte le righe truncate table STRANO;
  • 154. Modifica di tabelle Comando ALTER: Aggiunta di colonne Modifica di colonne Rimozione di colonne Regole: Si può aggiungere o modificare una colonna in qualsiasi momento, purché non sia NOT NULL Si può aggiungere una colonna NOT NULL eseguendo 3 passaggi Aggiunta nuova colonna (senza specificare NOT NULL) Riempimento della nuova colonna con valori predefiniti Modifica della colonna in NOT NULL
  • 155. Esempio: aggiunta colonne Aggiunta di 2 colonne alla tabella STRANO: alter table STRANO add ( Condizione VARCHAR2(9), Vento NUMBER(3) );
  • 156. Esempio: modifica colonne Modifica di una colonna: alter table STRANO modify ( Condizione VARCHAR2(9) NOT NULL, Citta VARCHAR2(17) );
  • 157. Esempio: eliminazione Eliminazione di una colonna: alter table STRANO drop column Vento;
  • 159. Sicurezza e accesso Utenti Ogni utente ha nome, password, e possiede tabelle, viste e risorse da lui create Ruoli Sono serie di privilegi I privilegi si associano ai ruoli, e i ruoli si associano agli utenti Privilegi Sono regole che consentono di eseguire determinate operazioni sul database
  • 160. Utenti Creazione di un utente Esistono utenti predefiniti SYS: possiede le tabelle principali del database SYSTEM: possiede altre tabelle e viste L’utente SYSTEM può creare altri utenti create user utente identified {by password | externally};
  • 161. Esempio: nuovo utente Creo un nuovo utente Dora con password avocado: create user Dora identified by avocado ; Modifico la password: alter user Dora identified by psyche ; Assegnazione privilegi: grant CREATE SESSION to Dora;
  • 162. Ruoli Sono raccolte di privilegi di sistema che consentono agli utenti di effettuare operazioni: CONNECT: consente accesso a funzioni base RESOURCE: per utenti più avanzati, possono creare procedure, trigger, tipi di dati DBA: per l’amministratore di sistema, accesso e privilegi completi
  • 163. Privilegi GRANT: assegna privilegi grant {privilegio sistema | ruolo | all [privileges] } [. {privilegio sistema | ruolo | all [privileges]} to {utente | ruolo} [. {utente | ruolo}] [identified by password ] [with admin option] Esempio: grant CONNECT to Judy;
  • 164. Revoca REVOKE: revoca i privilegi di un utente revoke {privilegio sistema | ruolo | all [privileges]} [, {privilegio sistema | ruolo | all [privileges]}, from {utente | ruolo} [, {utente | ruolo}].
  • 165. Privilegi per tabelle Tabelle e viste: INSERT UPDATE SELECT DELETE ALTER INDEX … ALL (tutti i precedenti)
  • 166. Altri privilegi Procedure, funzioni, package: EXECUTE Sequenze ALTER, SELECT Directory READ WRITE …
  • 167. Esempio: privilegi L’utente corrente concede l’accesso alla tabella COMFORT all’utente Bob: grant select on COMFORT to Bob;
  • 168. Ruoli personalizzati Creo un ruolo IMPIEGATO: create role IMPIEGATO; Do il privilegio di effettuare delle Select: grant select on COMFORT to IMPIEGATO; Do il privilegio di collegarsi al database: grant CREATE SESSION to IMPIEGATO; Assegno i privilegi di un ruolo a un altro: grant IMPIEGATO to MANAGER;
  • 169. Indici Elenco di parole chiave contenente la posizione delle informazioni relative a un argomento. Esempio: indice analitico dei libri Non sono necessari, ma velocizzano le prestazioni Si creano con il comando CREATE INDEX: create [bitmap | unique] index indice on tabella(colonna [,colonna]. . .) [reverse];
  • 170. Indici e chiavi E’ una tecnica per garantire l’unicità delle chiavi. Esempio: create unique index BA$TITOLO_AUTORE on BIBLIOTECA_AUTORE(Titolo, NomeAutore); Sono molto utili in tabelle grandi, in cui una (o più) colonne sono utilizzate spesso in clausole where con uguaglianza. Lo svantaggio è un inserimento più lento delle righe nel database.
  • 171. Trigger E’ un’azione che il database deve intraprendere quando si verifica un evento legato al database stesso. Tecnica utilizzata in particolare per revisioni sui dati. In genere sono legati alle operazioni fondamentali Insert, Delete e Update (DML) Per utilizzare i trigger bisogna: Possedere la tabella Avere i privilegi di Alter sulla tabella
  • 172. Tipi di trigger I tipi di trigger sono definiti da: Tipo di transazione che li attiva Livello cui è eseguito il trigger Livello di riga Livello di istruzione Livello di database
  • 173. Livello di riga Trigger a livello di riga: Vengono eseguiti una sola volta per ogni riga su cui agisce un’istruzione. Parola chiave: for each row Utili per la sincronizzazione dei dati
  • 174. Livello di istruzione Trigger a livello di istruzione: Sono eseguiti una solta volta per ogni istruzione. Se aggiungo 500 righe con una sola istruzione INSERT, il trigger viene eseguito 1 sola volta Non vengono usati in genere sui dati, ma sul controllo delle istruzioni eseguite.
  • 175. Livello di database Trigger a livello di database: Si attivano su eventi legati al database, come connessioni, collegamenti, chiusure, avvii, ecc… Serve per automatizzare le operazioni di gestione del database
  • 176. Altri trigger BEFORE / AFTER: Vengono eseguiti prima o dopo determinati eventi All’interno del trigger si può fare riferimento a valori vecchi e nuovi nel database. INSTEAD OF: Rimpiazza determinate azioni. In genere si usano sulle viste, per far operare invece sulle tabelle che compongono la vista. Trigger di schema: Operano su istruzioni che lavorano sugli schemi (create, alter, truncate, ecc…)
  • 177. Sintassi Sintassi: create [or replace] trigger [schema .] trigger { before | after | instead of } { clausola_evento_dml | { evento_ddl [or evento_ddl ]... | evento_database [or evento_database ]... } on { [schema .] schema | database } } [when ( condizione ) ] { blocco_pl/sql| istruzione_procedura_chiamata }
  • 178. Esempio: Trigger Si vogliono registrare in una tabella AUDIT_BIBLIOTECA tutte le modifiche che vengono effettuate sulla colonna Classificazione di BIBLIOTECA. La tabella AUDIT_BIBLIOTECA riceve una INSERT con i valori del dato che si sta cambiando (UPDATE) su BIBLIOTECA. La clausola WHERE viene usata in modo particolare per indicare che utilizzeremo dati vecchi e nuovi . SQL nella slide seguente…
  • 179. Esempio: Trigger before create or replace trigger BIBLIOTECA_BEF_UPD_ROW before update on BIBLIOTECA for each row when (nuova.Classificazione != vecchia.Classificazione) begin insert into AUDIT_BIBLIOTECA (Titolo, Editore, NomeCategoria, Vecchia_Classificazione, Nuova_Classificazione, Data_Audit) values (:old.Titolo, :old.Editore, :old.NomeCategoria, :old.Classificazione, :new.Classificazione, Sysdate); end ;
  • 180. Procedure Procedure: Stored procedure : gruppi di istruzioni SQL memorizzate nel sistema Si possono riutilizzare più volte Funzioni: Procedure che possono restituire valori agli utenti Packages: Raggruppamenti di procedure e comandi SQL Sono compilati in automatico, ma possono essere ricompilati
  • 181. Procedure Una volta memorizzata, può essere eseguita Bisogna dare i permessi di esecuzione agli utenti: grant execute on MIA_PROCEDURA to Dora; In assenza dell’assegnazione diretta del privilegio precedente, gli utenti dovranno avere il privilegio generico EXECUTE ANY PROCEDURE per eseguire la procedura. Sintassi: execute NUOVO_LIBRO(‘ TITOLO '); Il comando execute non serve se si è: All’interno di un’altra procedura o funzione In un trigger In un package
  • 182. Sintassi Sintassi: create [or replace] procedure [schema .] procedura [( argomento [ in | out | in out ] [nocopy] tipodati [, argomento [ in | out | in out ] [nocopy] tipodati]... )] [authid { current_user | definer }] { is | as } { corpo_sottoprogramma_sql | language { java name 'stringa'| c [name nome] library nome_lib [agent in ( argomento )] [with context] [parameters ( parametri )] }};
  • 183. Esempio Procedura per inserire un nuovo libro in BIBLIOTECA e cancellare il titolo da una lista ordini LIBRO_ORDINE: create or replace procedure NUOVO_LIBRO (aTitolo IN VARCHAR2, aEditore IN VARCHAR2, aNomeCategoria IN VARCHAR2) as begin insert into BIBLIOTECA (Titolo, Editore, NomeCategoria, Classificazione) values (aTitolo, aEditore, aNomeCategoria, NULL); delete from LIBRO_ORDINE where Titolo = aTitolo; end ;
  • 184. Esecuzione Esempio di esecuzione della procedura di prima: execute NUOVO_LIBRO(‘ TITOLO','SANCTUARY PUB','SAGGIADULTI' );
  • 185. Funzione E’ una procedura che restituisce un valore. Sintassi: create [or replace] function [schema .] funzione [( argomento [ in | out | in out ] [nocopy] tipodati [, argomento [ in | out | in out ] [nocopy] tipodati]... )] return tipodati [{ clausola_privilegi_utentechiamante | deterministic | clausola_abilitazione_parallela } [clausola_privilegi_utentechiamante | deterministic | clausola_abilitazione_parallela]... ] { { aggregate | pipelined } using [schema .] tipo_implementazione | [pipelined] { is | as } { corpo_funzione_pl/sql | spec_chiamata }};
  • 186. Esempio Si crea una funzione che restituisce la spesa dovuta ai ritardi nella riconsegna dei libri: create or replace function SPESE_RITARDO (aNome IN VARCHAR2) return NUMBER is saldo NUMBER(10,2); begin select SUM(((DataRestituzione-DataPrestito) -14)*0.20) into saldo from BIBLIOTECA_PRESTITO where Nome = aNome; RETURN (saldo); end ;
  • 187. Package Specifica e corpo del package sono creati separatamente: Create Package Create Package Body Richiedono il privilegio CREATE ANY PROCEDURE
  • 188. Sintassi Package: create [or replace] package [utente.] package [authid {definer | current_user} ] {is | as} specifica package ; Package body: create [or replace] package body [utente,] corpo package {is | as} corpo package ;
  • 189. Esempio specifica Si crea un package che mette a disposizione dei suoi utenti alcune funzioni e procedure: create or replace package GESTIONE_LIBRO as function SPESE_RITARDO(aNome IN VARCHAR2) return NUMBER; procedure NUOVO_LIBRO (aTitolo IN VARCHAR2, aEditore IN VARCHAR2, aNomeCategoria IN VARCHAR2); end GESTIONE_LIBRO;
  • 190. Esempio Body 1/2 create or replace package body GESTIONE_LIBRO as function SPESE_RITARDO (aNome IN VARCHAR2) return NUMBER is saldo NUMBER(10,2); begin select SUM(((DataRestituzione-DataPrestito) -14)*0.20) into saldo from BIBLIOTECA_PRESTITO where Nome = aNome and (DataRestituzione-DataPrestito) 14; RETURN (saldo); end SPESE_RITARDO; Pagina 1/2
  • 191. Esempio Body 2/2 procedure NUOVO_LIBRO (aTitolo IN VARCHAR2, aEditore IN VARCHAR2, aNomeCategoria IN VARCHAR2) is begin insert into BIBLIOTECA (Titolo, Editore, NomeCategoria, Classificazione) values (aTitolo, aEditore, aNomeCategoria, NULL); delete from LIBRO_ORDINE where Titolo = aTitolo; end NUOVO_LIBRO; end GESTIONE_LIBRO; Pagina 2/2
  • 192. Inizializzazione I package possono includere comandi da eseguire ogniqualvolta il package viene chiamato, a prescindere dalla procedura o funzione chiamata all’interno del package. I package consentono di eseguire comandi che non siano specifici delle procedure raggruppate. Nell’esempio seguente, il corpo del package GESTIONE_LIBRO viene modificato in modo da includere un’istruzione SQL che registra il nome dell’utente corrente e l’indicatore orario per la prima volta in cui un componente del package viene eseguito all’interno della sessione.
  • 193. Esempio: inizializzazione Si aggiunge in fondo al package l’inizializzazione: […] //codice esempio precedente begin select Utente, SysDate into Nome_Utente, Data_Voce from DUAL; end GESTIONE_LIBRO;
  • 195. EMC Enterprise Manager Console SQL*Plus Worksheet Introduzione all’uso attraverso esercizi in aula
  • 196. LICENZA Questa produzione è regolata da Licenza Creative Commons: Tu sei libero: di riprodurre, distribuire, comunicare al pubblico, esporre in pubblico, rappresentare, eseguire e recitare quest'opera di modificare quest'opera Alle seguenti condizioni: Attribuzione . Devi attribuire la paternità dell'opera nei modi indicati dall'autore o da chi ti ha dato l'opera in licenza e in modo tale da non suggerire che essi avallino te o il modo in cui tu usi l'opera.   Non commerciale . Non puoi usare quest'opera per fini commerciali. Condividi allo stesso modo . Se alteri o trasformi quest'opera, o se la usi per crearne un'altra, puoi distribuire l'opera risultante solo con una licenza identica o equivalente a questa.