Einzelnen Beitrag anzeigen

HeZa

Registriert seit: 4. Nov 2004
Ort: Dortmund
182 Beiträge
 
Delphi 10 Seattle Professional
 
#25

AW: [PLSQL] Gibt es ein "Select oder Insert"- Befehl?

  Alt 6. Jul 2010, 13:12
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.
  Mit Zitat antworten Zitat