Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- CREATE OR REPLACE PROCEDURE bestellen (anr VARCHAR2, bmenge NUMBER) AS
- PROCEDURE ermittle_einzelteile( anr VARCHAR2, emenge NUMBER) ; --Prototyp
- PROCEDURE p_privatenachbestellung( anr VARCHAR2, msg VARCHAR2) ; --Prototyp
- PROCEDURE p_nbmenge_zulageradden; --Prototyp
- PROCEDURE ermittle_einzelteile( anr VARCHAR2, emenge NUMBER) AS
- CURSOR c1 IS SELECT * FROM struktur WHERE o_a_nr = anr;
- c1_rec c1%ROWTYPE;
- Flag NUMBER:=0;
- menge_neu NUMBER :=0;
- curSeq NUMBER :=0; /*sowie id.*/
- lm NUMBER:=0;
- BEGIN
- Flag := 0;
- FOR c1_rec IN C1 LOOP
- Flag := 1;
- menge_neu := emenge*c1_rec.menge;
- Ermittle_einzelteile(c1_rec.u_a_nr, menge_neu);
- END LOOP;
- IF Flag = 0 THEN
- BEGIN
- curSeq := ETAUFTRAGSEQUENCE.CURRVAL;
- INSERT INTO et_liste VALUES(curSeq, anr, emenge);
- SELECT lager.lagermenge INTO lm FROM lager WHERE a_nr = anr;
- UPDATE lager SET lagermenge = lagermenge-emenge WHERE a_nr = anr;
- EXCEPTION WHEN OTHERS THEN
- IF SQLCODE = -20222 THEN /*genug im lager und existiert*/
- p_privatenachbestellung(anr, SUBSTR(SQLERRM, 1, 65));
- ELSE
- IF SQLCODE = -20111 THEN
- raise_application_error(-20000,'nachbs. nit mögl. lager von:' || anr || ' ist ' || lm || 'aber neue menge is größer' || emenge);
- ELSE
- DBMS_OUTPUT.PUT_LINE('bin in excepion when others then' || SQLCODE);
- UPDATE et_liste SET et_menge = et_menge + emenge WHERE et_nr = anr AND pa_nr = curSeq;
- UPDATE lager SET lagermenge = lagermenge-emenge WHERE a_nr = anr;
- END IF;
- END IF;
- END;
- END IF;
- END;
- PROCEDURE p_privatenachbestellung(anr VARCHAR2, msg VARCHAR2) AS
- BEGIN
- /*ROLLBACK; *//*allle gespeichertden et daten weerden zrckgestellt, weil pauftrag nicht valide is(zu gringe menge)*/
- BEGIN
- DBMS_OUTPUT.PUT_LINE(msg);
- INSERT INTO nachbestellen VALUES(anr);
- DBMS_OUTPUT.PUT_LINE(anr || ' nachbestellt');
- EXCEPTION WHEN OTHERS THEN
- DBMS_OUTPUT.PUT_LINE('Artikel ' || anr || ' wurde bereits nachbestellt');
- END;
- COMMIT;
- END;
- /*wird nachdem man in nachbestelltabelle eingefügt hat aufgerufen*/
- PROCEDURE p_nbmenge_zulageradden AS
- CURSOR cl IS SELECT a_nr FROM nachbestellen;
- cl_rec cl%ROWTYPE;
- menge NUMBER := 0;
- BEGIN
- FOR cl_rec IN Cl LOOP
- BEGIN
- INSERT INTO lager VALUES(cl_rec.a_nr, 10, 5, 10, NULL);
- EXCEPTION WHEN OTHERS THEN
- UPDATE lager SET lagermenge = lagermenge + nachbestellmenge WHERE a_nr = cl_rec.a_nr;
- END;
- END LOOP;
- END;
- BEGIN
- INSERT INTO produktionsauftrag VALUES(ETAUFTRAGSEQUENCE.NEXTVAL, anr, bmenge);
- Ermittle_einzelteile(anr,bmenge);
- p_nbmenge_zulageradden();
- DELETE FROM nachbestellen;/*nachbestellen daten für den derzeitgen auftrag löschen, weil ja lager upgedated wird*/
- DBMS_OUTPUT.PUT_LINE('Success Produktionsauftrag ist geschafft');
- COMMIT;
- EXCEPTION
- WHEN OTHERS THEN
- DBMS_OUTPUT.PUT_LINE('pauftrag failed. error:' || SUBSTR(SQLERRM, 1, 65));
- ROLLBACK;
- END;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement