Soluzione degli esercizi PL-SQL Esercizio 1: Scrivere un blocco di codice che scriva in output la stringa ESAME DI SISTEMI INFORMATIVI come concatenazione di 4 variabili SET SERVEROUTPUT ON v_parte1 CONSTANT CHAR(10) := 'CORSO DI'; v_parte2 CONSTANT CHAR(25) := 'SISTEMI INFORMATIVI'; v_parte3 CONSTANT DATE := SYSDATE; v_output VARCHAR2(100); v_output := v_parte1 v_parte2 v_parte3; DBMS_OUTPUT.PUT_LINE(v_output); Esercizio 2: Scrivere un blocco di codice che, dato il codice fiscale di un fornitore restituisca il suo nome ACCEPT lv_cf CHAR v_nome Fornitori.F_NOME%TYPE; v_cf CHAR(16); v_cf:='&lv_cf'; SELECT F_NOME INTO v_nome FROM Fornitori WHERE F_CF = v_cf; DBMS_OUTPUT.PUT_LINE('Nome del fornitore:' v_nome); DBMS_OUTPUT.PUT_LINE('Fornitore non trovato: ' v_cf); Esercizio 3: Scrivere un blocco di codice che calcoli il valore totale degli ordini e indichi in output se tale valore è superiore o inferiore a 1000 v_cont INTEGER; SELECT sum(o_qta) INTO v_cont FROM ORDINI; if v_cont > 1000 then DBMS_OUTPUT.PUT_LINE('Piu'' di mille unita'' ordinate'); DBMS_OUTPUT.PUT_LINE('Meno di mille unita'' ordinate');
Esercizio 4: modificare il codice dell esercizio 3 in modo da ottenere il seguente output (1) Se totale < 100 Risultato scarso (2) Se 100< totale < 1000 Risultato in media (3) Se 1000 < totale Risultato buono v_cont INTEGER; SELECT sum(o_qta) INTO v_cont FROM ORDINI; if v_cont <100 then DBMS_OUTPUT.PUT_LINE('Risultato scarso'); elif v_cont <1000 then DBMS_OUTPUT.PUT_LINE('Risultato in media'); DBMS_OUTPUT.PUT_LINE('Risultato buono'); Esercizio 5: Scrivere un blocco di codice che calcoli il valore totale degli ordini effettuati in una certa data. Nel caso in cui non sia presente nessun ordine viene visualizzato il messaggio Nessun ordine presente per la data: --------- v_valore NUMBER := 0; v_data DATE; v_data := '&sv_date'; SELECT SUM(Qta*Prezzo) INTO v_valore FROM Fatture,Dettaglio WHERE Fatture.NUMF= Detteglio.NUMF and Fatture.DataF=v_data; DBMS_OUTPUT.PUT_LINE('Il valore totale delle fatture del: ' v_data ' e'' ' v_valore); Esercizio 6: Scrivere un blocco di codice che permetta di visualizzare il nome del cliente relativo a una data fattura. Nel caso la fattura non sia presente visualizzare tramite il comando RAISE La fattura --- non è stata registrata ACCEPT sv_num CHAR; v_nome Clienti.C_NOME%TYPE; v_num Fatture.A_NUM%TYPE; v_num := &sv_num; SELECT C_NOME INTO v_nome FROM Fatture,Clienti WHERE A_CLIENTE=C_CF and A_NUM=v_num; DBMS_OUTPUT.PUT_LINE('Il cliente della fattura: ' v_num ' e'' ' v_nome); DBMS_OUTPUT.PUT_LINE('La fattura: ' v_num ' non e'' stata
Esercizio 7: Calcolare il valore totale delle fatture con codice da 1 a 5 se la fattura non è presente visualizzare un messaggio di errore tramite RAISE ACCEPT i_min; ACCEPT i_max; v_count integer; v_min integer; v_max integer; v_valore Dettaglio.D_Prezzo%TYPE; e_unregistered exception; v_min:=&i_min; v_max:=&i_max; FOR v_count IN 1..3 SELECT sum(d_qta*d_prezzo) INTO v_valore FROM Fatture,Dettaglio WHERE A_NUM=D_NUMF and A_NUM=v_count; if v_valore IS NULL then DBMS_OUTPUT.PUT_LINE('La fattura: ' v_count ' non e'' stata raise e_unregistered; WHEN e_unregistered THEN DBMS_OUTPUT.PUT_LINE('La fattura: ' v_count ' non e'' stata Esercizio 8: Creare un cursore che restituisca separatamente l importo di tutte le fatture CURSOR cursore_importi IS SELECT D_NUMF,sum(D_QTA*D_PREZZO) as IMPORTO FROM dettaglio group by D_NUMF; vr_importi cursore_importi%rowtype; open cursore_importi; FETCH cursore_importi into vr_importi; EXIT WHEN cursore_importi%notfound; DBMS_OUTPUT.PUT_LINE('La fattura: ' vr_importi.d_numf ' e'' di importo: ' vr_importi.importo); close cursore_importi;
Esercizio 9: Creare un cursore che restituisca separatamente la somma degli importi delle fatture di importo minore e maggiore di mille. CURSOR cursore_importi IS SELECT D_NUMF,sum(D_QTA*D_PREZZO) as IMPORTO FROM dettaglio group by D_NUMF; vr_importi cursore_importi%rowtype; v_totsmall NUMBER := 0; v_totbig NUMBER := 0; open cursore_importi; FETCH cursore_importi into vr_importi; EXIT WHEN cursore_importi%notfound; if vr_importi.importo < 1000 then v_totsmall := v_totsmall + vr_importi.importo; v_totbig := v_totbig + vr_importi.importo; close cursore_importi; DBMS_OUTPUT.PUT_LINE('Il totale delle fatture di importo ridotto e'': ' v_totsmall); DBMS_OUTPUT.PUT_LINE('Il totale delle fatture di importo elevato e'': ' v_totbig); Esercizio 10: Alzare del 10% il prezzo di tutti i prodotti forniti dal fornitori xxx CURSOR c_prezzi IS SELECT * FROM PRODOTTI,FORNITORI WHERE P_FORNITORE=F_CF AND F_NOME='Matteo Golfarelli' FOR UPDATE OF P_PREZZOLIST ; FOR i IN c_prezzi UPDATE PRODOTTI SET P_PREZZOLIST = P_PREZZOLIST*1.1 WHERE CURRENT OF c_prezzi; COMMIT;
Esercizio 11: Scrivere una funzione che verifichi se un certo prodotto p è presente in quantità > q CREATE OR REPLACE FUNCTION "VerificaQTA" (CODPROD NUMBER,QTY NUMBER) RETURN BOOLEAN IS v_qta NUMBER; Select QTADISP INTO v_qta from Prodotti where CODP=CODPROD and QTADISP<QTY; return true; return false; val := VERIFICA(1,10); Esercizio 12: Scrivere una procedura che emetta un ordine per ogni prodotto presente in quantità < 100; CREATE PROCEDURE "Riordina" (valore NUMBER) IS cursor c_prod is select * from Prodotti where qtadisp<valore; i INT := 0; select max(idord) INTO i from Ordini; for r_prod in c_prod i:=i+1; INSERT INTO Ordini VALUES(r_prod.CODP,10,i); COMMIT;