Einzelnen Beitrag anzeigen

monta

Registriert seit: 18. Okt 2004
Ort: Dresden
141 Beiträge
 
#1

Fremdschlüssel bei Insert ermitteln

  Alt 4. Jan 2007, 21:15
Datenbank: Firebird • Zugriff über: SQL
Hallo, ich habe ein grundlegendes Problem, für umfangreiche Inserts über mehrere Tabellen.
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 den anderen Tabellen. Wenn ich nun einen kompletten Datensatz einfügen will, benötige ich ja 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:
SQL-Code:
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?
Johannes M.
  Mit Zitat antworten Zitat