Announcement

Collapse
No announcement yet.

SQL und Oracle

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • SQL und Oracle

    Hallo,

    eine (denke ich) simple Frage:

    Ich habe eine Tabelle mit u.a. einem Kürzelfeld. Ich schreibe einen Trigger,
    der beim Insert Daten mit einer zweiten Tabelle
    abgleichen soll:
    Existiert dieser neue Kürzel-Eintrag, so will ich mit einem Insert den Datensatz anlegen, existiert er bereits will ich mit Update Daten anpassen. Wie realisiere ich dies im SQL?

    Vielen Dank!

    Roland

  • #2
    hallo roland,

    immer die gleiche frage. darum jetzt zum mitschreiben die musterlösung für 'instead of' trigger.

    <pre>
    -- die existierende tabelle daten.

    create table daten (kurzbez varchar2(4), name varchar2(40), umsatz number);

    insert into daten values ('a', 'alfa', 1000);

    insert into daten values ('b', 'bravo', 2000);

    commit;

    select * from daten;

    -- verstecken wir die tabelle

    rename daten to datentab;

    create view daten as select * from datentab;

    select * from daten;

    -- alle manipulationen sind erstmal weiterhin möglich

    insert into daten values ('c', 'charly', 3000);

    update daten set umsatz = umsatz * 2 where kurzbez = 'a'

    delete from daten where kurzbez = 'b';

    commit;

    select * from daten;

    -- jetzt erstellen wir einen trigger für den insert-fall
    -- innerhalb des triggers müssen wir natürlich auf datentab zugreifen

    create or replace trigger trg_daten_insert
    instead of insert on daten
    for each row
    declare
    cursor cdaten (c_kurzbez varchar2) is
    select *
    from datentab
    where kurzbez = c_kurzbez;
    recdaten cdaten%rowtype;
    begin
    open cdaten (:new.kurzbez);
    fetch cdaten into recdaten;
    if cdaten%notfound then
    insert into datentab (kurzbez, name, umsatz)
    values (:new.kurzbez, :new.name, :new.umsatz);
    else
    update datentab
    set umsatz = umsatz + :new.umsatz
    where kurzbez = :new.kurzbez;
    end if;
    close cdaten;
    end ;

    /

    -- und siehe da, der insert wird unter umständen zum update

    insert into daten values ('c', 'no name', 3000);

    insert into daten values ('d', 'delta', 3000);

    commit;

    select * from daten;

    </pre>

    nach diesem muster sollten sich deine probleme mit minimalem impact auf deine applikation lösen lassen.

    gruß volke

    Comment

    Working...
    X