Einzelnen Beitrag anzeigen

TBx
(Administrator)

Registriert seit: 13. Jul 2005
Ort: Stadthagen
1.893 Beiträge
 
Delphi 12 Athens
 
#9

Re: Wöchentlich etliche Datensätze updaten

  Alt 2. Jan 2009, 18:47
Ist das tatsächlich die SP, mit der Du inserten/updaten wolltest?

Ich hab mal ein wenig formatiert und ein paar Anmerkungen dazugeschrieben.

SQL-Code:
CREATE PROCEDURE DatenUpdate (
  Feld1 varchar(20) character set iso8859_1,
  Feld2 varchar(4) character set iso8859_1,
  Feld3 varchar(35) character set iso8859_1,
  Feld4 varchar(20) character set iso8859_1,
  Feld5 varchar(10) character set iso8859_1,
  Feld6 varchar(50) character set iso8859_1,
  Feld7 varchar(30) character set iso8859_1)
as
  declare variable maxZaehler integer;
  declare variable zaehler integer;
  declare variable dsgefunden integer;
begin
   for Select Max(Tabelle1Zaehler)
         From Tabelle1
         into :maxZaehler
   do DSGefunden = 0;
   /* for select ist hier unsinnig, es wird immer wenn die Tabelle mindestens
      einen Datensatz enthät der höchste Wert von Tabelle1Zaehler zurückgegeben
      und DSGefunden auf 0 gesetzt. Andernfalls sind beide Werte undefiniert. */


   Zaehler = 0;

   for Select Tabelle1Zaehler
         From Tabelle1
         Where (Feld1 = :Feld1) and (Feld2 = :Feld2) and (Feld5 = :Feld5)
         into :Zaehler
   do
   begin
     DSGefunden = 1; /* hier wird für jeden gefundenen Datensatz DSGefunden auf 1 gesetzt*/
   end

   if (DSGefunden = 1) then
   begin
     update Tabelle1
       set Tabelle1ZAEHLER = :Zaehler, Feld1 = :Feld1, Feld2 = :Feld2, Feld3 = :Feld3, Feld4 = :Feld4,
           Feld5 = :Feld5, Feld6 = :Feld6, Feld7 = :Feld7, AKTUELLESDATUM = current_date
       where Tabelle1ZAEHLER = :Zaehler;
     /* hier wird nun der letzte gefundene Datensatz aktualisiert */
/*     Suspend  --> raus damit, hat in einer SP ohne Rückgebewert nichts verloren */
   end
   else
   begin /* Wenn DSGefunden != 1 und not null */
     maxZaehler = maxZaehler +1;

     insert into Tabelle1 (Tabelle1ZAEHLER, Feld1, Feld2, Feld3, Feld4, Feld5, Feld6, Feld7, AKTUELLESDATUM)
                   values (:maxZaehler, :Feld1, :Feld2, :Feld3, :Feld4, :Feld5, :Feld6, :Feld7, current_date); /* neuen Datensatz einfügen */
/*     Suspend  --> raus damit, hat in einer SP ohne Rückgebewert nichts verloren */
   end
end
Hier eine SP, die alle Datensätze, bei denen die Felder 1,2 und 5 übereinstimmen updated und einen neuen Datensatz einfügt, wenn keine Übereinstimmung gefunden wurde.
SQL-Code:
CREATE PROCEDURE DatenUpdate (
  Feld1 varchar(20) character set iso8859_1,
  Feld2 varchar(4) character set iso8859_1,
  Feld3 varchar(35) character set iso8859_1,
  Feld4 varchar(20) character set iso8859_1,
  Feld5 varchar(10) character set iso8859_1,
  Feld6 varchar(50) character set iso8859_1,
  Feld7 varchar(30) character set iso8859_1)
as
  declare variable anz integer;
  declare variable zaehler integer;
begin
  anz = 0;
  select count (*)
    from Tabelle1
    where (Feld1 = :Feld1) and (Feld2 = :Feld2) and (Feld5 = :Feld5)
    into :anz;
  if (:anz > 0) then
  begin
    update Tabelle1
      set Feld3 = :Feld3, Feld4 = :Feld4, Feld6 = :Feld6, Feld7 = :Feld7, AKTUELLESDATUM = current_date
      where (Feld1 = :Feld1) and (Feld2 = :Feld2) and (Feld5 = :Feld5);
  end
  else
  begin
    Select Max(Tabelle1Zaehler)
      From Tabelle1
      into :Zaehler;
    if (:zaehler is null) then zaehler = 1; else zaehler = :zaehler + 1;
    insert into Tabelle1 (Tabelle1ZAEHLER, Feld1, Feld2, Feld3, Feld4, Feld5,
                          Feld6, Feld7, AKTUELLESDATUM)
                  values (:maxZaehler, :Feld1, :Feld2, :Feld3, :Feld4, :Feld5,
                          :Feld6, :Feld7, current_date);

  end
end
SP ist ungetestet, nur ins Unreine geschrieben.
Anmerkung zur Performance:
  • es sollte ein absteigender eindeutiger Index auf Tabelle1Zaehler liegen, eleganter wäre es sicherlich, sich den neuen Zaehler über einen Generator zu ermitteln
  • es sollte einen kombinierten Index aus Feld 1, 2 und 5 geben.

Hoffe, das hilft Dir weiter.
Thomas Breitkreuz
Gruß Thomas
- Admin DelphiPRAXIS
- Admin Delphi-Treff
- Embarcadero MVP
  Mit Zitat antworten Zitat