From 330aa77609e73f2c117fe46221b40769c73f4f2b Mon Sep 17 00:00:00 2001 From: Fabio Scotto di Santolo Date: Fri, 13 Sep 2019 20:02:16 +0200 Subject: [PATCH] Esempi sui cursori --- cursori/CURSORI_1.sql | 24 +++++++++++++ cursori/CURSORI_2.sql | 51 ++++++++++++++++++++++++++++ cursori/CURSORI_3.sql | 74 ++++++++++++++++++++++++++++++++++++++++ cursori/CURSORI_4.sql | 78 +++++++++++++++++++++++++++++++++++++++++++ cursori/CURSORI_5.sql | 59 ++++++++++++++++++++++++++++++++ cursori/CURSORI_6.sql | 60 +++++++++++++++++++++++++++++++++ 6 files changed, 346 insertions(+) create mode 100644 cursori/CURSORI_1.sql create mode 100644 cursori/CURSORI_2.sql create mode 100644 cursori/CURSORI_3.sql create mode 100644 cursori/CURSORI_4.sql create mode 100644 cursori/CURSORI_5.sql create mode 100644 cursori/CURSORI_6.sql diff --git a/cursori/CURSORI_1.sql b/cursori/CURSORI_1.sql new file mode 100644 index 0000000..6acb98e --- /dev/null +++ b/cursori/CURSORI_1.sql @@ -0,0 +1,24 @@ +DECLARE + V_BOLLINI CARDS.BOLLINI%TYPE; + V_CODICEFID CARDS.CODFIDELITY%TYPE := &CODFID; +BEGIN + + SELECT + BOLLINI + INTO + V_BOLLINI + FROM + CARDS + WHERE + CODFIDELITY = V_CODICEFID; + + DBMS_OUTPUT.PUT_LINE('Record Coinvolti: ' || SQL%ROWCOUNT); + DBMS_OUTPUT.PUT_LINE('Monte Bollini: ' || V_BOLLINI); + +EXCEPTION + WHEN NO_DATA_FOUND THEN -- RECORD NON TROVATO + DBMS_OUTPUT.PUT_LINE('Codice fidelity inesistente: ' || V_CODICEFID); + WHEN TOO_MANY_ROWS THEN -- ERRORE GRAVE, INTEGRITÀ NON RISPETTATA + DBMS_OUTPUT.PUT_LINE('Integrità dei dati compromessa in: ' || V_CODICEFID); + RAISE; +END; diff --git a/cursori/CURSORI_2.sql b/cursori/CURSORI_2.sql new file mode 100644 index 0000000..29b0f5f --- /dev/null +++ b/cursori/CURSORI_2.sql @@ -0,0 +1,51 @@ +-- Esempio di cursore esplicito +DECLARE + V_CODICEFID SCONTRINI.CODFID%TYPE := &CODFID; + V_AMMPREMIO NUMBER; + -- CREAZIONE CURSORE + CURSOR C_PREMIO + IS + SELECT + NVL(COUNT(*), 0) AS NUMSPESE + FROM + SCONTRINI + WHERE + CODFID = V_CODICEFID; + V_PREMIO C_PREMIO%ROWTYPE; +BEGIN + DBMS_OUTPUT.PUT_LINE('Apertura Cursore'); + OPEN C_PREMIO; + + DBMS_OUTPUT.PUT_LINE('Fetch Cursore'); + FETCH + C_PREMIO + INTO + V_PREMIO; + + IF C_PREMIO%FOUND THEN + DBMS_OUTPUT.PUT_LINE('RECORD TROVATO'); + DBMS_OUTPUT.PUT_LINE('Numero di Spese: ' || V_PREMIO.NUMSPESE); + + IF V_PREMIO.NUMSPESE > 10 THEN + V_AMMPREMIO := 10; + ELSIF V_PREMIO.NUMSPESE > 5 AND V_PREMIO.NUMSPESE < 10 THEN + V_AMMPREMIO := 5; + ELSE + V_AMMPREMIO := 0; + END IF; + END IF; + + DBMS_OUTPUT.PUT_LINE ('CHIUSURA DEL CURSORE'); + CLOSE C_PREMIO; + + IF V_AMMPREMIO > 0 THEN + DBMS_OUTPUT.PUT_LINE('Complimenti hai ottenuto un premio di ' || V_AMMPREMIO || ' coupon' ); + ELSE + DBMS_OUTPUT.PUT_LINE('Spiacente, non hai ottenuto alcun premio'); + END IF; +EXCEPTION + WHEN OTHERS THEN + IF C_PREMIO%ISOPEN THEN + CLOSE C_PREMIO; + END IF; +END; diff --git a/cursori/CURSORI_3.sql b/cursori/CURSORI_3.sql new file mode 100644 index 0000000..a36947c --- /dev/null +++ b/cursori/CURSORI_3.sql @@ -0,0 +1,74 @@ +--Esempio di Cursore Esplicito con Ciclo LOOP + +DECLARE + -- CREAZIONE CURSORE + CURSOR C_CLIENTI + IS + SELECT + A.NOME + || ' ' + || A.COGNOME AS Nominativo, + B.NUMSPESE, + B.VALTOT + FROM + CLIENTI A + JOIN + ( + SELECT + CODFID, + COUNT( * ) AS NUMSPESE, + SUM(TOTALE) AS VALTOT + FROM + SCONTRINI + GROUP BY + CODFID + ) + B + ON + A.CODFIDELITY = B.CODFID + WHERE + B.NUMSPESE > 20 + AND B.VALTOT > 200 + AND B.CODFID <> - 1 + ORDER BY + B.VALTOT DESC; + + V_CLIENTI C_CLIENTI%ROWTYPE; +BEGIN + DBMS_OUTPUT.PUT_LINE ('Apertura Cursore'); + OPEN C_CLIENTI; -- Apertura Cursore + + DBMS_OUTPUT.PUT_LINE ('Fetch Cursore'); + + LOOP --Inizio del Ciclo LOOP + FETCH + C_CLIENTI + INTO + V_CLIENTI; --FETCH DEL CURSORE + EXIT + WHEN C_CLIENTI%NOTFOUND; + + --DBMS_OUTPUT.PUT_LINE ('RECORD TROVATO'); + + IF V_CLIENTI.VALTOT > 400 THEN + DBMS_OUTPUT.PUT_LINE(C_CLIENTI%ROWCOUNT || ') Il Cliente '||V_CLIENTI.Nominativo ||' ha fatto spese per € ' || + V_CLIENTI.VALTOT || ' ed ha diritto a 10 coupon'); + ELSIF V_CLIENTI.VALTOT > 300 AND V_CLIENTI.VALTOT < 400 THEN + DBMS_OUTPUT.PUT_LINE(C_CLIENTI%ROWCOUNT || ') Il Cliente '||V_CLIENTI.Nominativo ||' ha fatto spese per € ' || + V_CLIENTI.VALTOT || ' ed ha diritto a 5 coupon'); + ELSE + DBMS_OUTPUT.PUT_LINE(C_CLIENTI%ROWCOUNT || ') Il Cliente '||V_CLIENTI.Nominativo || + ' NON ha diritto ad alcun premio! '); + END IF; + + END LOOP; + + DBMS_OUTPUT.PUT_LINE ('CHIUSURA DEL CURSORE'); + CLOSE C_CLIENTI; + +EXCEPTION + WHEN OTHERS THEN + IF C_CLIENTI%ISOPEN THEN + CLOSE C_CLIENTI; + END IF; +END; diff --git a/cursori/CURSORI_4.sql b/cursori/CURSORI_4.sql new file mode 100644 index 0000000..e2e4710 --- /dev/null +++ b/cursori/CURSORI_4.sql @@ -0,0 +1,78 @@ +--Esempio Cursore con parametro + +DECLARE + + V_NUMSPESE NUMBER := &NumSpese; + + --CREAZIONE CURSORE + CURSOR C_CLIENTI(P_NUMSPESE IN NUMBER) + IS + SELECT + A.NOME + || ' ' + || A.COGNOME AS NOMINATIVO, + B.NUMSPESE, + B.VALTOT + FROM + CLIENTI A + JOIN + ( + SELECT + CODFID, + COUNT( * ) AS NUMSPESE, + SUM(TOTALE) AS VALTOT + FROM + SCONTRINI + GROUP BY + CODFID + ) + B + ON + A.CODFIDELITY = B.CODFID + WHERE + B.NUMSPESE > P_NUMSPESE + AND B.CODFID <> - 1 + ORDER BY + B.VALTOT DESC; + + V_CLIENTI C_CLIENTI%ROWTYPE; + +BEGIN + DBMS_OUTPUT.PUT_LINE ('Apertura Cursore'); + OPEN C_CLIENTI(V_NUMSPESE); -- Apertura Cursore + + DBMS_OUTPUT.PUT_LINE ('Fetch Cursore'); + + LOOP + + FETCH + C_CLIENTI + INTO + V_CLIENTI; --FETCH DEL CURSORE + EXIT + WHEN C_CLIENTI%NOTFOUND; + + --DBMS_OUTPUT.PUT_LINE ('RECORD TROVATO'); + + IF V_CLIENTI.VALTOT > 400 THEN + DBMS_OUTPUT.PUT_LINE(C_CLIENTI%ROWCOUNT || ') Il Cliente '||V_CLIENTI.NOMINATIVO ||' ha fatto spese per € ' || + V_CLIENTI.VALTOT || ' ed ha diritto a 10 coupon'); + ELSIF V_CLIENTI.VALTOT > 300 AND V_CLIENTI.VALTOT < 400 THEN + DBMS_OUTPUT.PUT_LINE(C_CLIENTI%ROWCOUNT || ') Il Cliente '||V_CLIENTI.NOMINATIVO ||' ha fatto spese per € ' || + V_CLIENTI.VALTOT || ' ed ha diritto a 5 coupon'); + ELSE + DBMS_OUTPUT.PUT_LINE(C_CLIENTI%ROWCOUNT || ') Il Cliente '||V_CLIENTI.NOMINATIVO || + ' NON ha diritto ad alcun premio! '); + END IF; + + END LOOP; + + DBMS_OUTPUT.PUT_LINE ('CHIUSURA DEL CURSORE'); + CLOSE C_CLIENTI; + +EXCEPTION + WHEN OTHERS THEN + IF C_CLIENTI%ISOPEN THEN + CLOSE C_CLIENTI; + END IF; +END; \ No newline at end of file diff --git a/cursori/CURSORI_5.sql b/cursori/CURSORI_5.sql new file mode 100644 index 0000000..392cc9b --- /dev/null +++ b/cursori/CURSORI_5.sql @@ -0,0 +1,59 @@ +--Esempio Cursore FOR LOOPS + +DECLARE + --Dichiarazione del cursore + CURSOR C_CLIENTI + IS + SELECT + CODFIDELITY, + NOME, + COGNOME + FROM + CLIENTI + WHERE + CODFIDELITY IN + ( + SELECT DISTINCT + CODFID + FROM + SCONTRINI + WHERE + CODFID <> - 1 + GROUP BY + CODFID + HAVING + SUM(TOTALE) > 300 + ); + +BEGIN + + DELETE + FROM + TOP_CLI + WHERE + MESE = EXTRACT(MONTH FROM SYSDATE); + + FOR R_CLIENTI IN C_CLIENTI -- Fetch del cursore + LOOP + DBMS_OUTPUT.PUT_LINE ('Inserimento ' || R_CLIENTI.CODFIDELITY); + + INSERT + INTO + TOP_CLI + ( + CODFID, + MESE, + NOME, + COGNOME + ) + VALUES + ( + R_CLIENTI.CODFIDELITY, + EXTRACT(MONTH FROM SYSDATE), + R_CLIENTI.NOME, + R_CLIENTI.COGNOME + ); + + END LOOP; + +END; diff --git a/cursori/CURSORI_6.sql b/cursori/CURSORI_6.sql new file mode 100644 index 0000000..60399e4 --- /dev/null +++ b/cursori/CURSORI_6.sql @@ -0,0 +1,60 @@ +--Esempio Cursori Annidati +DECLARE + V_NUMSPESE NUMBER := &NUMSPESE; + + --Primo Cursore: I migliori n clienti + CURSOR C_BESTCLI(P_NUMSPESE IN NUMBER) + IS + SELECT + AA.* + FROM + ( + SELECT + CODFID, + SUM(TOTALE) AS TOTVEND + FROM + SCONTRINI + WHERE + CODFID <> '-1' + GROUP BY + CODFID + ORDER BY + SUM(TOTALE) DESC + ) + AA + WHERE + ROWNUM <= P_NUMSPESE; + + --Secondo Cursore: I dati di ciascun cliente + CURSOR C_DATICLI(P_CODFID IN CLIENTI.CODFIDELITY%TYPE) + IS + SELECT + A.CODFIDELITY, + A.NOME + || ' ' + || A.COGNOME AS NOMINATIVO, + B.BOLLINI, + B.ULTIMASPESA + FROM + CLIENTI A + JOIN CARDS B + ON + A.CODFIDELITY = B.CODFIDELITY + WHERE + A.CODFIDELITY = P_CODFID FOR UPDATE; + +BEGIN + + FOR R_BESTCLI IN C_BESTCLI(V_NUMSPESE) + LOOP + DBMS_OUTPUT.PUT_LINE(R_BESTCLI.CODFID || ' ' || R_BESTCLI.TOTVEND); + + FOR R_DATICLI IN C_DATICLI(R_BESTCLI.CODFID) + LOOP + DBMS_OUTPUT.PUT_LINE(R_DATICLI.CODFIDELITY || '|' || R_DATICLI.NOMINATIVO || ' | ' || R_DATICLI.BOLLINI || ' | ' + || R_DATICLI.ULTIMASPESA); + END LOOP; + + END LOOP; + COMMIT; +END;