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:
ho provato a fare quelcosa di simile con i cursori ma anche qui molti problemicodice: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;
Un aiuto perfavorecodice: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;![]()

Rispondi quotando