Registriert seit: 3. Jan 2007
Ort: Dresden
3.443 Beiträge
Delphi 7 Enterprise
|
AW: [PLSQL] Gibt es ein "Select oder Insert"- Befehl?
6. Jul 2010, 11:12
Für mich sieht deine Lösung etwas exotisch aus. Bring doch mal eine der anderen Stellen wo dieses Muster verwendest. Vielleicht kann man ja auch dort aufzeigen wie es einfacher, sicherer und schneller geht.
Ok.
SQL-Code:
-- Die Tabelle dbt_Channel führt verschiedene IDs (alles FK) aus anderen Tabellen zusammen zu einem neuen einzigen Key.
-- Diese FKs bilden einen unique index (in anderen Varianten gab es noch zusätzliche Spalten, welche außerhalb jedweden Indexes lagen)
-- der PK (Spaltenname: ID), der hier in dbt_Channel gebildet wird, wird in verschiedenen Messwerttabellen verwendet, welche mit Abstand dann auch die größten Tabellen sind.
Select count(ID) into c from dbt_channel
where ID_Characteristic=CharacteristicID
and ID_BaseIndicator=BaseIndicatorID
and ID_Indicator=IndicatorID
and ID_Phase=PhaseID
and ID_Unit=UnitID
and ID_Interval=IntervalID
and Frequency=aFrequency;
if c>0 then
if aDoInsert then
RaiseAlreadyExist(' Channel');
end if;
else
if not aDoInsert then
RaiseNotExist(' Channel');
end if;
begin
insert into dbt_Channel (Id_Characteristic,Id_Phase,Id_Indicator,
id_Unit,Id_Interval,Frequency,Id_Baseindicator)
values (CharacteristicID,
PhaseID,
IndicatorID,
UnitID,
IntervalID,
aFrequency,
BaseIndicatorID)
returning ID into ChannelID;
commit;
exception
when dup_val_on_index then
c:=1;
when others then
raise;
end;
end if;
if c>0 then
Select ID into ChannelID from dbt_channel
where ID_Characteristic=CharacteristicID
and ID_BaseIndicator=BaseIndicatorID
and ID_Indicator=IndicatorID
and ID_Phase=PhaseID
and ID_Unit=UnitID
and ID_Interval=IntervalID
and Frequency=aFrequency;
end if;
return(ChannelID);
-- Die Reaktion auf aDoInsert ist hier nochmal gesondert zu sehen und muss nicht zwingend hier beachtet werden
Dieser Beitrag ist für Jugendliche unter 18 Jahren nicht geeignet.
|
|
Zitat
|