m@rc-lenzin

Wenn etwas schief geht, dann freu dich. Das sind die Geschichten die dir in Erinnerung bleiben werden

oracle – Status (number) entschlüsseln

Da es manchmal schwierig ist, alle Nummern und die dahinter steckenden Definitionen zu kennen, gibt es alternativen. Für mich sind dies TRIGGER (eher selten und nur bei kleineren Tabellen oder wenn der Status auch durch die Applikation genutzt wird) und VIEW:

-- create table and trigger
    create table lem_test_513 
        (
        e_id        number(11)    unique,
        status      number(11)    default 0     not null,
        state_desc  varchar2(100) default 'NEU' not null
        );

    create or replace trigger tri_lem_test_513 
    before insert or update on lem_test_513
    for each row
    begin
      if    :new.status=0 then :new.state_desc:='NEW';
      elsif :new.status=1 then :new.state_desc:='WARTEN';
      elsif :new.status=2 then :new.state_desc:='IN ARBEIT';
      elsif :new.status=9 then :new.state_desc:='ABGESCHLOSSEN';
      else                     :new.state_desc:='('||:new.status||') Unknown';
      end if;
    end;
    /

    truncate table lem_test_513;

-- insert demo-row
    insert into lem_test_513 (e_id) values (111);
    insert into lem_test_513 (e_id) values (222);
    insert into lem_test_513 (e_id) values (333);

    select * from lem_test_513;
    --E_ID STATUS STATE_DESC
    --111	    0        NEW
    --222	    0        NEW
    --333	    0        NEW

-- try update these row
    update lem_test_513 set status = 1 where e_id = 111;

    select * from lem_test_513;
    --E_ID STATUS STATE_DESC
    --111       1     WARTEN
    --222	    0	     NEW
    --333	    0	     NEW

    update lem_test_513 set status = 2 where e_id = 111;
    update lem_test_513 set status = 2 where e_id = 222;

    select * from lem_test_513;
    --E_ID STATUS STATE_DESC
    --111       2  IN ARBEIT
    --222	    2  IN ARBEIT
    --333	    0        NEW

    update lem_test_513 set status = 3 where e_id = 333;

    select * from lem_test_513;
    --E_ID STATUS STATE_DESC
    --111	    2  IN ARBEIT
    --222	    2  IN ARBEIT
    --333	    3  (3) Unknown

    update lem_test_513 set status = 9 where e_id = 111;

    select * from lem_test_513;
    --E_ID STATUS STATE_DESC
    --111       9 ABGESCHLOSSEN
    --222	    2     IN ARBEIT
    --333	    3   (3) Unknown


-- alternativ view
    create or replace view v_lem_test_513
    as 
    select  e_id,
            status,
            case 
              when status = 0 then 'NEW'
              when status = 1 then 'WARTEN'
              when status = 2 then 'IN ARBEIT'
              when status = 9 then 'ABGESCHLOSSEN'
              else '('||status||') Unknown'
            end state_desc
      from  lem_test_513;
    
    select * From v_lem_test_513;

Weiter Beitrag

Zurück Beitrag

© 2025 m@rc-lenzin

Thema von Anders Norén