Zum Inhalt springen

Oracle-Trigger bei 1:n Insert - wie löst man das?


Empfohlene Beiträge

Geschrieben

Hallo,

kann mir jemand bei einem Trigger-Problem in Oracle helfen? Ich möchte gerne bei Belegbuchungen (INSERTS, vielleicht später auch bei UPDATE und DELETE) in der Lage sein, per Trigger weitere Tabellen zu beschreiben. Mein Problem ist, daß ich mit dem klassischen for-each-row-Trigger bei INSERT-Vorgängen nicht weiterkomme.

Die Tabellen, um die es geht, sind (vereinfacht) so strukturiert wie unten. Es ist nicht die genaue Oracle-Syntax, weil ich das hier aus dem Kopf aufschreibe, aber in Wirklichkeit sind die CREATE-TABLE-Anweisungen und die ganzen Constraints und Foreign-Keys syntaktisch und semantisch korrekt.

Tabelle KOPF:

-VORGANG CHAR(1) NOT NULL

-BUKRS CHAR(2) NOT NULL

-BELNR NUMBER(6,0) NOT NULL

-KUNDE CHAR(4) NOT NULL

-BUDAT DATE NOT NULL

PRIMARY KEY (VORGANG, BUKRS, BELNR)

Tabelle ZEILEN:

-VORGANG CHAR(1) NOT NULL

-BUKRS CHAR(2) NOT NULL

-BELNR NUMBER(6,0) NOT NULL

-BUZEI NUMBER(3,0) NOT NULL

-KONTO CHAR(3) NOT NULL

-MATNR VARCHAR(5)

-MENGE NUMBER(10,1)

-BETRAG NUMBER(10,2) NOT NULL

-ZTEXT VARCHAR(50) NOT NULL

PRIMARY KEY (VORGANG, BUKRS, BELNR, BUZEI)

FOREIGN KEY(VORGANG, BUKRS, BELNR) REFERENCES KOPF (VORGANG, BUKRS, BELNR)

Eine Buchung für einen neuen Beleg ist immer ein Kopf und mindestens eine Zeile und wird in eine Transaktion gekapselt.

Beispiel:

BEGIN TRANSACTION


INSERT INTO KOPF(VORGANG, BUKRS, BELNR, KUNDE, BUDAT)

VALUES ('A', '01', 4711, 'AB23', SYSDATE)


INSERT INTO ZEILEN(VORGANG, BUKRS, BELNR, BUZEI, KONTO, BETRAG, ZTEXT)

VALUES ('A', '01', 4711, 1, '100', 800.00, 'Rechnung')


INSERT INTO ZEILEN(VORGANG, BUKRS, BELNR, BUZEI, KONTO, MATNR, MENGE, BETRAG, ZTEXT)

VALUES ('A', '01', 4711, 2, '300', 'ABCD1', -19.4, -500.00, 'Makkaroni')


INSERT INTO ZEILEN(VORGANG, BUKRS, BELNR, BUZEI, KONTO, MATNR, MENGE, BETRAG, ZTEXT)

VALUES ('A', '01', 4711, 3, '400', 'CDEFG', -3.5, -300.00, 'Rigatoni')


COMMIT TRANSACTION
To-Do: Es soll für jede Zeile ein Trigger feuern und mit den Werten aus der Zeile ggfalls. weitere Tabellen gefüllt werden. Allerdings braucht es zum Füllen dieser Tabellen auch Werte aus dem Belegkopf (also quasi die Daten aus dem Join von Belegkopf und Belegzeile): Beispiel: Etwa sollte aus dem Beispiel oben der Kunde (aus dem Kopf) und die Kontonummer (aus der Zeile) abgefragt werden und bei einer bestimmten Konstellation in eine offene-Posten-Tabelle angefügt werden:
INSERT INTO KUNDENOPS (BELNR, KUNDE, BUDAT, Betrag)

VALUES (kopf.BELNR, kopf.KUNDE, kopf.BUDAT, zeilen.Betrag)

Eine Abfrage der Kopf-Werte aus der Datenbank geht nicht, weil der Kopf ja noch gar nicht existiert (~die Transaktion ist noch nicht fertig). Und da komme ich nicht weiter.

Ich möchte das Problem aber ungern im Anwendungsprogramm lösen, sondern direkt in der Datenbank, vor allem weil es u.U. verschiedene Clients geben wird mit unterschiedlichen Plattformen (JDBC, ADO), aber die Logik hingegen immer die gleiche sein soll. Kann mir vielleicht einer sagen, wie man so etwas löst. Dafür vielen Dank im voraus.

Grüße

Wurmi

Erstelle ein Benutzerkonto oder melde Dich an, um zu kommentieren

Du musst ein Benutzerkonto haben, um einen Kommentar verfassen zu können

Benutzerkonto erstellen

Neues Benutzerkonto für unsere Community erstellen. Es ist einfach!

Neues Benutzerkonto erstellen

Anmelden

Du hast bereits ein Benutzerkonto? Melde Dich hier an.

Jetzt anmelden

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...