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