M2 - Bases de dades / Practiques UF3 : PL-SQL

De wikiserver
Dreceres ràpides: navegació, cerca

Pràctica PL/SQL Cal lliurar un fitxer (.sql) amb totes les comandes SQL emprades i tot el codi PL/SQL, degudament comentat.


Data màxima lliurament: 20/05/2022

Especificació

Per a la implementació d'una base de dades que suporti anàlisi multidimensional és desitja crear una taula que emmagatzemi les diferents característiques referides a una data; això és: dia, dia de la setmana,mes, any, trimestre... L'esquema relacional d'aquesta taula seria els següent:

TEMPS (data, dia, dia_setmana, mes, trimestre, any)

1.- Crea la taula TEMPS en la base de dades atenent a l'esquema relacional anterior; considerant l'atribut data com a clau principal. La resta dels atributs no admeten valors nuls.

2.- Crea una funció PL/SQL que donat un nombre enter obtingui en format text el corresponent mes. Per exemple:

EXECUTE convertir_mes(1) → Gener

3.- Crea un procediment emmagatzemat PL/SQL que rebi com a paràmetres un rang de dates i afegeixi en la taula TEMPS un registre per cada dia comprès entre aquestes dates. Per exemple:

EXECUTE afegir_temps('01/01/2019', '10/01/2019');

Per realitzar el procediment sol·licitat en el punt 3, has d'emprar la següent funció, que a partir d'una data et retorna el dia següent a aquesta data.

CREATE OR REPLACE FUNCTION dia_seguent (p_data_actual DATE) 
RETURN DATE IS
BEGIN
	RETURN TO_DATE(TO_CHAR(p_data_actual + 1));
END;

Desprès de cridar al procediment «afegir_temps» de l'exemple anterior, la taula TEMPS hauria de contenir la següent informació:

data dia dia_setmana mes trimestre any
01/01/2019 1 Dimarts Gener T1 2019
02/01/2019 2 Dimecres Gener T1 2019
03/01/2019 3 Dijous Gener T1 2019
04/01/2019 4 Divendres Gener T1 2019
05/01/2019 5 Dissabte Gener T1 2019
06/01/2019 6 Diumenge Gener T1 2019
07/01/2019 7 Dilluns Gener T1 2019
08/01/2019 8 Dimarts Gener T1 2019
09/01/2019 9 Dimecres Gener T1 2019
10/01/2019 10 Dijous Gener T1 2019

Ajuda: Pots ajudar-te de la funció TO_CHAR, que passant-li com a paràmetre una data i un atribut de temps com dia, mes, any... retorni el corresponent dia, mes, any de la data rebuda com a primer paràmetre.

4.- Executa el procediment creat per a que generi els registres corresponents als anys 2019 i 2020.

La taula TEMPS creada anteriorment la utilitzarem per datar les vendes realitzades per una empresa especialitzada en la venda d'impressores. Per tant l'esquema relacional de la base de dades quedaria de la següent forma:

TEMPS (data, dia, dia_setmana, mes, trimestre, any)

PRODUCTES (ref, nom_producte, unitats, preu, reposicio)

VENDES (num, data, producte, unitats, import) ON producte REFERENCIA A ref de la taula PRODUCTES

5.- Crea les taules VENDES i PRODUCTES atenent a l'esquema relacional anterior; considerant l'atribut num com a clau principal de la taula VENDES i ref la clau principal de la taula PRODUCTES. La resta dels atributs de la relació no admeten valors nuls.

6.- Crea dos procediments emmagatzemats: «registrar_producte» que rebent una referencia de producte, el nom, les unitats en magatzem del producte , el preu i las unitats de reposició afegeixi els valors corresponents en la taula de productes; i «registrar_venda» que rebent una data, la referencia d'un producte i les unitats venudes, utilitzi una seqüència per obtenir el número de la venda, calculi l'import (segons taula producte) i afegeixi els valors corresponents en la taula de vendes.

Nota: el procediment «registrar_venda» utilitzarà la funció existeix_producte, que a partir d'una referencia de producte retornara «true» si aquest existeix i «false» en cas contrari. Si el producte no existeix no s'haurà d'afegir la venda.

7.- Utilitza els procediments emmagatzemats creats en l'apartat 6 per afegir els següents productes i realitzar les següents vendes:

Productes

ref nom_producte unitats preu reposicio
CA2535 IMPRESORA CANON PIXMA IP2850 10 45,48 6
CA2542 IMPRESORA CANON PIXMA IX6850 A3 8 234,38 4
HP8053 IMPRESORA HP PAGEWIDE PRO 452DW 5 573,00 3
CA2704 IMPRESORA CANON PIXMA MX495 6 64,90 5
HP8143 MULTIFUNCION TINTA HP ENVY 4524 4 95,00 3
CA2950 IMPRESORA CANON PIXMA TS8050 3 169,90 2

Vendes

num data produce unitats import
1 07/01/2019 CA2535 4 181,92
2 14/01/2019 CA2542 2 468,76
3 06/05/2019 CA2704 10 649,00
4 16/05/2019 HP8053 1 573,00
5 25/07/2019 CA2950 4 679,60
6 02/08/2019 HP8143 8 760,00
7 13/09/2019 CA2704 2 129,80
8 09/12/2019 CA2542 3 703,14
9 11/12/2019 CA2950 10 1699,00
10 10/02/2020 HP8143 1 95,00
11 11/05/2020 HP8053 1 573,00
12 12/06/2020 CA2542 10 2343,80
13 14/08/2020 CA2535 12 545,76
14 21/08/2020 HP8053 2 1146,00
15 05/10/2020 CA2704 1 64,90
16 26/10/2020 HP8143 3 285,00
17 23/11/2020 CA2950 5 849,50
18 07/12/2020 CA2535 8 363,84
19 21/12/2020 CA2950 6 1019,40

8.- Crea un procediment «mostrar_estadistiques» que generi la següent informació, considerant que la major venda es refereix a les vendes amb major valor econòmic, no amb major nombre d'unitats venudes:

  • Valor total de les vendes.
  • Valor total de les vendes en 2019.
  • Valor total de les vendes en 2020.
  • Llistat ordenat de les vendes per dia de la setmana.
  • Llistat ordenat de les vendes per mes de l'any.
  • Llistat ordenat de les vendes per trimestre.

UTILITZA UN CURSOR QUE RECOLLÍ TOTES LES DADES DE LA TAULA VENDA I LES MATRIUS ASSOCIATIVES QUE NECESSITIS PER ANAR ACUMULANT EL TOTAL DE VENDES PER DIA DE LA SETMANA, MES I TRIMESTRE.

Ajuda: A continuació es mostra un exemple de la sortida produïda per el procediment creat:

EXECUTE mostrar_estadistiques

Estadístiques

---------------------- Totals ---------------------------

Vendes Totals:   13130,42 €
En 2019:          5844,22 €
En 2020:          7286,20 €

Llistats

------------Valor de les vendes per dies ------------

Dilluns:   5253,46 €
Dimarts:      0,00 €
Dimecres:  1699,00 €
Dijous:	   1252,60 €
Divendres: 4925,36 €
------------Valor de les vendes per mesos-----------

Gener:	   650,68 €		
Febrer:	    95,00 €
Març:	     0,00 €
Abril:	     0,00 €
Maig:	  1795,00 €
Juny:	  2343,80 €
Juliol:	   679,60 €
Agost:	  2451,76 €
Setembre:  129,80 €
Octubre:   349,90 €
Novembre:  849,50 €
Desembre: 3785,38 €
------------Valor de les vendes per trimestres------

T1:	 745,68 €				
T2:	4138,80 €
T3:	3261,16 €
T4.	4984,78 €

Triggers

9.- Crea el trigger «unitats_suficients» que abans d'una venda comprovi si hi ha unitats suficients.

En cas afirmatiu es produïra la venda i s'actualitzarà el nombre d'unitats del magatzem. En cas contrari es generarà una excepció, el tractament de la qual informarà de que no ha estat possible la venda i el motiu.

10.- Crea el trigger «nova_comanda» que desprès d'una actualització de les unitats de producte en la taula producte, comprovi si aquestes han arribat al nivell de reposició i afegeixi una línia al fitxer de comandes indicant quin és la compra que cal fer, tenint en compte que, quan es fa una compra sempre s'arriba al doble de les unitats de reposició (Per exemple: si reposició es igual a 5 i queden 3, cal comprar 7.

11.- Crea el procediment «vendes_impressora» per elaborar un informe que mostri com han anat les vendes de les diferents impressores. En concret es volen les següents dades:

  • Total venut per impressora i any.
  • Total venut per impressora, tenint en compte els dos anys.
  • Total venut per totes les impressores per any.
  • Total venut per impressora, tenint en compte els dos anys.
  • Impressora que més unitats s'ha venut per any i unitats.
  • Impressora que més ha facturat per any i import.
  • Impressora que més unitats s'ha venut tenint en compte els dos anys i unitats.
  • Impressora que més ha facturat tenint en compte els dos anys i import.
  • Impressora de la comanda que més unitats s'ha venut i unitats tenint en compte els dos anys.
  • Impressora de la comanda que més s'ha facturat i import tenint en compte els dos anys.

Ajuda: podeu considerar que només hi ha una impressora en cada cas. Si ni hagués dos o més només mostreu una.

Per aquest apartat, cal que utilitzeu els següents cursors:

CURSOR c_producte_cursor IS 
SELECT ref, nom_producte 
FROM producte ;

CURSOR c_venda_cursor (ref_prod VARCHAR2) IS 
SELECT to_char(data,’YYYY’), producte, unitats, import
FROM vendes 
WHERE producte = ref_prod
ORDER BY to_char(data,’YYYY’);

Ajuda: A continuació es mostra un exemple de la sortida produïda per el procediment creat:

======== Informe de vendes d'impressores ========

--IMPRESORA CANON PIXMA IP2850--

En 2019:     181,92 €
En 2020:     909,60 €
Total:      1091,52 €

--IMPRESORA CANON PIXMA IX6850 A3--

En 2019:   1171,90 €
En 2020:   2343,80 €
Total:     3515,70 €
...

============ Resum ===============

En 2019:   5844,22 €
En 2020:   7286,20 €
Total:    13130,42 €

============ Dades destacades ===============

----------- Impressora que més unitats s'ha venut -----------

En 2019: IMPRESORA CANON PIXMA TS8050    	Unitats: 14

En 2020: IMPRESORA CANON PIXMA IP2850		Unitats: 20

En Total: IMPRESORA CANON PIXMA TS8050		Unitats: 25

--------------- Impressora que més ha facturat ---------------

En 2019:  IMPRESORA CANON PIXMA TS8050		Import: 2378,60 €

En 2020:  IMPRESORA CANON PIXMA IX6850 A3	Import: 2343,80 €

En Total:  IMPRESORA CANON PIXMA TS8050		Import: 4247.50 €

--------- Comanda de més unitats i més facturació ---------

Impressora:  IMPRESORA CANON PIXMA IP2850	Unitats: 12

Impressora:  IMPRESORA CANON PIXMA IX6850 A3	Import: 2343,80 €