Salve sono ormai ore che ci provo a fare questa procedura che in pratica mi serve per effettuare l'ordine ad un fornitore:
E in pratica devo prima controllare che il fornitore sia presente nel mio db se è presente allora devo controllare se il prodotto che gli sto ordinando è nel suo catalogo e infine se la risposta è positiva effettuo l'ordine :
Dovrebbe essere una cosa di questo tipo ovviamente andando a tradurre quelle query negli if che non so come si fa.
Ecco cosa ho scritto io:
codice:
CREATE OR REPLACE PROCEDURE effettua_ordine(IVA_FORNITORE CHAR,COD_PRODOTTO CHAR,QUAN NUMBER) IS
NO_ORDINE NUMBER := sequenza_no.NEXTVAL;
ERRORE_FORNITORE_NON_PRESENTE EXCEPTION;
ERRORE_NON_IN_CATALOGO EXCEPTION;
BEGIN
IF IVA_FORNITORE NOT IN(SELECT PARTITA_IVA FROM FORNITORE)THEN--CONTROLLA CHE IL FORNITORE ESISTA
RAISE ERRORE_FORNITORE_NON_PRESENTE;
ELSIF COD_PRODOTTO NOT IN(SELECT H.PRODOTTO --CONTROLLO PRESENZA PRODOTTO IN CATALOGO DEL FORNITORE
FROM HA_IN_CATALOGO H,PRODOTTO P
WHERE H.PRODOTTO=P.CODICE_PRODOTTO AND
H.FORNITORE = IVA_FORNITORE) THEN
RAISE ERRORE_NON_IN_CATALOGO;
ELSE --EFFETTUA ORDINE
INSERT INTO ORDINE(ORDINE.NO,EFFETTUATO_A,DATA_RICHIESTA) VALUES (
NO_ORDINE,
UPPER(IVA_FORNITORE),
SYSDATE);
INSERT INTO CONTIENE VALUES (
NO_ORDINE,
UPPER(COD_PRODOTTO),
QUAN);
END IF;
DBMS_OUTPUT.PUT_LINE('******** ORDINE EFFETTUATO CON SUCCESSO ********');
EXCEPTION
WHEN ERRORE_NON_IN_CATALOGO THEN
RAISE_APPLICATION_ERROR(-2005,'Il prodotto selezionato non è nel catalogo del fornitore: '||IVA_FORNITORE);
WHEN ERRORE_FORNITORE_NON_PRESENTE THEN
RAISE_APPLICATION_ERROR(-2006,'Il fornitore '||IVA_FORNITORE||' non esiste');
END effettua_ordine;
ho provato a fare quelcosa di simile con i cursori ma anche qui molti problemi
codice:
CREATE OR REPLACE PROCEDURE effettua_ordine(IVA_FORNITORE CHAR,COD_PRODOTTO CHAR,QUAN NUMBER) IS
NO_ORDINE NUMBER := sequenza_no.NEXTVAL;
ERRORE_FORNITORE_NON_PRESENTE EXCEPTION;
ERRORE_NON_IN_CATALOGO EXCEPTION;
CURSOR CUR_FORNITORE(PARTITA_IVA FORNITORE.PARTITA_IVA%TYPE) IS
SELECT F.PARTITA_IVA
FROM FORNITORE F
WHERE F.PARTITA_IVA=IVA_FORNITORE;
CURSOR CUR_CAT(CODICE_PRODOTTO PRODOTTO.CODICE_PRODOTTO%TYPE) IS
SELECT P.CODICE_PRODOTTO
FROM PRODOTTO P
WHERE P.CODICE_PRODOTTO=COD_PRODOTTO AND
P.CODICE_PRODOTTO IN( SELECT H.PRODOTTO
FROM FORNITORE F,HA_IN_CATALOGO H
WHERE F.PARTITA_IVA=IVA_FORNITORE AND
F.PARTITA_IVA=H.FORNITORE);
BEGIN
FOR REC_FORNITORE IN CUR_FORNITORE LOOP
IF CUR_FORNITORE%NOTFOUND THEN --CONTROLLA SE IL FORNITORE ESISTE
RAISE ERRORE_FORNITORE_NON_PRESENTE;
END IF;
END LOOP;
FOR REC_CAT IN CUR_CAT LOOP
IF CUR_CAT%NOTFOUND THEN --CONTROLLA SE IL FORNITORE HA IL PRODOTTO IL CATALOGO
RAISE ERRORE_NON_IN_CATALOGO;
ELSE --EFFETTUA L'ORDINE
INSERT INTO ORDINE(ORDINE.NO,EFFETTUATO_A,DATA_RICHIESTA) VALUES (
NO_ORDINE,
UPPER(IVA_FORNITORE),
SYSDATE);
INSERT INTO CONTIENE VALUES (
NO_ORDINE,
UPPER(COD_PRODOTTO),
QUAN);
DBMS_OUTPUT.PUT_LINE('******** ORDINE EFFETTUATO CON SUCCESSO ********');
END IF;
END LOOP;
EXCEPTION
WHEN ERRORE_NON_IN_CATALOGO THEN
RAISE_APPLICATION_ERROR(-2005,'Il prodotto selezionato non è nel catalogo del fornitore: '||IVA_FORNITORE);
WHEN ERRORE_FORNITORE_NON_PRESENTE THEN
RAISE_APPLICATION_ERROR(-2006,'Il fornitore '||IVA_FORNITORE||' non esiste');
END effettua_ordine;
Un aiuto perfavore