Esempi sui cursori

This commit is contained in:
Fabio Scotto di Santolo
2019-09-13 20:02:16 +02:00
parent 0e4018a47b
commit 330aa77609
6 changed files with 346 additions and 0 deletions

24
cursori/CURSORI_1.sql Normal file
View File

@@ -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;

51
cursori/CURSORI_2.sql Normal file
View File

@@ -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;

74
cursori/CURSORI_3.sql Normal file
View File

@@ -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;

78
cursori/CURSORI_4.sql Normal file
View File

@@ -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;

59
cursori/CURSORI_5.sql Normal file
View File

@@ -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;

60
cursori/CURSORI_6.sql Normal file
View File

@@ -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;