AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi Transaktion für INSERT IF NOT EXIST
Thema durchsuchen
Ansicht
Themen-Optionen

Transaktion für INSERT IF NOT EXIST

Ein Thema von s.h.a.r.k · begonnen am 9. Jul 2010 · letzter Beitrag vom 13. Jul 2010
Antwort Antwort
Benutzerbild von s.h.a.r.k
s.h.a.r.k

Registriert seit: 26. Mai 2004
3.159 Beiträge
 
#1

Transaktion für INSERT IF NOT EXIST

  Alt 9. Jul 2010, 16:10
Datenbank: Oracle • Version: 9.x • Zugriff über: AnyDAC
Hallo zusammen,

ich bin im Moment etwas am grübeln, ob folgendes funktioniert. Ich kenne mich mit Datenbanken zwar aus, aber leider nicht ausreichend, um mir selbst die Frage beantworten zu können. Google hat mir bisher auch nicht wirklich etwas brauchbares vor die Nase gesetzt.

Eines noch vorweg: ein INSERT IF NOT EXIST Konstrukt scheint es für Oracle 9.x nicht zu geben, ergo suche ich gerade nach einem anderen Weg und Transaktionen scheinen unter Umständen zu funktionieren -- zumindest glaube ich das im Moment

Hintergrund ist folgender: wenn mein Programm startet, so wird in der Datenbank nachgeschaut, ob der User schon mal eingeloggt war, d.h. es muss ein Eintrag mit dem Windows-Benutzername (ist der Primary Key dieser User-Tabelle) existieren. Wenn das noch nicht der Fall ist, so soll dieser Eintrag hinzugefügt werden, inkl. einem weiteren in einer anderen Tabelle.

Nun kann es aber ja passieren, dass ein User das Programm so ziemlich gleichzeitig zwei Mal ausführt und das dann unter Umständen Probleme bei der Abfrage und dem eventuellen Einfügen macht. Das will ich auf jeden Fall verhindern. Daher auch die Idee mit der Transaktion, wobei ich nicht weiß, ob das hier nicht doch zu Problemen führen kann. Ich weiß leider nicht, wie die Transaktionen intern gehandelt werden. Ist ein SELECT-Befehl in einer Transaktion mit drin!? Oder können diese sich überschneiden?!
»Remember, the future maintainer is the person you should be writing code for, not the compiler.« (Nick Hodges)
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.861 Beiträge
 
Delphi 11 Alexandria
 
#2

AW: Transaktion für INSERT IF NOT EXIST

  Alt 9. Jul 2010, 16:11
Versuche es mal mit MERGE
Markus Kinzler
  Mit Zitat antworten Zitat
Benutzerbild von s.h.a.r.k
s.h.a.r.k

Registriert seit: 26. Mai 2004
3.159 Beiträge
 
#3

AW: Transaktion für INSERT IF NOT EXIST

  Alt 9. Jul 2010, 16:14
Hab das MERGE auch schon gefunden, aber ich hab das immer nur in Zusammenhang mit einer zweiten Tabelle gesehen. Mal schauen, was die Oracle-Doku dazu sagt. Danke schon mal

// edit
Hier noch schnell der Link zur Doku.

Wie sollte ich das denn mit einem MERGE machen!? Ich will doch nicht erst die Daten in die DB klopppen müssen, sondern die sollten direkt aus meinem Programm heraus kommen.

// edit 2
ich muss zurückrudern! ich habe nun verstanden, wie es geht -- glaube ich zumindest
»Remember, the future maintainer is the person you should be writing code for, not the compiler.« (Nick Hodges)

Geändert von s.h.a.r.k ( 9. Jul 2010 um 16:32 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von s.h.a.r.k
s.h.a.r.k

Registriert seit: 26. Mai 2004
3.159 Beiträge
 
#4

AW: Transaktion für INSERT IF NOT EXIST

  Alt 10. Jul 2010, 17:35
Gibts auch noch weitere Beiträge zum Thema?!

Das mit dem MERGE klappt in Oracle wohl nicht so recht...
»Remember, the future maintainer is the person you should be writing code for, not the compiler.« (Nick Hodges)
  Mit Zitat antworten Zitat
Benutzerbild von s.h.a.r.k
s.h.a.r.k

Registriert seit: 26. Mai 2004
3.159 Beiträge
 
#5

AW: Transaktion für INSERT IF NOT EXIST

  Alt 13. Jul 2010, 03:01
Habe das Problem mit dem MERGE zwar gelöst, aber ich habe eine bessere Lösung für mein Problem gefunden. Und zwar unterstützt Oracle eine ganze Reihe an Funktionen in einem INSERT-Befehl (Dokumentation für Oracle Version 9.2).

So in etwa sieht nun mein Query aus:

SQL-Code:
INSERT FIRST
  WHEN NOT EXISTS (
    SELECT 1
    FROM "TdmUser"
    WHERE "Username" = :username
  )
    
THEN
  INTO "TdmUser" ("Username", "Disabled")
  VALUES (:username, 0)
  
  INTO "TdmUserProfileOptions" (
    -- viele Spalten ;)
  VALUES(
    -- viele Spalten, die aus dem unteren SELECT stammen, wodurch
    -- das Standardprofil erzeugt wird, welches man via GUI
    -- natürlich auch bearbeiten kann
  )
  
SELECT * FROM "TdmUserProfileOptions" WHERE "RefUsername" = ':default-profile:';
Entsprechend ist die Anzahl der eingefügten Datensätze, wenn der Username vorhanden ist, gleich 0, oder bei "nicht-vorhanden-sein" gleich 2, da ja in zwei Tabellen Datensätze eingefügt wurden. Schön ist auch, dass man in x-beliebige Tabellen Daten einfügen und diese mit dem SELECT am Ende füttern kann.

Blöd ist aber, dass das SELECT am Schluss Pflich ist. Will man die INSERTs mit Daten aus der Anwendung füllen, so bräuchte man das SELECT gar nicht.
»Remember, the future maintainer is the person you should be writing code for, not the compiler.« (Nick Hodges)
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:08 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz