Hallo Sirius,
hier ein Entwurf. Da mir der Context fehlt kann ich natürlich nichts testen. Was mir besser gefällt ist, das im Fall, wenn die Channel-Daten schon gespeichert wurden nur einmal die Tabelle dbt_channel abgefragt wird. Der Rest beruht eher darauf, das ich keine Sorgen bei der Verwendung von Exceptions habe, aber vielleicht fehlen mir da auch nur die schlechten Erfahrungen.
SQL-Code:
BEGIN
LOOP
BEGIN
-- ChannelID suchen
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;
if aDoInsert
THEN
-- existiert, sollte aber nicht
RaiseAlreadyExist('
Channel');
end if;
-- ansonsten sind wir fertig
RETURN ChannelID;
EXCEPTION
WHEN NO_DATA_FOUND
THEN
-- Channel-Daten noch nicht angelegt
if not aDoInsert
THEN
-- sollten aber angelegt sein
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;
RETURN ChannelID;
EXCEPTION
when dup_val_on_index
then
NULL;
-- den Datensatz gibt es doch schon, alles von vorne
END;
END;
END LOOP;
END;
Da ich nicht weiß wie du ChannelID verwendest, bleibt der Verdacht, dass auch diese Tabelle überflüssig seinen könnte. Diese Tabelle scheint mir wie die DBT_ZEIT Tabelle eine Gruppierung darzustellen, die man auch aus den Daten gewinnen könnte wenn man statt der ChannelID die sieben anderen Werte abspeichern würde. Aber ich weiß natürlich nicht wie viele Datensätze anderer Tabellen von der ChannelID abhängen oder wie teuer es ist, die Gruppierung live aus den von ChannelID abhängigen Daten zu ziehen.