(Administrator)
Registriert seit: 13. Jul 2005
Ort: Stadthagen
1.893 Beiträge
Delphi 12 Athens
|
Re: Wöchentlich etliche Datensätze updaten
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.
|