Guten Morgen,
als erstes mal ein Beispiel, das einen Datensatz löscht und alle Tabellen in der ein Fremdschlüssel eingetragen ist löscht:
Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16:
| CREATE PROCEDURE DELETEPERSONAL (ID INTEGER) AS DECLARE VARIABLE BenutzerID INTEGER; BEGIN SELECT ID FROM Benutzer WHERE Personal_ID=:ID INTO BenutzerID; UPDATE Auftrag SET Projektleiter_ID=NULL WHERE Projektleiter_ID=:ID; UPDATE Nebenkosten SET Personal_ID=NULL WHERE Personal_ID=:ID; DELETE FROM Tagebuch WHERE Personal_ID=:ID; DELETE FROM Stundensatz WHERE Personal_ID=:ID; DELETE FROM Eintrag WHERE Personal_ID=:ID; DELETE FROM Kranktage WHERE Personal_ID=:ID; IF (BenutzerID IS NOT NULL) THEN EXECUTE PROCEDURE DELETEBENUTZER(BenutzerID); DELETE FROM Personal WHERE ID=:ID; END ^ |
Klar kann man dazu auch kaskadierende Fremdschlüssel verwenden, ich persönlich bin aber davon abgekommen PK's bzw. FK's anzulegen, weil das mit Indizes wesentlich besser und einfacher geht.
Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27:
| CREATE PROCEDURE SETHOAITEXT ( AUFTRAGID INTEGER, VORLAGEID INTEGER, PHASE SMALLINT, TOPIC SMALLINT, PROZENT SMALLINT, UPDATEVORLAGE CHAR(1) ) AS DECLARE VARIABLE HOAIText INTEGER; BEGIN IF (UpdateVorlage='N') THEN BEGIN SELECT HOAIText_ID FROM HOAIVorlageListe WHERE HOAIVorlage_ID=:VorlageID AND Phase=:Phase AND Topic=:Topic INTO HOAIText; INSERT INTO HOAIAuftText (ID, HOAIAuftrag_ID, HOAIText_ID, Prozent, Phase, Topic) VALUES (GEN_ID(GEN_HOAIAuftText,1), :AuftragID, :HOAIText, :Prozent, :Phase, :Topic); END IF (UpdateVorlage='J') THEN BEGIN UPDATE HOAIAuftText SET Prozent=:Prozent WHERE HOAIAuftrag_ID=:AuftragID AND Phase=:Phase AND Topic=:Topic; END IF (UpdateVorlage='C') THEN BEGIN SELECT HOAIText_ID FROM HOAIVorlageListe WHERE HOAIVorlage_ID=:VorlageID AND Phase=:Phase AND Topic=:Topic INTO HOAIText; UPDATE HOAIAuftText SET Prozent=:Prozent, HOAIText_ID=:HOAIText WHERE HOAIAuftrag_ID=:AuftragID AND Phase=:Phase AND Topic=:Topic; END END ^ |
Im zweiten Beispiel wird eine Tabelle je nach Eingabeparameter (UpdateVorlage) bearbeitet, bei dem Wert 'N' wird ein Insert durchgeführt, der die Tabelle mit Werten füllt, bei 'J' wird ein kleines Update durchgeführt und bei 'C' ein größeres mit mehr Werten.
Bei großen SP ist es sinnvoll die einzelnen SQL-Statements erst zu entwickeln und zu testen bevor man sie in der SP zusamenbaut. Zu Deinem Beispiel:
Nach der Eingabe der Daten für einen Artikel werden diese an die SP übergeben (Artikel_ID, BestellMenge) Diese wertet erst mal aus ob noch eine ausreichende Menge des Artikels da ist
Select Menge from Lagerbestand where Artikel_ID=:ArtikelID
Wenn ja, dann wird der Lagerbestand aktualisiert, der Artikel in den Lieferschein eingetragen und gut:
INSERT Into Lieferschein Values (LieferscheinID, ArtikelID, Menge, Einzelpreis);
Update Lagerbestand set Menge=Menge-BestellMenge;
Also sieht die fertige SP ungefähr so aus:
Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24:
| CREATE PROCEDURE CreateLieferscheinPosition (LieferscheinID INTEGER, ArtikelID INTEGER, Menge NUMERIC(9,2)) RETURNS (OK SmallInt) AS DECLARE VARIABLE LagerMenge:NUMERIC(9,2); BEGIN FOR SELECT Menge FROM Lagerbestand WHERE Artikel_ID=:ArtikelID INTO :LagerMenge; DO BEGIN IF (Lagermenge<:Menge) then BEGIN :OK=0 SUSPEND; END IF (Lagermenge>=:Menge) then BEGIN INSERT Into Lieferschein Values (LieferscheinID, ArtikelID, Menge, Einzelpreis); Update Lagerbestand set Menge=Menge-BestellMenge; :OK=1; SUSPEND; END END END^ |
So ähnlich sollte es funktionieren (nicht getestet)....
Grüße
Lemmy