Funzionalità avanzate dei DBMS

Laboratorio
Architettura
Prof. Alessandra Lumini
Alma Mater Studiorum - Università di Bologna
1
Laboratorio da PC portatile

Installare Vmware Horizon View Client
 Add
server: vdi-connection.polocesena.unibo.it (accessibile solo in rete
universitaria)
 Inserire le credenziali d’ateneo
 Selezionare la macchina virtuale Lab-3
2
Oracle SQL Developer funzionalità

Per progettisti
 integrazione di SQL Developer Data Modeler, per la progettazione e lo
sviluppo di modelli dei dati.
 opzioni di esportazione e importazione dati

Per DBA
 strumenti di scheduling delle operazioni
 strumenti di gestione dei parametri di configurazione del database, dei



profili di sicurezza e auditing e di tutti i file (redo log, control
file, archive log, data file) che compongono il database.
SQL Tuning Advisor, per il tuning degli statement SQL
strumenti a supporto della migrazione
Per sviluppatori
 Query Builder visuale integrato con il corrispondente editor testuale di
comandi SQL.
3
Oracle SQL Developer
Foglio di Lavoro SQL:
- + per creare un foglio di
lavoro associato ad una
determinata connessione
Pannello Connessioni:
- + per creare una
connessione (segue)
Pannello DBA:
- Visualizza->DBA
- Info per amministratori
- + per creare una connessione
Pannello Output DBMS:
- Visualizza->Output DBMS
- + per abilitare Output comandi:
DBMS_OUTPUT.PUT_LINE()
4
Creare una connessione

Nome host: si-oracle-11.polocesena.dir.unibo.it
 SID: SISINF
 Utente: GRUPPO??
Password: GRUPPO
5
Esercizi
Cambiare la password del proprio utente
2. Quanta RAM è associata all’istanza ?
3. Quali ruoli sono associati al proprio utente?
4. Quali privilegi prevede il ruolo CONNECT ?
5. Quanti tablespace sono presenti nel DB ?
6. Qual è il legame utenti tablespace ?
7. Che dimensione massima ha il tablespace INDX ?
8. Quali sono i datafile presenti nel sistema?
1.
6
Esercizi
9.
Creare le seguenti tabelle:
FORNITORI(F_CF,F_Nome,F_Indirizzo,F_Prov,F_Nazione)
CLIENTI(C_CF,C_Nome,C_Indirizzo,C_Prov,C_Nazione)
FATTURE(A_Num,Clienti:A_Cliente,A_Data,A_ModPag,A_Pagato)
DETTAGLIO(Fatture:D_NumF,Prodotti:D_CodP,D_Qta,D_Prezzo)
PRODOTTI(P_Cod,P_Nome,P_Categoria,P_QtaDisp,P_PrezzoList,Fornitori:P
_Fornitore)
ORDINI(Prodotti:O_CodP,O_DataOrd,O_Qta)
10.
Aggiungere la tupla alla tabella FORNITORI
RSSMRC65R15D540P,Rossi Marco,Via dei Filargiti, FC, Italia
11.
Creare un indice sull’attributo C_Nome della tabella
CLIENTI memorizzandolo nel tablespace INDX.
8
Soluzioni
create table Fornitori (
F_CF char(16),
F_NOME varchar2(50),
F_INDIRIZZO varchar2(50),
F_PROVINCIA varchar2(4),
F_NAZIONE varchar2(50),
primary key (F_CF));
10. create table Prodotti (
P_COD varchar2(25),
P_NOME varchar(30), ….
P_FORNITORE char(16),
primary key (P_COD),
foreign key (P_FORNITORE) references Fornitori (F_CF));
9. insert into fornitori Values ('RSSMRC65R15D540P','Rossi
Marco','Via dei Filargiti','FC','Italia');
10. CREATE INDEX MyID ON CLIENTI(C_Nome) tablespace INDX
9.
9
Esercizi
12.
13.
14.
Selezionare il nome di tutte le tabelle presenti nel proprio
schema
Selezionare nome e tipo delle colonne della tabella
Fatture.
Selezionare nome utente, nome client, programma
utilizzato nelle sessioni attive
10
Soluzioni
select * from user_tables;
SELECT object_name FROM USER_OBJECTS WHERE
object_type='TABLE';
13. SELECT COLUMN_NAME,DATA_TYPE FROM
USER_TAB_COLUMNS WHERE
TABLE_NAME='FATTURE’;
14. select USERNAME,MACHINE,PROGRAM from
V$SESSION
Oppure Strumentimonitoraggio sessioni
12.
11
Creare un’altra connessione

Nome host: si-oracle-11.polocesena.dir.unibo.it
 SID: TPCD
 Utente: USERSI
Password: usersi
12
Schema TPC-D
13
Esercizi (TPC-D)
15.
16.
17.
18.
Quali vincoli insistono sulla tabella LINEITEM ?
Che caratteristiche ha il tablespace USERS (max_extent,
max_size, ….) ?
Quali sono i privilegi dell’utente USERSI ?
Eseguire le seguenti interrogazioni sul database:
a)
b)
c)
d)
e)
f)
Totale degli importi trattati dall’impiegato ‘Clerk#000000374’ nei
diversi anni
Totale delle quantità ordinate per una certa parte
Numero dei fornitori di ogni regione
Numero di ordini spediti in ritardo (L_COMMITDATE <
L_SHIPDATE)
Campione dei clienti e dei fornitori (vedi SAMPLE o ROWNUM)
Elenco dei clienti a cui è stata venduta merce fornita da
'supplier#000005680'
14
Soluzioni
SQL Developer > apri tabella > scheda Vincoli
16. SELECT * FROM USER_TABLESPACES WHERE
tablespace_name='USERS'
17. SELECT * FROM user_sys_privs;
18. Query:
15.
a)
b)
c)
d)
e)
f)
select T_YEAR,sum(O_TOTALPRICE)
from ORDERS,TIME
where O_ORDERDATE=T_TIMEKEY and O_CLERK='Clerk#000000374'
group by T_YEAR;
select P_NAME from PART WHERE ROWNUM <10;
select sum(L_QUANTITY) from LINEITEM,PART
where L_PARTKEY=P_PARTKEY and P_NAME='goldenrod lace spring chartreuse ivory';
select R_NAME, count(*) from SUPPLIER,NATION,REGION
where S_NATIONKEY=N_NATIONKEY and N_REGIONKEY=R_REGIONKEY
group by R_NAME;
select count(distinct L_ORDERKEY)as INRITARDO from LINEITEM
where L_COMMITDATE < L_SHIPDATE;
select C_NAME FROM CUSTOMER SAMPLE(5); -- il 5% a campione
select S_NAME FROM SUPPLIER
where ROWNUM< 100; -- i primi 100;
select distinct(C_NAME) from LINEITEM,ORDERS,CUSTOMER,SUPPLIER
where L_ORDERKEY=O_ORDERKEY and O_CUSTKEY=C_CUSTKEY and
15
L_SUPPKEY=S_SUPPKEY and S_NAME='Supplier#000005680';
Select Top K in Oracle







Attenzione: TOP K (MSSql) e Limit (MySQL) non esistono in Oracle 11
select a, b from tabella
where rownum<K
order by b; //non funziona perchè rownum è valutato prima di ordinare
2 Soluzioni:
select a, b from (
select a, b from tabella
order by b)
where rownum<K;
select a, b from (
select a, b, rank() over (order by b) r from tabella)
where r<K;
La funzione RANK restituisce l’ordine in un gruppo di valori (vedi anche
DENSE_RANK)
Esercizi su TPC-D :

Seleziona i 10 ordini con valore più alto
 seleziona i 5 clienti che hanno fatto più ordini
16
Esempio su TCP-D


Seleziona i 10 ordini con valore più alto
select O_ORDERKEY ,O_TOTALPRICE from (
select O_ORDERKEY ,O_TOTALPRICE
FROM ORDERS order by 2 desc )
where rownum<10;

Seleziona i 5 clienti che hanno fatto più ordini
 select a,b,c,r from (
select C_CUSTKEY a, C_NAME b, count(*) c, rank() over (order by count(*)
desc) r
from CUSTOMER, ORDERS
where C_CUSTKEY=O_CUSTKEY
group by C_CUSTKEY, C_NAME
having sum(O_TOTALPRICE) > 700000)
where r<6;
17