DROP TABLE ERRORS;

CREATE TABLE ERRORS(
    errormsg VARCHAR2(256),
    prodid   NUMBER (6),
    ordid    NUMBER (4) NOT NULL);


CREATE OR REPLACE PROCEDURE ADD_ITEM
  (auftragsnr ITEM.ordid%type, produktnr ITEM.prodid%type,
   preis ITEM.actualprice%type, menge ITEM.qty%type)
AS
    maxitemid INTEGER;
    anz_produkte INTEGER;
    anz_bestellungen INTEGER;
    PRODID_NOT_FOUND EXCEPTION;
    ORDID_NOT_FOUND EXCEPTION;
BEGIN
    SELECT COUNT(p.prodid) INTO anz_produkte FROM product p
    WHERE p.prodid=produktnr;
    SELECT COUNT(o.ordid) INTO anz_bestellungen FROM ord o
    WHERE o.ordid=auftragsnr;
    IF anz_produkte=0 THEN raise PRODID_NOT_FOUND;
    ELSIF anz_bestellungen=0 THEN raise ORDID_NOT_FOUND;
    END IF;
    SELECT max(itemid) INTO maxitemid FROM item WHERE ordid = auftragsnr;
    maxitemid := NVL(maxitemid, 0);
    maxitemid := maxitemid+1;
    INSERT INTO item(ordid, itemid, prodid, actualprice, qty, itemtot)
    VALUES(auftragsnr, maxitemid, produktnr, preis, menge, menge*preis);
EXCEPTION
    WHEN PRODID_NOT_FOUND THEN
        INSERT INTO errors VALUES('Produktnummer nicht gefunden.',
            produktnr, auftragsnr);
    WHEN ORDID_NOT_FOUND THEN
        INSERT INTO errors VALUES('Auftragsnummer nicht gefunden.',
            produktnr, auftragsnr);
END ADD_ITEM;
/



