Esempi sui cursori
This commit is contained in:
24
cursori/CURSORI_1.sql
Normal file
24
cursori/CURSORI_1.sql
Normal 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
51
cursori/CURSORI_2.sql
Normal 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
74
cursori/CURSORI_3.sql
Normal 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
78
cursori/CURSORI_4.sql
Normal 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
59
cursori/CURSORI_5.sql
Normal 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
60
cursori/CURSORI_6.sql
Normal 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;
|
||||||
Reference in New Issue
Block a user