sql >> Databasteknik >  >> RDS >> Oracle

markören i en utlösare

På grund av slingan (som saknar en exit-klausul - förhoppningsvis har du precis tappat bort att översätta detta till en fråga) kommer du att försöka infoga en post i pstn_matrix för varje spela in markörreturerna, om det finns några matchande :new.person_id eller inte; och om det finns matchning kommer du också att göra update . Vilket förmodligen inte är vad du vill, och du kan bland annat få en överträdelse av begränsningen. Du ställer inte heller in ditt räknarfält - om det inte är nullbart kommer det att felas. Men du har inte sagt vilka fel, om några, du får.

Om du måste göra detta genom en trigger kan du antingen kontrollera om det finns en rad för den nya personen överhuvudtaget:

DECLARE
  v_temp postn_matrix.person_id%TYPE;
BEGIN
  IF INSERTING THEN
    select max(person_id) into v_temp
    from postn_matrix
    where person_id = :new.person_id;

    if v_temp is null then
      -- no record found, so insert one
      insert into postn_matrix (person_id, position_count)
      values (:new.person_id, 1);
    else
      -- record exists, so update
      update postn_matrix ...
    end if;
  ...

... eller använd merge .

Men jag gillar inte den här modellen, och du skapar risken för dataavvikelser med samtidiga modifieringar av bastabellen. Att försöka behålla en sådan här räkning är inte nödvändigtvis så enkelt som det verkar.

Jag föredrar vanligtvis att göra det här till en vy som alltid kommer att vara uppdaterad och som inte behöver triggern som komplicerar saker:

create view postn_matrix as
  select person_id, count(*)
  from basetable
  group by person_id;

Naturligtvis kan jag misstolka eller överförenkla vad din bastabell gör och vad du behöver postn_matrix för. Det verkar lite trivialt att ha ens som utsikt. Om du har en separat person och person_position tabeller, säg, då kan du lägga till en yttre sammanfogning för att se personer utan positioner:

create view postn_matrix as
  select p.person_id, count(pp.position_id)
  from person p
  left join person_position pp on pp.person_id = p.person_id
  group by p.person_id;



  1. openrowset för excel:kan vi hoppa över flera rader?

  2. Hur övervakar jag min MySQL-replikeringsserver?

  3. Hur man synkroniserar utvecklings- och produktionsdatabas

  4. Förstå Big Data Analytics