IDs für Fremdschlüssel ermitteln

Für Themen zu Datenbanken und Zugriff auf diese. Auch für Datenbankkomponenten.
Antworten
monta
Lazarusforum e. V.
Beiträge: 2809
Registriert: Sa 9. Sep 2006, 18:05
OS, Lazarus, FPC: Linux (L trunk FPC trunk)
CPU-Target: 64Bit
Wohnort: Dresden
Kontaktdaten:

IDs für Fremdschlüssel ermitteln

Beitrag von monta »

Mal eine Grundlegende Verständnisfrage zu StoredProc. in Firebird.
Ich nutze die SP um einen neuen Datensatz in meiner Datenbank anzulegen.

Normalerweise waren das nur zwei drei Tabellen, bei einem neuen Projekt benötige ich aber insgesamt ca. 50 Tabellen, auf welche die daten verteilt werden.
Die Main-Table beinhaltet dabei die entsprechenden Fremdschlüssel zu denabdere Tabellen. Wenn ich nun einen kompletten Datensatz einfügen will, benötige ich ja logischer Weise zuerst alle Fremdschlüssel. Ich muss also für jede Tabelle testen, ob der Wert schon vorhanden ist, wenn ja, benötige ich dessen Primärschlüssel, wenn nicht, muss ich den Wert erstellen und den neuen Primäschlüssel ebenfalls zwischenspeichern.

Wenn ich dann alle Primärschlüssel hab, kann ich ja schließlich damit die Main-Table füttern.

Nun stelt sich aber die Frage, wie man dies realisieren kann, logisch ist es möglich, für alle tabellen die Abfrage inzuschreiben und den Wert zwischenzuspeichern, ungefähr so:

Code: Alles auswählen

begin
  IF (NOT EXISTS (SELECT id FROM filme
    WHERE (filme.film = :XFILM) AND (filme.idmag1 = :XMAG1)))
    then
    begin
      INSERT INTO filme
        (film, idmag1, idmag2, filmid, bemerkungen)
        VALUES
        (:XFILM, :XMAG1, :XMAG2, :XFILMID, :XBEMERKUNGEN);
/*dann enthält ja der generator die entsprechende ID, auf welche ich zugreifen kann: gen_id(gen_filme_id, 0);*/
    end
    else
    begin
/*ansonsten Abfrage der ID*/
      SELECT Id FROM filme
        WHERE (filme.film = :XFILM) AND (filme.idmag1 = :XMAG1)
        INTO :ID;
    end
   suspend;
end


Nur ist dies für insgesamt 50 Tabellen recht mühsam.
Weshalb ich es gerne etwas Schachteln würde, nur dafür fehlt mir gerade der Ansatz.

1. Eine Storedproc für die Unterabfrage - nur wie übergeb ich der als Parameter den entsprechenden Tabellennamen?
2. was fast besser wäre, eine unterfunction in der StoredProc, aber selbes Problem, wie erstellt man sie überhaupt und wie kann ich die Tabelle übergeben?
3. UDF würde sich wahrscheinlich eignen :?: - hab ich aber keinerlei Ahnung von.
4. Alles manuell für jede Tabelle so wie oben?
5. Andere Methode?

Antworten