Zum Inhalt springen
View in the app

A better way to browse. Learn more.

Fachinformatiker.de

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

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

Empfohlene Antworten

Veröffentlicht

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

Archiv

Dieses Thema wurde archiviert und kann nicht mehr beantwortet werden.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.